Computer Science
탄탄한 기반 실력을 위한
전공과 이론 지식 모음
Today I Learned!
배웠으면 기록을 해야지
TIL 사진
Flutter 사진
Flutter로 모바일까지
거꾸로캠퍼스 코딩랩 Flutter 앱개발 강사
스파르타코딩클럽 즉문즉답 튜터
카카오테크캠퍼스 3기 학습코치
프로필 사진
박성민
임베디드 세계에
발을 들인 박치기 공룡
임베디드 사진
EMBEDDED SYSTEM
임베디드 SW와 HW, 이론부터 실전까지
ALGORITHM
알고리즘 해결 전략 기록
🎓
중앙대학교 소프트웨어학부
텔레칩스 차량용 임베디드 스쿨 3기
애플 개발자 아카데미 1기
깃허브 사진
GitHub
프로젝트 모아보기
Instagram
인스타그램 사진

Develop/iOS 개발

[Swift 기본 문법] Swift를 처음봤을 때 낯선 문법들

sm_amoled 2019. 7. 29. 12:00

[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/

ㄴ 옵셔널에 대한 설명이 깔끔해요!

320x100