Prototype Ghost
귀신일지
Prototype Ghost
전체 방문자
오늘
어제
  • 분류 전체보기 (29)
    • Hacking (1)
      • CTF (0)
      • Wargame (0)
      • Review (1)
    • C (12)
      • Crypto (12)
    • C++ (4)
    • Python (1)
    • Swift (1)
    • Blockchain (9)
      • Solidity (9)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • C
  • 리눅스
  • 블록체인
  • openssl
  • 암호화폐
  • C++
  • 정보보안
  • solidity
  • c언어
  • 암호화
  • Bitcoin
  • 프로그래밍
  • 접근제어
  • 비트코인
  • 복호화
  • Blockchain
  • 보안
  • ethereum
  • 이더리움
  • 솔리디티

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Prototype Ghost

귀신일지

Swift 첫번째, 변수와 상수 그리고 옵셔널(Optional)
Swift

Swift 첫번째, 변수와 상수 그리고 옵셔널(Optional)

2022. 2. 1. 03:18

안녕하세요 귀신입니다.

오늘부터 제이펍 출판사의 "SwiftUI 기반의 iOS 프로그래밍" 이란 책을 공부하면서 블로그 포스팅을 해보려 합니다. 

사실 빨리빨리 글을 올려보고 싶었는데... Swift를 공부하면서 정말 당황했습니다.

이 책은 Swift언어 자체에 집중하기 보다는 SwiftUI 프레임워크를 사용하는 게 본 목적입니다.

따라서 언어 자체에 대한 설명이 초반부에 다뤄주기는 하지만 그 설명은 다소 부족하긴 합니다.

아무리 그래도 어떤 언어를 처음 학습하는 것에 있어 잘 이해하고 술술 넘어갔었던거 같은데..

스위프트는 조금 달랐습니다... 처음부터 저를 몹시 당황시켰고 이해하는데 꽤 시간이 걸렸습니다.

그것이 어떤 개념인지는 이 글 후반부에 다뤄보겠습니다.

서론이 길었습니다. 그럼 시작해봅시다!

 

1. 변수


 

swift 변수 선언 키워드는 var
결과

Swift에서 기본적으로 변수는 var키워드로 선언한다. 위의 코드는 가장 기본적으로 변수를 사용하는 예시를 보여준다. 

스위프트는 자료형을 명시하지 않으면 자동으로 자료형을 배정한다.

즉 현재 a에 초깃값을 정수형 10으로 설정하였으므로 a는 자동으로 int형으로 인식된다. 

여기서 중요한 사실은 스위프트는 자료형이 한번 정해지면 다른 자료형을 대입할 수 없다.

한번 int는 영원한 int 한번 문자열은 영원한 문자열이다.

다음 코드를 보자

먼저 스위프트에서 변수의 자료형을 수동으로 설정할 수 있다. 변수 a를 보면 데이터 타입을 초기에 Int로 설정하였다. 

즉 지금부터 a에는 Int형만 대입할 수 있다. 코드를 보면 a에 10과 20을 대입해도 에러가 뜨지 않는다. 

정수형으로 선언된 변수 a에 정수형 데이터 10과 20이 들어갔으니 정상 작동하는게 당연하다.

 

반면 변수 b를 보자. 딱히 자료형을 설정하지 않고 바로 10을 대입하였다.

이 때 위에 설명했듯 변수 b의 자료형은 자동으로 정수로 설정된다. 

또한 이제 변수 b는 한번 정수형으로 설정되었으므로 더 이상 다른 자료형의 대입은 불가능하다.

따라서 8번 라인에 "String" 이라는 문자열을 대입한 순간 데이터 타입이 맞지않아 오류가 발생하게 된다.

정리해보면

 

Swift에서 변수의 데이터 타입은 직접 기술할 수 있으며 따로 정하지 않아도 초깃값으로 준 데이터의 타입을 따라간다.

이 때 한 번 정해진 변수의 데이터 타입은 바뀌지 않는다.

 

변수를 확인해봤으니 이제 상수를 확인해보자

 

2. 상수


상수는 기본적으로 값 자체의 변화를 허용하지 않는다. 변수는 변할 수 있지만 상수는 변하지 않는다.

간단하게 c언어에서 변수에 const 키워드를 붙인것과 거의 같다.

스위프트에서는 간단히 let이라는 키워드로 상수를 선언할 수 있다.

 

위의 코드를 보면 상수 a를 선언한 수 10을 대입하였다. 상수도 변수와 같이 데이터 타입을 직접 기술하거나 위의 코드처럼

정수 10을 입력하면 자동으로 정수 타입으로 설정된다.

이 때 상수 a에 라인 4처럼 20이라는 같은 정수형 데이터를 대입하면 오류가 발생한다.

