새소식

iOS/Swift

[Swift] 인스턴스

  • -
참조 :  Swift 스위프트 프로그래밍 3판 Swift 5, 저자 야곰 (한빛미디어) , The Swift Programming Language Swift 5.6 Edition
 (iBooks)(https://books.apple.com/kr/book/the-swift-programming-language-swift-5-6/id881256329)

 

인스턴스 생성


-  초기화 과정 : 새로운 인스턴스를 사용할 준비를 하기 위하여 저장 프로퍼티의 초깃값을 설정하는 일을 함

- 이니셜라이저(Initializer)을 정의하면 초기화 과정 직접 구현할 수 있음

- 구현된 이니셜라이저는 새로운 인스턴스를 생성할 수 있는 특별한 메서드가 됨

- 스위프트의 이니셜라이저에는 반환 값이 없음

- 이니셜라이저의 역할은 인스턴스의 첫 사용을 위해 초기화하는 것

- init 키워드를 사용하여 이니셜라이저 메서드임을 표현

- init 메서드는 클래스, 구조체, 열거형 등의 구현부 또는 해당 타입의 익스텐션 구현부에 위치

 

 

 

 

프로퍼티의 기본값


- 구조체와 클래스의 인스턴스는 처음 생성할 때 옵셔널 저장 프로퍼티를 제외한 모든 저장 프로퍼티에 적절한 초기값 할당해야 함

- 초기화 후에 값이 확정되지 않은 저장 프로퍼티는 존재 불가

- 프로퍼티를 정의할 때 프로퍼티 기본값을 할당하면 이니셜라이저에서 따로 초깃값을 할당하지 않더라도
프로퍼티 기본값으로 저장 프로퍼티의 값이 초기화됨

※ 이니셜라이저를 통해 초깃값을 할당하거나, 프로퍼티 기본값을 통해 처음의 저장 프로퍼티가 초기화될 때는
프로퍼티 감시자 메서드가 호출되지 않음

- Area 구조체와 이니셜라이저(init)

 

struct Area{
	var squareMeter: Double
    
    init(){
    	squareMeter: 0.0
    }
}

let room: Area = Area()
print(room.squareMeter) // 0.0

 

- 위의 예시는 이니셜라이저로 저장 프로퍼티에 초깃값을 성정하는 방식

- 프로퍼티를 정의할 때 프로퍼티에 기본값을 할당하는 방식도 사용 가능

- 프로퍼티의 기본값 지정

 

struct Area{
	var squareMeter: Double = 0.0
}

let room: Area = Area()
print(room.squareMeter) // 0.0

 

 

 

이니셜라이저 매개변수


- 이니셜라이저도 매개변수로 가질 수 있음

- 인스턴스를 초기화하는 과정에 필요한 값을 전달받을 수 있음

- 이니셜라이저 매개변수

 

struct Area{
	var squareMeter: Double
	
    init(fromPy py: Double){
    	squareMeter = py * 3.3056
    }
    init(fromSquare 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(fromSquare: 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

 

- 사용자 정의 이니셜라이저를 만들면 기존의 기본 이니셜라이저(init())는 별도로 구현하지 않는 이상 사용 불가

 

 

옵셔널 프로퍼티 타입


- 인스턴스가 사용되는 동안에 값을 꼭 갖지 않아도 되는 저장 프로퍼티가 있다면 해당 프로퍼티를 옵셔널로 선언 가능

- 초기화 과정에서 값을 할당해주지 않는다면 자동으로 nil이 할당됨

 

 

 

상수 프로퍼티


- 인스턴스를 초기화하는 과정에서만 값을 할당할 수 있으며, 처음 할당된 이후로는 값을 변경할 수 없음

 

 

 

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


- 기본 이니셜라이저는 저장 프로퍼티의 기본값이 모두 지정되어 있고, 동시에 사용자 정의 이니셜라이저가

정의되어 있지 않은 상태에서 제공됨

- 구조체는 사용자 정의 이니셜라이저를 구현하지 않으면 프로퍼티의 이름으로 매개변수를 갖는 이니셜라이저인 멤버와이즈

이니셜라이저를 기본으로 제공

- 클래스는 멤버와이즈 이니셜라이저를 지원하지 않음

 

 

 

 

 

초기화 위임


- 값 타입인 구조체와 열거형은 코드의 중복을 피하기 위하여 이니셜라이저가 다른 이니셜라이저에게 일부 초기화를 위임하는
초기화 위임을 간단하게 구현 가능

- 클래스는 상속을 지원하기 때문에 간단한 초기화 위임도 불가능

- 값 타입에서 이니셜라이저가 다른 이니셜라이저를 호출하려면 self.init을 사용

- self.init은 이니셜라이저 안에서만 사용 가능, self.init을 사용한다는 것 자체가 사용자 정의 이니셜라이저를 정의하고 있다는 뜻

- 사용자 정의 이니셜라이저를 정의하면 기본 이니셜라이저와 멤버와이즈 이니셜라이저를 사용 못함

→ 초기화 위임을 하려면 최소 두 개 이상의 사용자 정의 이니셜라이저를 정의해야 함

 

 

 

 

 

실패 가능한 이니셜라이저(Failable Initializer)


- 이니셜라이저의 전달인자로 잘못된 값이나 적절치 못한 값이 전달되었을 때, 이니셜라이저는 인스턴스 초기화에 실패할 수 있음

- 실패 가능성을 내포한 이니셜라이저

- 실패 가능한 이니셜라이저는 클래스, 구조체, 열거형 등에 모두 정의 가능

- 실패했을 때 nil을 반환해주므로 반환 타입이 옵셔널로 지정

- init? 키워드 사용

※ 실패 가능한 이니셜 라이저는 실제로 특정 값을 반환하지 않음

→ 초기화 실패 시 return nil을, 반대로 성공했을 때는 return을 적어 성공과 실패만을 표현함

- 열거형에서 유용하게 사용 가능

 

 

 

 

 

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


- 클로저를 사용하여 프로퍼티의 기본값을 설정한다면, 클러저 내부에서는 인스턴스의 다른 프로퍼티를 사용하여 연산할 수 없음

- 다른 프로퍼티에 기본 값이 있다 하여도 연산 불가

- 클로저 내부에서 self 프로퍼티 사용 불가, 인스턴스 메서드 호출 불가

 

struct Student{
    var name: String?
    var number: Int?
}
class SchoolClass{
    var students: [Student] = {
        
        var arr: [Student] = [Student]()
        
        for num in 1...15{
            var student: Student = Student(name: nil, number: num)
            arr.append(student)
        }
        
        return arr
    }()
}

let myClass: SchoolClass = SchoolClass()
print(myClass.students.count) // 15

 

 

※ iOS의 UI 등을 구성할 때, UI 컴포넌트를 클래스의 프로퍼티로 구현하고, UI 컴포넌트의 생성과 동시에 컴포넌트의 프로퍼티를

기본적으로 설정할 때 유용하게 사용 가능

 

 

 

 

 

인스턴스의 소멸


- 클래스의 인스턴스는 디이니셜라이저(Deinitialize)로 구현 가능

- 이니셜라이즈와 반대 역할을 함

- 메모리에서 해제되기 작전 클래스 인스턴스와 관련하여 원하는 정리 작업 구현 가능

- deinit 키워드 사용

- 클래스의 인스턴스에서만 단 하나만 구현 가능

- 자동으로 호출되기 때문에 별도의 코드로 호출 불가

 

 

728x90

'iOS > Swift' 카테고리의 다른 글

[Swift] Codable vs JSONSerialization  (1) 2022.10.15
[Swift] 접근제어  (0) 2022.09.28
[Swift] Extension  (0) 2022.09.27
[Swift] 상속  (0) 2022.09.25
[Swift] 서브스크립트  (2) 2022.09.22
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.