오늘의 Swift 상식 (Initializer 1편. 초기화, 값 타입의 Initializer)

장국진
4 min readMay 24, 2019

--

초기화

  • 클래스, 구조체, 열거형 인스턴스를 사용하기 위한 준비 작업
  • 저장 프로퍼티의 초기 값을 설정
  • 초기화 작업이 완료되면 메모리에 인스턴스가 생성 된다.
  • 초기화를 하는 방법에는 두 가지가 있다.
  1. init()을 사용한 초기화
  2. 저장 프로퍼티에 초기값 저장

이니셜라이저의 역할 (이니셜라이저의 대원칙)

  • 스위프트는 에러에 대한 안전을 최우선시 한다.
  • 빈 메모리에 접근하게 된다면 예기치 못한 에러가 발생할 수 있다.
  • 타입 내부에 프로퍼티가 있다면 해당 프로퍼티에는 무조건 값이 있다는 것을 보장해야 한다.

이니셜라이저를 사용하여 초기화하기

  • init() 문법의 가장 기본적인 형태는 매개 변수가 없는 형태이다.
init() {
// 이 곳에서 초기화를 구현
}

기본 값을 지정하여 초기화 하기

  • 초기화의 또다른 방법으로 프로퍼티의 선언과 동시에 값을 할당하면 그 값을 초기 값으로 사용할 수 있다.

기본 값을 지정하는 것이 좋은 경우

  • 항상 같은 초기 값을 가진다면 프로퍼티 선언과 동시에 초기 값을 할당하는게 좋다.

최종 결과는 동일하지만 기본 값은 프로퍼티의 초기화를 해당 선언 시점과 더 밀접하게 연결함으로써 더 짧고 명확한 이니셜라이저를 만들 수 있고, 프로퍼티의 타입을 추론할 수 있기에 코드가 짧아진다.

  • 뒷부분에서 다룰 이니셜라이저 상속도 보다 쉽게 활용할 수 있다.

초기화 사용자화 하기

인자명 선언 방법

  • 이니셜라이저는 메소드와 달리 괄호 앞에 식별할 수 있는 이름을 가지지 않기때문매개 변수명 및 타입이 이니셜러이저를 식별하는 데에 중요한 역할을 한다.
  • 이니셜라이저는 초기화 인자를 주는 방법으로 사용자가 타입과 이름을 정의할 수 있다.
  • 초기화 인자는 메소드와 같은 특징과 문법을 가진다.

옵셔널 타입

  • 프로퍼티를 옵셔널 타입으로 선언한 경우 초기값이 없어도 되고, 나중에 추가도 가능하다.
  • 초기값이 없는 경우 자동으로 nil로 초기화

상수 프로퍼티

  • 이니셜라이저는 상수 프로퍼티에 값을 할당하는 것도 가능하다.

실패 가능한 이니셜라이저

  • 초기화 과정 중에 실패할 가능성이 있는 이니셜라이저
  • 반환 값으로 옵셔널 값을 생성
  • 초기화 실패 시 nil을 반환
  • 문법은 init?()

앞에서 말했듯이 이니셜라이저는 매개벼수명과 타입으로 구분하기 때무에 실패 가능한 이니셜라이저와 그렇지 않은 이니셜라이저의 형태가 다르다고 해서 같은 매개변수 타입과 이름을 사용할 수 없다.

값 유형의 이니셜라이저

이니셜라이저 위임 (Initializer Delegation)

  • 이니셜라이저는 인스턴스 초기화의 일부를 수행하기 위해 다른 이니셜라이저를 호출할 수 있다.
  • 코드 중복을 예방해준다.
  • 값 유형과 클래스 유형에 따라 동작 방식이 다르다.
  • 값 유형에서의 이니셜라이저 위임

구조체의 이니셜라이저

  • 구조체는 기본적으로 제공되는 이니셜라이저가 2개가 있다.
  1. 멤버와이즈 이니셜라이저: 프로퍼티를 매개 변수로 가지는 이니셜라이저
  2. 기본 이니셜라이저: 매개 변수가 없는 이니셜라이저
  • 구조체 내에서 프로퍼티가 하나라도 초기화되지 않은 경우, 초기값이 없는 속성을 매개 변수로 갖는 이니셜라이저(멤버와이즈 이니셜라이저)가 제공된다.
  • 프로퍼티가 모두 초기화 되어 있는 경우 매개 변수가 없는 이니셜라이저(기본 이니셜라이저)도 제공된다.
  • 다만 속성이 모두 let으로 초기화 되어 있는 경우 멤버와이즈 이니셜라이저는 제공 되지 않는다.

열거형의 이니셜라이저

  • 열거형은 rawValue가 있는 경우 rawValue로부터 열거형 인스턴스를 생성할 수 있는 실패 가능한 이니셜라이저가 기본으로 제공된다.
  • 열거형의 case들을 초기화 해주는 것은 가능하지만 rawValue는 변할 수 없는 값이기 때문에 초기화 해줄 수 없다.

값 유형의 이니셜라이저 익스텐션

  • 값 타입을 위한 사용자 이니셜라이저를 정의하면 더 이상 기본 이니셜라이저 또는 멤버와이즈 이니셜라이저에 접근할 수 없다.
  • 이러한 제약을 주는 이유는 이니셜라이저의 복잡성을 낮추고 이니셜라이저가 의도치 않게 사용되는 것을 방지하기 위함이다.
  • 사용자 지정 이니셜라이저를 사용하면서 기본 또는 멤버와이즈 이니셜라이저도 사용하고 싶다면, 사용자 지정 이니셜라이저를 원래의 값 타입에 구현하지 않고, 익스테션에 구현을 하면 된다.

참고 : https://docs.swift.org/swift-book/LanguageGuide/Initialization.html

(2편 클래스의 Initializer)

To be continued…

--

--