본문 바로가기
Swift

스위프트 101 - 소개

by HaningYa 2020. 3. 25.
728x90

소개

 Swift 언어는 폰, 데스크탑, 서버등 코드가 실행될 수 있는 환경에서 소프트웨어를 fantastic(apple inc 의 주장입니다) 하게 개발할 수 있는 언어이다. Swift의 safe, fast, interative 한 특징들은 현대의 프로그래밍 언어들의 장점들과 오픈 소스 커뮤니티에서 비롯된 Apple의 engineering 문화와 다양성에서 비롯된 거라고 한다. 

 

스위프트는 현대의 프로그래밍 패턴에서 보여지는 공통적인 프로그래밍 에러에 대한 정의를 잘 해놓았다고 한다.

[스위프트의 에러 정의]

  • 항상 변수는 사용하기 전에 초기화 한다.
  • Array indice(배열 색인)은 항상 out-of-bounds 에러에 대해 검사된다.
  • Integers(정수) 는 항상 overflow 에러에 대해 검사된다.
  • Optionals 는 nil value 에 대한 처리를 explicity(명시적으로) 처리할 수 있도록 보장한다.
  • 메모리는 자동으로 관리된다. 
  • Error 처리는 예상치 못한 failtures에서 controlled recovery를 허용한다.

또한 스위프트 코드는 거의 대부분 현대의 하드웨어에서 컴파일되고 최적화되어있다. 

type interface 와 pattern matching을 조합하여 복잡한 생각을 clear 하고 concise 하게 표현할 수 있다.

결론 : 스위프트는 작성하기도 쉽고 이해하기도 쉽고 유지관리하기도 쉽다!

 

버전 호환성

 앞으로 볼 책은 Swfit5.1 버전을 기본으로 설명한다. (Xcode 11버전)

Xcode 11버전은 Swift5.1, Swift4.2, Swfit4.0 을 지원한다. 

Xcode11에서는 거의 대부분의 Swift5.1의 함수들을 지원한다. 하지만 5.1에서 달라진 점들이 있다.

[Swift5.1에서 달라진점]

  • 불투명 타입을 return 하는 함수는 swift5.1 런타임을 필요로 한다. 
  • try? 표현은 이미 선택적 타입을 리턴하는 함수에 추가적인 레벨의 선택적 도입을 하지 않는다..??
  • 큰 정수형의 리터럴 초기화는 맞는 정수형 타입으로 간주된다. 예를 들어 UInt64(0xffff_ffff_ffff_ffff)는 오버플로우로 간주되지 않고 맞는 표현으로 처리된다.

Swift5.1로 작성된 타겟은 Swift4.1 과 Swift 4.0으로 쓰인 것과 depend 될 수 있는데

이말은 여러개의 프래임워크로 이루어진 큰 프로잭트를 Swift4.0에서 Swift5.1로 하나씩

migrate 해야한다는 뜻이다.

 

간단한 코드 작성해보기

swift 공식 hello world 코드

C나 objective-c 언어에 경험이 있다면 swit 좀 익숙하게 느껴질 것이다. 

알수있는 특징으로는 

  • 코드가 프로그램의 전부다 --> 또 다른 라이브러리나 string의 I/O에 필요한 라이브러리를 import 할 필요가 없다.
  • 전역 스코프에 쓰인 코드가 프로그램의 entry point가 된다. --> main() 함수가 필요없다.
  • 문장의 끝마다 세미콜론이 필요없다! 

 

변수선언

  • let : 변하지 않을 value (constant)
  • var : 변하는 value (variable)

swift에서 상수의 값은 컴파일 타임에 꼭 필요한건 아니다. 그러나 정확히 한번만 값을 할당해 줘야 한다!

--> 상수를 사용하여 한 번 결정하지만 여러 곳에서 사용하는 값의 이름을 지정할 수 있다!

 

