[Swift Programming] 인스턴스 생성 및 소멸Swift 프로그래밍2022. 7. 26. 12:59
Table of Contents
1. 인스턴스 생성
- 이니셜라이저 : 인스턴스 생성시 초기화
- 반환 값이 없다.
- 기본 이니셜라이저 (매개변수 x)
class ClassName{
var count : Int
init(){
//초기화할 때 필요한 코드 입력
count = 0
}
}
struct StructName{
var count : Int
init(){
//초기화할 때 필요한 코드 입력
count = 0
}
}
- 이니셜라이저 (매개변수 0)
class ClassName{
var count : Int
init(check : Int){
//초기화할 때 필요한 코드 입력
count = check
}
}
struct StructName{
var count : Int
init(check : Int){
//초기화할 때 필요한 코드 입력
count = check
}
}
let Check01 : ClassName = ClassName(check : 50)
let Check02 : StructName = StructName(check : 30)
print(Check01.count) // 50 출력
print(Check02.count) // 30 출력
- 레이블을 안쓰고 싶다면 와일드카드 식별자(_)를 사용하여 전달인자 레이블은 없앨 수 있다.
class ClassName{
var count : Int
init(_ check : Int){
//초기화할 때 필요한 코드 입력
count = check
}
}
struct StructName{
var count : Int
init(_ check : Int){
//초기화할 때 필요한 코드 입력
count = check
}
}
let Check01 : ClassName = ClassName(50)
let Check02 : StructName = StructName(30)
print(Check01.count) // 50 출력
print(Check02.count) // 30 출력
- 초기화 위임
- 초기화 위임 방법을 사용하면 코드를 중복으로 쓰지 않고도 효율적으로 여러 case의 이니셜라이저를 만들 수 있다.
enum Student {
case elementary, middle , high
case none
init(){
self = .none
}
init(koreanAge : Int){
switch koreanAge{
case 8...13:
self = .elementary
case 14...16:
self = .middle
case 17...19:
self = .high
default:
self = .none
}
}
init(bornAt : Int,currentYear : Int){
self.init(koreanAge: currentYear - bornAt + 1)
}
}
var younger : Student = Student(koreanAge: 16)
print(younger) //middle
younger = Student(bornAt: 1998, currentYear: 2016)
print(younger) //high
- 실패 가능한 이니셜라이저
- 실패했을 때 nil을 반환해주므로 반환 타입이 옵셔널로 지정된다.
- 초기화를 실패했을 때 nil을 반대로 초기화에 성공했을 때 return을 적어 초기화의 성공과 실패를 표현할 뿐, 실제 값을 반환하지는 않는다.
class Person{ var name : String var age : Int? init?(Inputname : String){ //초기화할 때 필요한 코드 입력 if Inputname.isEmpty{ return nil } self.name = Inputname } init?(Inputname : String, age: Int){ //초기화할 때 필요한 코드 입력 if Inputname.isEmpty || age < 0{ return nil } self.name = Inputname self.age = age } } let Student : Person? = Person(Inputname : "Gani", age : 99) if let person : Person = Student { print(person.name) }else{ print("이니셜라이즈 실패") } // Gani 출력 let Student1 : Person? = Person(Inputname : "Gani", age : -90) if let person1 : Person = Student1 { print(person1.name) }else{ print("이니셜라이즈 실패") } // 이니셜라이즈 실패 출력
- 실패 가능한 이니셜라이저는 열거형에서 특정 case에 맞지 않는 값이 들어오면 생성에 실패하는데 유용하게 사용된다
- 프로퍼티 기본값
- 프로퍼티 정의 시 , 기본값을 정의해 둔다면 이니셜라이저에서 따로 초깃값을 할당하지 않아도 된다.
class ClassName{ var count : Int = 0 } struct StructName{ var count : Int = 0 }
- 옵셔널 프로퍼티 타입
- 인스턴스가 사용되는 동안에 꼭 값을 갖지 않아도 되는 저장프로퍼티가 있거나, 값을 지정해주기 어려운 경우 저장프로퍼티를 옵셔널로 선언할 수 있다.
- 옵셔널로 선언한 저장 프로퍼티는 초기화 과정에서 값을 할당해주지 않는다면 자동으로 nil이 할당된다.
class Person{ var name : String var age : Int? init(_ Inputname : String){ //초기화할 때 필요한 코드 입력 name = Inputname } } let Student : Person = Person("Gani") print(Student.name) //"Gani" print(Student.age) // nil
- 클로저를 통한 프로퍼티 기본값 설정
- 인스턴스를 초기화할 때 함수나 클로저가 호출되면서 연산 결괏값을 프로퍼티 기본값으로 제공
- 클로저나 함수의 반환타입은 프로퍼티의 타입과 일치해야 함
- 클로저 내부에서는 인스턴스의 다른 프로퍼티를 사용하여 연산할 수 없음
- 클로저 내부에서 self 프로퍼티 사용 불가능, 인스턴스 메서드 호출 불가능
//예시 1 //클로저를 통한 프로퍼티 기본값 설정 class SomeClass{ let someProperty : someType = { //새로운 인스턴스를 생성하고 사용자 정의 연산을 통한 후 반환해 준다. //반환되는 값의 타입은 SomeType과 같은 타입이어야 한다. return someValue }() } //예시 2 struct Student{ var name : String? var number : Int? } class SchoolClass{ var students : [Student] = { //새로운 인스턴스를 생성하고 사용자 정의 연산을 통한 후 반환해줘야한다. // 반환되는 값의 타입은 [Student]이어야 한다. var arr : [Student] = [Student]() for num in 1...15{ var student : Student = Student(name : nil, number : num) arr.append(student) } return arr }() } let mycClass : SchoolClass = SchoolClass() print(mycClass.students.count)
- UI 컴포넌트를 클래스의 프로퍼티로 구현하고 , UI 컴포넌트의 생성과 동시에 컴포넌트의 프로퍼티를 기본적으로 설정할 때 유용하게 사용할 수 있다.
2. 인스턴스 소멸
- 디이니셜라이저
- 메모리에서 해제되기 직전 클래스 인스턴스와 관련하여 원하는 정리 작업을 구현할 수 있다.
- 클래스의 인스턴스가 메모리에서 소멸되기 바로 직전에 호출된다.
- 클래스의 인스턴스에만 구현할 수 있다.
- 스위프트에서는 인스턴스가 더 이상 필요하지 않으면 자동으로 메모리에서 소멸시켜주므로, 소멸시 별도의 메모리 관리 작업을 할 필요는 없다. 하지만 소멸시 부가적인 작업이 필요하다면 디이니셜라이저를 통해 실행시킬 수 있다.
- 매개변수가 없으며 소괄호를 적지 않고, 자동으로 호출되기 때문에 별도의 코드로 호출할 수 없다.
- 인스턴스의 모든 프로퍼티에 접근할 수 있으며 프로퍼티의 값을 변경할 수도 있다.
class FileManager{ var fileName : String init(fileName : String){ self.fileName = fileName } func closeFile(){ print("Close File : \\(self.fileName)") } deinit { print("Deinit instance") self.closeFile() } } var fileManager : FileManager? = FileManager(fileName: "abc.txt") if let manager : FileManager = fileManager{ print("open file : \\(manager.fileName)") //open file : abc.txt } fileManager = nil // Deinit instance //Close File : abc.txt
'Swift 프로그래밍' 카테고리의 다른 글
[Swift Programming] 프로퍼티와 메서드 (0) | 2022.07.12 |
---|---|
[Swift Programming]구조체와 클래스 (0) | 2022.07.08 |
completion handler VS async/await (0) | 2022.07.07 |
[Swift Programming] 옵셔널 (0) | 2022.07.07 |
@gani+ :: Gani_Dev :)
꾸준히 기록할 수 있는 사람이 되자 !