Swift - 초기화 메서드(생성자)란?
Swift - 초기화 메서드(생성자)란?
초기화 메서드(생성자)란?
- 클래스, 구조체를 초기화할 땐 반드시 저장 프로퍼티에 초기값이 할당되어야함.
- 초기화 메서드를 통해 클래스, 구조체에 정의된 저장 프로퍼티에 값을 할당할 수 있음.
- 이때, 초기화 메서드명은 반드시
init으로 작성해야만함.init이외에 메서드명은 컴파일러에서 인식하지 못함.
구문
1
2
3
init(매개변수명: 데이터타입, ..){
실행구문
}
예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class TestClass{
var ex1: Int
var ex2: Int
init(ex1: Int, ex2: Int){
self.ex1 = ex1
self.ex2 = ex2
print("초기화 구문 실행 종료")
}
}
struct TestStruct{
var ex1: Int
var ex2: Int
init(ex1: Int, ex2: Int) {
self.ex1 = ex1
self.ex2 = ex2
}
}
var testClass = TestClass(ex1: 10, ex2: 20)
print(testClass.ex1)
print(testClass.ex2)
var testStruct = TestStruct(ex1: 10, ex2: 20)
print(testStruct.ex1)
print(testStruct.ex2)
결과
1
2
3
4
5
초기화 구문 실행 종료
10
20
10
20
init을 직접 정의할 경우 기본적으로 제공되는 기본 초기화 메서드는 더는 사용할 수 없게 되며, 구조체에서 기본적으로 제공하는 멤버와이즈init또한 제공되지 않음.
초기화 메서드를 오버로딩해서 여러 개를 만드는 것도 가능함.
예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class TestClass{
var ex1: Int
var ex2: Int
init(){
self.ex1 = 10
self.ex2 = 20
}
init(ex1: Int){
self.ex1 = ex1
self.ex2 = 20
}
init(ex1: Int, ex2: Int){
self.ex1 = ex1
self.ex2 = ex2
print("초기화 구문 실행 종료")
}
}
struct TestStruct{
var ex1: Int
var ex2: Int
init(){
self.ex1 = 10
self.ex2 = 20
}
init(ex1: Int){
self.ex1 = ex1
self.ex2 = 20
}
init(ex1: Int, ex2: Int) {
self.ex1 = ex1
self.ex2 = ex2
}
}
var testClass1 = TestClass()
var testClass2 = TestClass(ex1: 10)
var testClass3 = TestClass(ex1: 10, ex2: 20)
var testStruct1 = TestStruct()
var testStruct2 = TestStruct(ex1: 10)
var testStruct3 = TestStruct(ex1: 10, ex2: 20)
초기화 메서드(생성자) 오버라이딩
- 클래스에서 선언한 초기화 메서드도 메서드의 일종으로 하위 클래스에서 오버라이딩이 가능함.
- 하위 클래스에서 초기화 메서드를 오버라이딩할 경우 상위 클래스에서 정의한 초기화 메서드가 사용되지 않기 때문에
super를 통해 호출해줘야함.
예시 1
1
2
3
4
5
6
7
8
9
10
11
12
13
class TestClass{
init(){
print("TestClass Init")
}
}
class SubTestClass: TestClass{
override init(){
// super.init()
}
}
var sub: SubTestClass = SubTestClass()
결과
1
TestClass Init
- 하위 클래스인
SubTestClass가 초기화 메서드를 정의할 경우 상위 클래스인TestClass에서는 이미 정의되어 있기 때문에 오버라이딩처리를 해줘야함. - 상위 클래스 내부에 생성자가 기본 생성자 1개만 존재한다면, 명시적으로
super.init()을 처리하지 않더라도 컴파일러가 자동으로 호출해주기 때문에 적어주지 않아도 됨.
예시 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class TestClass{
var ex1: Int
init(){
self.ex1 = 10
print("Init")
}
init (ex1: Int){
self.ex1 = ex1
print("ex1 Init")
}
}
class SubTestClass: TestClass{
var ex: Int
override init(){
self.ex = 10
super.init()
}
init(ex: Int, ex1: Int){
self.ex = ex
super.init(ex1: ex1)
}
}
var sub: SubTestClass = SubTestClass(ex: 10, ex1: 20)
print(sub.ex)
print(sub.ex1)
결과
1
2
3
ex1 Init
10
20
- 여러 개의 초기화 메서드가 오버로딩되어 있을 경우엔 명시적으로 호출할 초기화 메서드를 선언해줘야함.
This post is licensed under CC BY 4.0 by the author.