안녕하세여 소드립니다 🌼
맨날 글자티콘 썼는데 이모지로 발전함 ㅎㅎ
쨌든
지금껏 좀 무거운 내용?의 포스팅을 다뤘다면
당분간은 Swift 포스팅을 하며
전환을 해보고자 합니다~~~
첫 포스팅의 내용은 바로
타입 추론(Type Inference) vs 타입 어노테이션(Type Annotation)
입니다!!
뭔가 말은 어려워 보이지만
여러분이 Swift 변수를 선언할 떄 자연스럽게 사용하던 것들임
맞다 앞으로 스위프트 포스팅을 할 땐
반말로 하겠으니 이해해주삼~~~
1. Swift의 변수(상수) 선언
개요를 하기 위해 기본부터 볼 것임!
스위프트는
let - 상수
var - 변수
이 두가지 키워드를 이용해 지금까지 상수나 변수를 선언할 수 있었음
머 이런 식으로
상수면 let , 변수면 var 키워드를 쓰고 옆에 이름을 붙여주는 식임
물론 저렇게만 쓰면 오류남
무슨 오류냐면
대충 타입 어노테이션이 누락됐단 말임
지금까지 C나 Objective-C나 뭐 기타 좀 오래된 언어들의 선언 방식은
다음과 같이
먼저 자료형(NSString, NSInteger)을 선언해줬단 말임
따라서 컴파일러는
name과 age 각각의 자료형에 맞는 메모리를 할당했을 것임
근데 Swift 같은 경우엔 let, var로 시작하긴 하지만,
컴파일러가 마법사도 아니고
이렇게만 쓸 경우
컴파일러는 이 변수(상수)가 어떤 자료형인 줄 도대체 알 수 없음
따라서 당연하게도
Swift도 변수(상수)를 선언할 땐 컴파일러가 알 수 있게 Type을 명시해줘야함
근데 이 자료형을 명시하는 방법에 2가지가 있음
그것이 바로 이번에 공부할 것들임
2. 타입 추론 (Type Inference)
타입 추론은 다음과 같은 것임
위와 같이
선언과 동시에 초기화
를 해주는 것임
이 방법은 추론이란 말 그대로
컴파일러가 초기화된 값("soeun")을 보고 타입을 추론하는 것임
"soeun"은 String 값이니
컴파일러는 알아서 이 값이 String이겠구나 하고
추론한 값으로 타입을 지정해버림
이렇게 말이지
이렇게 쓰면 장점이 뭐냐면
간단하다!!!
직접 타입을 명시(다음에 배울 Type Annotation) 해주지 않아도 되고,
또 애플 말론
Swift 언어 특성 중 하나인 "설계에 의한 안정성" 항목이
타입 추론에 해당된다고 하는데
사실 아직 와닿진 않아서ㅠ 더 와닿을 때 수정 하겠음
쨌든 이렇게 간편해 보이고 실제로 자주 쓰는 타입 추론에도 문제 점이 몇 가지 있으니
ⓛ 원하는 타입으로 추론되지 않는 경우
타입 추론 기능이 내가 원하는 대로 되지 않을 수가 있음
내가 만약 17.0 이라는 값을 num 이란 상수에 넣고 싶음
이때 자료형은 Float으로 할 것임
근데 타입 추론을 통해 다음과 같이 선언하면
num의 자료형은 Float이 아닌
Double 형으로 잡힘
같은 예로 Character & String이 있음
Swift에선 Character나 String 값이나 모두 "" 를 이용해서 대입함
나는 name이라는 값에 "A"라는 Character 값을 넣고 싶지만,
name의 자료형은 Character가 아닌
String으로 잡힘
컴파일러가 초기값을 보고 알아서 자료형을 유추할 때
Character냐 String이냐 같이 애매해버릴 경우
그냥 자료형을 더 큰 범위의 자료형으로 지정해버림
(Float -> Double, Character -> String)
떄문에 내가 원하는 타입으로 100프로 지정이 안 될 수가 있음
② 초기값이 없는 경우
타입 추론은 무조건 선언과 동시에 초기화를 진행하여
컴파일러가 초기값을 보고 자료형을 유추하는 것이었음
근데 어떻게 늘 초기값이 존재하겠어
네트워크와 통신하는 경우엔 서버로 데이터를 받기 전까진 값을 알 수 없을텐데!?
쨌든 타입 추론을 사용할 때
만약 초기값이 없는 경우 타입을 유추할 수 없기 때문에
문제가 됨
.
.
만약 타입 추론을 쓰다가 이처럼 문제점이 발생했을 때는
다음에 배울 Type Annotation 을 사용해야 함
3. 타입 어노테이션 (Type Annotation)
타입 어노테이션은 다음과 같은 것임
위와 같이
직접 자료형을 지정
해 주는 것임
이때 자료형을 지정할 땐
이런 식으로 :을 쓰고 뒤에 자료형을 명시하는 방법임
:뒤에 한 칸띄우는건 안띄워도 되는데
가독성을 위해 띄우느편임
이 방법을 사용할 경우
당연히
초기값이 없어도 됨
왜냐면 친절하게도 타입을 알려줬으니
초기값을 통해 타입을 유추할 필요가 없으니까
Annotation 뜻이 주석이잖슴?
말 그대로 자료형을 주석처럼 달아준다 생각하면 됨
장점이라 하면
타입 추론 문제점의 반대임
타입 추론으로 원하는 자료형을 얻지 못 할경우 사용할 수 있음
초기 값이 없을 경우 사용할 수 있음
그리고 추가적으로
타입 추론은 컴파일러가 타입을 추론하는 과정에서
타입 어노테이션보다 시간이 조금 더 걸림
근데 뭐.. 우리가 눈치채지 못할 미세한 시간이겠지만
덩치가 엄청 큰 프로젝트 같은 경우엔
꽤 차이가 발생할 수도 👽
쩄든 타입 어노테이션과
아까 타입 추론으로 얻지 못한 Float과 비교해보면
타입 어노테이션으로 설정한 경우 Float을 얻을 수 있음!
문제점은 딱ㅎ ㅣ없지만
타입 추론보다 성가시다..?
4. 정리
타입 추론 (Type Inference) | 타입 어노테이션 (Type Annotation) | |
선언 | ![]() |
![]() |
특징 | 초기값을 지정 | 자료형을 지정 |
문제점 | ① 원하는 타입이 추론되지 않을 수 있다 (Float -> Double, Character -> String) ② 초기 값이 없을 경우 사용할 수 없다 위 두 가지 문제점 발생 시 타입 어노테이션 사용 |
'iOS > Swift' 카테고리의 다른 글
Swift) Optional 부수기 (4) Optional Unwrapping - IUO (옵셔널 묵시적 추출) (5) | 2020.08.03 |
---|---|
Swift) COW (Copy-on-Write) (8) | 2020.07.31 |
Swift) Optional 부수기 (3) Optional Unwrapping - 옵셔널 바인딩(if let vs guard let) (18) | 2020.07.28 |
Swift) Optional 부수기 (2) Optional Unwrapping - 강제 추출(Forced Unwrapping ) (6) | 2020.07.14 |
Swift) Optional 부수기 (1) Optional 정의 , nil , Non-Optional Type vs Optional Type (18) | 2020.07.12 |