상수는 절대 한번 대입된 값을 다른 값으로 바꿀 수 없기 때문이다.

 

이렇게 간단히 스위프트에서 변수와 상수를 선언하는 방법에 대해서 알아보았다.

이제 내가 그렇게 이해하기 힘들었던 옵셔널에 대해서 살펴보자

 

3. 옵셔널


처음 스위프트를 시작하면 간단한 내용을 빨리빨리 업로드하면서 책을 쭉쭉 읽으려고 했다.

그러나 시작부터 이 옵셔널이라는 녀석이 나의 발목을 잡았다.

 

옵셔널(Optional)의 뜻은 직역하면 "선택적인" 이라는 뜻이다.

왜 선택적인이냐면 옵셔널 타입의 변수는 값이 있을 수도 있고 없을 수도 있다.

이게 무슨 말이냐면 스위프트에서 일반적인 변수나 상수는 값이 없는 상태로 사용될 수 없다.

스위프트에서는 다른 언어에서의 NULL처럼 값이 없다는 의미로 nil을 사용한다.

이 때 이 nil은 무조건 옵셔널 타입의 변수에만 사용될 수 있다.

 

정리해서 말해보면 일반적으로 선언된 변수에는 nil이라는 값 자체를 대입할 수 없다.

swift는 일반 변수에 값이 없는 상태 자체를 허용하지 않는다.

처음 var a: Int 라고 값을 주지 않고 변수를 선언한다 해도

이 후 이 a라는 값을 사용하려면 무조건 한 번 이상 데이터를 대입해야 한다.

즉 초기화되지 않은 변수의 사용을 절대 금지한다.

다시 한 번 말하지만 일반 변수는 값이 없는 것 자체를 허용하지 않기 때문에 nil이라는 값도 들어갈 수 없다.

 

그러나 옵셔널 타입의 변수는 다르다.

최대한 말로 풀어 설명해서 조금 어렵지만 코드를 보면 이해가 될것이다.

그럼 코드를 보자

옵셔널 변수와 일반 변수의 차이

보통 옵셔널 변수는 타입 어노테이션 옆에 ?기호를 통해 선언할 수 있다.

위의 코드에서 a는 ?를 사용하여 옵셔널로 선언하였고 b는 일반 변수로 선언하였다.

여기서 var a: Int? 의미를 이해해보자. a는 우선 Int자료형을 담을 수 있는 변수이면서 ? 를 통해 옵셔널 변수임을 의미한다.

다시말해 변수 a에는 정수형 데이터가 있을 수도 있고 값의 부재를 뜻하는 nil이 들어갈 수도 있다는 말이다.

라인 4, 5를 보면 a에 10과 nil을 대입했을 때 오류없이 잘 돌아가는 것을 볼 수 있다.

참고로 초기값없이 선언만 되어있는 옵셔널 변수의 경우 기본적으로 nil로 값이 세팅된다.

 

그렇다면 일반 변수 b를 보자. 일반 변수는 사용 전 무조건 값이 한번은 대입되어야 한다. 값이 없는 상태에서 사용할 수 없다.

그와 동시에 값이 없음을 나타내는 nil또한 사용할 수 없다.

라인 9를 보면 옵셔널 변수 a와는 다르게 nil을 대입했을 때 오류가 나는 것을 볼 수 있다.

 

다음으로 알아볼 것은 옵셔널 변수의 사용이다.

옵셔널에 값이 할당되면 그 값을 래핑되었다(wrapped) 라고 표현한다. 즉 감싸졌다는 건데

옵셔널 변수의 값은 직접적으로 바로 사용하면 에러가 난다.

코드를 보자.

값이 래핑되어 있어 이를 직접적으로 값을 사용하려하면 에러 문구가 나오는 것을 볼 수 있다.

직접적으로 값에 접근하기 위해서 스위프트는 강제 언래핑이라는 기능을 지원한다.

강제 언래핑은 변수뒤에 !를 붙이면 된다.

코드를 보자.

a에 !를 붙이자 에러 문구가 사라지고 정상 작동한다. 강제언래핑을 통해 래핑되었던 값을 끄집어냈기 때문이다.

그러나 "강제"라는 말을 되새겨보자. 굉장히 위험한 느낌이든다.

강제 언래핑은 사용을 자제해야 하는 이유가 있다. 옵셔널 변수의 값이 nil일 경우 강제 언래핑을 사용하면

치명적이 오류가 발생한다. 라인 7, 8을 보면 a에 nil을 대입하고 이를 강제 언래핑하였다.

바로 에러가 발생한다.

즉 강제언래핑은 옵셔널 변수 값이 nil일 경우 에러를 불러일으키며

따라서 변수의 값이 확실히 있다고 생각될 때만 사용해야 한다.

 

