Swift) 인스턴스 생성 및 소멸

Danna 다나·2021년 8월 9일
0
post-thumbnail

*** 계속해서 수정 중입니다.

1. 인스턴스 생성

  • 초기화 과정: 새로운 인스턴스 사용 준비 위해 저장 프로퍼티의 초깃값 설정
  • 초기화의 구현: 이니셜라이저(initializer) 정의
    • 새로운 인스턴스 생성할 수 있는 특별한 메서드가 됨
    • 반환값 없음
    • 초기화 하는 역할이 다야
    • func 대신 init 사용
// 클래스 이니셜라이저
class ClassName {
    init() {
    	// 초기화 코드
    }
}

// 구조체 이니셜라이저
struct StructName {
    init() {
    	// 초기화 코드
    }
}

// 열거형 이니셜라이저
enum EnumName {
    case caseName
    
    init() {
    	// 열거형은 초기화에서 반드시 모든 case를 포함해야 함
        self = .caseName
    	// 초기화 코드
    }
}

1) 프로퍼티 기본값

  • 구조체, 클래스 인스턴스 -> 처음 생성할 때 옵셔널 제외하고는 다 초깃값 할당해야 함
    • 이걸 이제 init() 실행될 때 하는 거지
    • 그래서 초기화 후에 값이 저장되지 않은 놈은 존재할 수가 없다
    • 프로퍼티 정의할 때 기본값(Default Value) 할당하면 init()에서 초깃값 설정 안 해줘도 자동 초기화 됨
// 초깃값을 설정하는 방법들
struct Area {
    var squareMeter: Double
    
    init() {
    	squareMeter = 0.0 // init에서 초깃값 할당
    }
    
 // ---------------------- 또는 ---------------------- 
  
    var squareMeter: Double = 0.0 // 프로퍼티 기본값 할당

}

// 호출부
let room: Area = Area()
print(room.squareMeter) // 0.0
  • 초기화의 많은 방법들
    • 이니셜라이저 매개변수
    • 옵셔널 프로퍼티
    • 상수 프로퍼티의 값 할당

2) 이니셜라이저 매개변수

  • 함수나 메서드처럼 이니셜라이저도 매개변수 가질 수 있다!
    -> 주로 인스턴스 초기화 과정에 필요한 값을 전달받을 때 쓰이지
struct Area {
    var squareMeter: Double
    
    init(fromPy py: Double) {
        squareMeter = py * 3.3058
    }
    
    init(fromSquareMeter squareMeter: Double) {
        self.squareMeter = squareMeter
    }
    
    init(value: Double) {
        squareMeter = value
    }
    
    init(_ value: Double) {
        squareMeter = value
    }
}

let roomOne: Area = Area(fromPy: 15.0)
print(roomOne.squareMeter) // 49.587

let roomTwo: Area = Area(fromSquareMeter: 33.06)
print(roomTwo.squareMeter) // 33.06

let roomThree: Area = Area(value: 30.0)
print(roomThree.squareMeter) // 30.0

let roomFour: Area = Area(55.0)
print(roomFour.squareMeter) // 55.0

Area() // 오류 발생
  • 사용자 정의 이니셜라이저 만들면 기존의 기본 init()은 별도로 구현하지 않는 이상 사용할 수 없음
  • 네 번째 이니셜라이저의 (_)은 와일드카드 식별자라고 부른다
    • 전달인자 레이블이 필요하지 않을 때 사용
  • 스위프트 표준 라이브러리에서 스위프트의 기본 타입들의 정의를 찾아보세요! 재미있을 것!!

3) 옵셔널 프로퍼티 타입

  • 프로퍼티를 옵셔널로 선언할 수도 있음
  • 초깃값 따로 할당 안 해주면 자동으로 nil 할당
class Person {
    var name: String
    var age: Int?
    
    init(name: String) {
        self.name = name
    }
}

let danna: Person = Person(name: "Danna")
print(danna.name) // Danna
print(danna.age) // nil

danna.age = 22
print(danna.age) // Optional(22)
if let age = danna.age {
    print(age) // 22
}

danna.name = "Daniel"
print(danna.name) // Daniel

4) 상수 프로퍼티

5) 기본 이니셜라이저와 멤버와이즈 이니셜라이저

6) 초기화 위임

7) 실패 가능한 이니셜라이저

8) 함수를 사용한 프로퍼티 기본값 설정

2. 인스턴스 소멸

1) 디이니셜라이저

2) 디이니셜라이저 활용 예시

profile
요즘은 https://welcometodannas.tistory.com/에 더 많은 글을 씁니다.

0개의 댓글