변수 선언의 특징

  • 변수에 할당될 값은 변수의 타입(자료형) 과 일치해야 한다. 그러나 항상 명시적으로 작성하지 않아도 된다.
    --> 변수에 대한 값을 지정할 때 컴파일리가 타입을 유추한다.
  • 만약 초기값이 타입(자료형)에 대한 충분한 정보가 없다면 타입을 명시적으로 작성해 주어야 한다.
    --> let explicitDouble : Double = 70 
  • 값들은 암시적으로 절대 다른 타입으로 변환되지 않는다.
    --> 타입을 변환해 주려면 명시적으로 타입을 작성해 주어야 한다.

Optionals는 뭐지

if 와 let 을 함께 사용하면 없을 수도 있는 값도 다룰 수 있는데 이런값들은 optional로 표기된다. 

optional value는 실제 값을 가지거나 nil(value is missing) 을 가진다. 표기법으로는 자료형 다음 물음표(?) 를 사용한다.

--> var optionalString: String? = "Hello"

optional 을 처리하는 방법으로는 ?? operator 가 있다. 기본 값을 제공해 줄 수 있는데 알고자 하는 값이 nil이면 안되는 상황에서 쓰인다. 

제어 흐름-조건문

  • if : 조건은 반드시 Boolean 표현이여야 한다. 0이면 참이고 그런거 없다, optional value에서 if문은 false로 처리한다. 
  • switch : 다양한 종류의 data를 지원한다. 특이한건 case 문이 실행되고 난 뒤 switch 문을 빠져나오기 때문에 명시적으로 break를 쓰지 않아도 된다!!

 

제어 흐름-반복문

  • for-in : key-value 형태의 dictionary를 iterate 할때 사용한다. iterate할때는 임의적인 순서로 진행된다.
    (Dictionary-순서없는 collection)
  • while
  • repeat-while

Functions and Closures

Function : "func"를 써서선언한다. return type은 ->를 통해 명시해 준다. 

--> func greet(person : String) -> String { return "hello\(person)"}

--> greet(person: "HaninhYa")

특이한건 기본적으로 파라미터 이름을 argument의 이름으로 쓴다. custom argument label을 쓰려면 파라미터 이름 앞에다 작성하거나 label 을 없애고 싶으면 _ 를 쓰면된다.

 

만약 여러개의 compound한 값을 다루고 싶으면 tuple 을 사용한다.

여러 값을 리턴하는 예시) func returnMultipleValue(_ score: [Int]) -> (value1: Int, value2: Int, value3: Int){}

튜플값을 접근할 때는 let example = returnMultipleValue([4,3,2,1]) 로 변수에 받은뒤 example.value1, example.value2 와 같이 찾으면 된다.

  • Nested 된 함수 구조가 가능하다.
  • 함수는 일급객체이기 때문에 다른 함수를 return 값으로 쓸 수 있다.
  • 일급객체란) 컴퓨터 프로그래밍 언어 디자인에서, 일급 객체란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.다른 함수를 파라미터의 argument로 사용할 수 있다. 

 

Closure : 나중에 불려질 수 있는 코드의 부분 --> 함수는 클로져의 특별한 case 이다.(모든 함수는 클로져, 일부 클로져는 함수)

numbers.map({ (number: Int) -> Int in
    let result = 3 * number
    return result
})

 

클로져를 사용할때 여러 옵션들을 통해 간결 하게 작성할 수 있다. 이미 타입이 잘려진 클로져의 경우(delegate의 callback등등)는 리턴타입이나 파라미터 타입을 생략 가능하다. 

또한 파라미터를 참조할 때 이름이 아닌 숫자로 참조가 가능하다. 이 방법은 짧은 클로져에서 많이 쓰인다.

let sortedNumbers = numbers.sorted { $0 > $1 }
print(sortedNumbers)
// Prints "[20, 19, 12, 7]

 

다음 포스팅엔 Object 와 Classes 에 대해 알아본다.



 

[참고] :  Apple Inc. ‘The Swift Programming Language (Swift 5.0).’ Apple Books. https://books.apple.com/kr/book/the-swift-programming-language-swift-5-2/id881256329

 

 

728x90

댓글