View
[Swift 기본 문법] Swift를 처음보면서 낯설었던 문법들을 찾아보았다
확실히 C, C#, Java 같은 언어만 보다가 Swift라는 언어를 접했을 때 이게 무슨의미지? 왜 이런 문법을 쓰지? 같은 생각부터 C#, Java 같은 언어에서 보지 못했던 선언방법이나 키워드를 보면서 Swift 문법을 한번 정리를 해둘 필요가 있다고 느꼈습니다. 다른 강의나 교재의 코드를 베끼면서 공부를 한다해도, 그 의미가 뭔지 알고 읽으면 머리에 남아있겠지만 의미를 모른 채 작동하기만 바라면서 코드를 베끼면 남는건 Xcode의 생김새밖에 없을 것 같더라구요. ㅋㅋㅋ 그래서 남의 코드를 읽으면서 무슨 뜻인지만 파악할 수 있을 정도로 Swift 문법을 정리를 해보려 합니다. 물론 Deep한 영역까지 가는게 아니라 원래 알고있던 C#, Java와 다른 것들중에서 어색한 내용들을 뽑아와보려고 해요. 물론 제가 공부하려고 글을 작성하는 중이지만, 이 글을 읽는 분한테도 도움이 갔으면 좋겠네요!
이름 짓기
- 소문자 카멜케이스 (Lower Camel Case) - 함수, 메서드, 인스턴스 등
- 대문자 카멜케이스 (Upper Camel Case) - 클래스, 구조체, 프로토콜, 열거형 등
여기서 카멜케이스는 단어가 여러개인 경우 첫글자만 대문자로 작성하고, 나머지는 소문자로 작성해서 띄어쓰기 없이 이어붙이는 방법을 말하는것 입니다.
ThisIsUpperCamelCase & thisIsLowerCamelCase
참고로, 별 쓸일은 없을것 같지만 알파벳뿐만 아니라 Unicode에 포함된 문자들도 이름을 지을 때 인식합니다! 막상 다른 문자를 넣으면 어색해서 불편할 것 같긴 하네요.
세미콜론은 옵션!
Swift문법에서 세미콜론( ; )을 붙이는건 선택사항입니다. (파이썬은 대신 들여쓰기로 구분을 하지만 Swift는 괄호가 있죠! 개꿀) 그러나 구글링을 해보니 Objective-C와 왔다갔다를 할 때 세미콜론이 없으면 에러가 발생하기 때문에, ObjC와의 연결을 필요로 한다면 세미콜론을 붙여주어야 한다고 합니다. 또는, 코딩습관이나 들여쓰기(indent)의 편의를 위해 붙여주는 경우도 있다고 합니다.
문자열 출력
print(" 문자열 ")
또는 print(string)
를 통해 출력할 수 있습니다. 이렇게 출력하면 Xcode 하단의 Console 창에서 출력된 결과를 확인할 수 있습니다.
변수와 상수 선언
변수는 기본적으로 var 변수명 : 데이터타입 = 값
의 형식으로 선언할 수 있습니다. 그러나 var 변수명 = 값
으로 코드를 작성해도 Swift의 컴파일러는 알아서 데이터타입를 판단하여 변수의 데이터타입을 지정합니다. (매우 편리해보이네요 ㅋㅋ) 하지만 var 변수명; 변수명 = 값
처럼 선언과 값 대입이 분리되어있는 경우에는 오류가 발생하므로 var 변수명 : 데이터타입; 변수명 = 값
처럼 분리시에는 데이터타입에 대한 명시를 해주어야 합니다.
상수는 let 변수명 : 데이터타입 = 값
의 형식으로 선언할 수 있습니다.
Swift는 이름이 직관적이여서 좋네요. ㅋㅋㅋ var는 변수, let은 상수!
함수 선언
Swift를 처음 볼 때 함수의 모습이 제일 낯설었던걸로 기억해요. 물론 복잡한 함수를 보면 지금도 되게 낯설어요 ㅋㅋㅋㅋ
Swift는 func
라는 키워드를 이용해 함수를 정의합니다.
func 함수명 (매개변수, ~ ) -> 반환형 { 명령어 ; return 반환값 }
가 함수 선언의 기본 형식입니다.
func 함수명 (매개변수명 전달인자레이블:매개변수타입, ~ ) -> 반환형 { 명령어 ; return 반환값 }
의 형식을 띄기도 합니다.
후자의 경우 매개변수에 특별한 이름을 붙여서, 함수 사용시에 더 잘 알아볼 수 있도록 하는 역할을 합니다. 매개변수나 반환이 필요 없는 경우 생략이 가능합니다.
이렇게 newValue, oldValue가 함수를 사용할 때 어떤 값을 인자로 전달해야하는지에 대해 가이드를 제시하면서 작성하기도 편하고, 읽기도 편한 코드를 만들어줍니다. ( 이건 진짜 좋은거같아요... 다 작성하고 코드리뷰하면서 이게 뭘 연결한건지 헷갈리거나 라이브러리에서 가져온 함수들 인자 채울때 계속 비교하면서 했었는데 Swift에서는 읽어보면 다 나오니 편하네요 ㅋㅋㅋ )
IF의 조건문
if의 조건문에는 항상 Boolean 값이 들어가야 합니다. 0이 아닌 값은 모두 참이였던 C와 달리 여기서는 Bool값만 받아들인다고 하네요. 유의해야겠습니다. 또, 조건문을 작성할 때 괄호를 붙이지 않아도 돼요. if 조건문 { }
으로 작성해주면 됩니다.
Switch문
Switch의 조건문에 괄호를 달지 않아도 상관이 없습니다. 또, 각 Case마다 break가 자동 장착되어있습니다. (이건 정말 좋은것같아요 ㅋㅋ) 또, 한 case에 여러 조건을 통해 들어올 수도 있습니다.
switch keyFromKBD {
case A :
~ execute ~
case B, C :
~ execute ~
default :
~ execute ~
}
옵셔널 ( ? )
처음에는 이 옵셔널이 무슨 의미인지 잘 몰랐는데 찾아보니까 크게 어려운 의미는 아니네요! 오히려 C#이나 Java를 다루면서 여러번 에러가 터졌던 부분이 이 문법을 통해서 잡아낼 수 있을 것 같다는 생각이 들어요. 찾아보니, Objective-C와의 호환성을 위해 nil
을 계속 쓰면서 옵셔널이라는게 생긴 듯 하네요.
먼저 아무 값도 없는 상태를 Swift에서는 nil
이라고 부릅니다. Null과 비슷한 의미라고 보면 될 것 같아요. 기본적으로 변수에는 이 nil
값이 들어갈 수 없는 상태예요. 정수 + 정수를 계산하기 위해 변수끼리 더했는데, 하나의 값이 nil
이라면 오류가 발생하니, 이런 경우를 방지하기 위해 이런 기능을 만들어둔 것 같아요. 이 상태를 non-optional 이라고 합니다. 그럼 반대로 optional 인 변수는 nil
값이 들어갈 수 있는 변수를 말합니다. 개발자가 여기는 비어있을 수 있다고 명시하는 거죠.
var variable : Int?
처럼 옵셔널 (?)을 붙여주어서 optional 변수로 만들어줄 수 있습니다.
옵셔널과 관련된 기능이 3개정도 있는데 이를 살펴봅시다.
1. 옵셔널 언래핑 ( optional unwrapping )
만약 개발자가 optional로 선언된 변수에 nil
이 아니라 값이 분명히 들어있다고 확신한다면, unwrapping 키워드인 !
를 통해 값을 꺼낼 수 있습니다. 그러면 var sum = variable! + variable!
처럼 옵셔널로 선언된 변수라도 연산에 사용할 수 있는거죠. 대신 !
을 썼는데도 불구하고 nil
이 들어있었다면 에러를 일으키므로 주의가 필요합니다. ( 앞에 nil인지 검사 후 사용해도 ㄱㅊ할 듯! )
2. 옵셔널 바인딩 ( optional binding )
!
을 사용하지 않고 새로운 상수를 선언한 뒤 상수에 옵셔널 변수의 값을 넣어보고, nil
이 아니면 연산에 사용하는 방식입니다.
if let nonOptionalVariable = OptionalVariable { 연산 }
의 방식으로 사용합니다.
3. 옵셔널 체이닝 ( optional chaining )
옵셔널 언래핑은 실행 했을때 값이 없으면 에러가 발생하지만, 체이닝은 런타임 에러 대신 nil
값을 반환하는 특징이 있습니다. 따라서 체이닝의 결과는 항상 옵셔널 값이 됩니다.
class Coffee {
var caffeine : Caffeine?
}
class Caffeine {
var amountOfCaffeine : Int? = 60
}
위의 커피 예시를 들어보면, 커피가 디카페인 커피라면 카페인이 없을 수도 있으니까 ( 좀 억지인가요 ㅋㅋㅋ ) 옵셔널이라고 봅시다. 그럼 커피의 instance인 coffee
가 있다 할때, coffee.caffeine!.amountOfCaffeine
으로 값에 접근한다면 런타임 에러가 발생할 수 있습니다. 이를 피하기 위해서 coffee.caffeine?.amountOfCaffeine
으로 값에 접근을 하면 값이 없으면 nil
값을 가져올 수 있어 if문 등으로 분기하여 다르게 처리할 수 있습니다. 위 방법으로 caffeine, amountOfCaffeine 두 변수 모두의 옵셔널 바인딩을 처리할 수 있어 덜 번거로워 보이기도 하네요.
확실히 적으면서 자료를 찾아보니, 정리가 좀 되는 것 같네요. 특히 함수와 옵셔널 부분이 이해가 잘 안됐었는데, 해소가 어느정도 돼서 다시 코드를 읽을 수 있을 것 같아요. 기본적인 것만 가져가려고 일부러 더 어려워보이는 건 뺐어요. 필요하면 또 작성하게 되겠네요. ㅋㅋㅋㅋㅋ
만약 위에 이해가 잘 안되거나 하는 부분이 있으면 아래에 달아둔 링크나 구글에 검색해서 읽어보세요! 아니면 댓글로 달아주시면 저도 같이 공부해볼게용!!
참고자료
http://tech.inswave.com/2018/04/02/Swift/
ㄴ 이분이 작성하신 게시글이 항목별로 정리가 정말 잘 되어있어요! 한번 확인해보시길 바랍니다.
http://seorenn.blogspot.com/2014/06/swift-function.html
ㄴ 함수형태에 대해 깔끔히 분류되어 정리되어 있습니다.
http://monibu1548.github.io/2018/05/12/swift-optional/
ㄴ 옵셔널에 대한 설명이 깔끔해요!
'Develop > iOS 개발' 카테고리의 다른 글
[iOS 앱 개발] Human Interface Guideline - App Architecture (2) (0) | 2019.07.31 |
---|---|
[iOS 앱 개발] Human Interface Guideline - App Architecture (1) (1) | 2019.07.30 |
[Swift 개념] AVAudioPlayer 클래스 - 음악 재생과 제어 (0) | 2019.07.28 |
[Swift 기초 개념] View, Window (7) | 2019.07.25 |
[Swift 기초 개념] 코코아 프레임워크, 코코아 터치, 코코아 팟이란? (2) | 2019.07.20 |