스위프트에는 강제 언래핑말고도 옵셔널 바인딩이라는 옵셔널 변수에 접근하는 방법을 제시한다.

옵셔널 바인딩이란 옵셔널 변수를 임시 변수나 상수에 할당하여 사용하는 것을 말한다.

코드를 보면 이해가 쉬울 것이다.

결과로 10이 출력된다.

위 코드는 옵셔널 바인딩을 사용한 예시이다.

!를 이용한 강제언래핑을 굳이 사용하지 않고 if 문에 임시 상수 test에 a를 할당한다.

이 때 단순히 값만 할당하는 것이 아니다.

라인 6의 조건문을 보면 test = a에서 추가적으로 a가 nil인지 아니면 값이 있는지를 자동으로 체크한다.

즉 만약 a가 nil이었다면 위의 조건문은 실행되지 않았을 것이다.

즉 자동으로 nil체크를 하여 값이 있으면 대입하고 값이 nil이면 조건이 거짓이 되어 실행되지 않는다.

다음 예시를 보자.

결과로 nil이 출력된다.

옵셔널 변수에 따로 값을 할당하지 않으면 자동으로 nil로 세팅된다고 했다. 즉 변수 a는 현재 nil이다.

라인 5에서 위에서 설명했듯 nil체크를 하게된다. 이 때 변수 a가 nil이므로 조건이 거짓이되어 else문이 실행되게 된다.

즉 결과로 nil이 출력된다.

위와 같은 개념이 옵셔널 바인딩이다.

 

이렇게 보면 옵셔널 자체가 그렇게 어렵게 느껴지진 않을 수 있다.

그러나 내가 헤맸던 것은 도대체 왜 이 옵셔널을 사용하는가였다.

스위프트를 처음 접해본 것도 있고 책에서는 옵셔널을 사용하는 이유를 기술하지 않아

왜 이 기능이 있는지 이해하기 힘들었다.

그래서 구글링을 하던 도중 남제이님이라는 분의 블로그 포스팅을 보고 어느정도 이해하게 되었다.

 

가장 큰 체감이 됐던 것은 바로 nil의 가능성이다.

옵셔널 변수를 제외한 다른 변수는 무조건 값이 있어야 하며 nil값이 있을 수 없다.

즉 프로그래머는 일반적인 변수에 대해서는 값이 없을거라는 걱정을 할 필요가 없어진다.

이는 다른 언어에서 귀찮게 여겨졌던 null체크를 하는 일련의 과정들을 제거해주고

안전성을 확보해준다고 생각한다.

그렇다고 안전성만을 따져 모든 변수가 값이 있어야만 한다면 이는 매우 큰 제약일 것이다.

즉 옵셔널은 값이 없을수도 있다는 것을 그 자체로 보여줄 수 있기때문에

쓸데없는 커뮤니케이션, 주석처리 또한 줄일 수 있게 해준다.

 

마무리


지금까지 스위프트에서 변수와 상수, 옵셔널에 대해서 알아보았습니다.

옵셔널을 사용하는 이유에 대해서는 앞으로 공부하면서 더 알아가고 체감하게 될 것 같습니다.

처음으로 제대로 블로그를 써보려하니 많이 부족하고 어렵지만 앞으로 열심히해보려고 합니다.

보다 발전된 모습으로 찾아오도록 하겠습니다. 긴 글 읽어주셔서 감사합니다.

 

 

참고자료


https://zeddios.tistory.com/16

 

swift3 ) Optional 개념 정리

안녕하세요 :) 오늘은 Optional이 뭔지에 대해 정리해볼려고해요. 이것도 yagom님이 BoostCamp강의에서 설명을 엄청 잘해주셨답니다 :) yagom님 강의를 토대로 추가할 부분은 추가해가면서 정리해볼게요

zeddios.tistory.com

https://jaynamm.tistory.com/entry/Swift-10-%EC%98%B5%EC%85%94%EB%84%90-Optional

 

[Swift] 10. 옵셔널 (Optional)

스위프트에서의 핵심 개념이라고 하는 옵셔널에 대해서 공부해보았다. 다른 프로그래밍 언어에서는 찾아볼 수 없는 개념이기 때문에 다소 생소했다. 정확히 이해하고 다루는 데까지 시간이 좀

jaynamm.tistory.com

 

핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍(제이펍 출판사)

 

핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍 - YES24

SwiftUI는 물론 애플리케이션 개발과 출시를 위한 모든 과정을 담았다!이 책의 목적은 SwiftUI와 Xcode 11, 그리고 스위프트 5 프로그래밍 언어를 사용하여 iOS 13 애플리케이션 제작 기술을 전달하는 데

www.yes24.com

 

728x90
반응형
    Prototype Ghost
    Prototype Ghost

    티스토리툴바