Swift) Class란?

Class란?

  • 클래스는 참조(reference)타입이다.
  • 타입 이름은 대문자 카멜케이스를 사용하여 정의한다.
  • Swift의 클래스는 다중 상속이 되지 않는다.

Class 문법

  • ‘class’ 키워드를 사용한다.
1
2
3
class (대문자)이름 {
/* 구현부 */
}
  • 프로퍼티 및 메서드 구현
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
class Sample {
// 가변 프로퍼티
var mutableProperty : Int = 100

// 불변 프로퍼티
let immutableProperty : Int = 100

// 타입 프로퍼티
static var typeProperty : Int = 100

// 인스턴스 메서드
func instanceMethod() {
print("instance Method")
}

// 타입 메서드
// 상속시 재정의 불가 타입 메서드 - static
static func typeMethod() {
print("type Method - static")
}

// 상속시 재정의 가능 타입 메서드 - class
class func classMethod() {
print("type Method - class")
}
}
  • 클래스 사용
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
// 인스턴스 생성 - 참조정보 수정 가능
var mutableReference : Sample = Sample()

mutableReference.mutableProperty = 200
print("가변 인스턴스의 가변 프로퍼티 값은? ",mutableReference.mutableProperty)
// ----- 출력값
// 가변 인스턴스의 가변 프로퍼티 값은? 200

// 불변 프로퍼티는 인스턴스 생성 후 수정할 수 없다.
// 컴파일 오류 발생
// mutableReference.immutableProperty = 200


// 인스턴스 생성 - 참조정보 수정 불가
let immutableRefernce : Sample = Sample()

// 클래스의 인스턴스는 참조타입이므로 let으로 선언되었더라도 인스턴스 프로퍼티의 값 변경이 가능하다.
immutableRefernce.mutableProperty = 200
print("불변 인스턴스의 가변 프로퍼티 값은?",immutableRefernce.mutableProperty)
// ----- 출력값
// 불변 인스턴스의 가변 프로퍼티 값은? 200

// 다만 참조정보를 변경할 수는 없다.
// 컴파일 오류 발생
// immutableRefernce = mutableReference

// 참조 타입이더라도 불변 인스턴스는
// 인스턴스 생성 후에 수정할 수 없다.
// 컴파일 오류 발생
// immutableRefernce.immutableProperty = 200

// 타입 프로퍼티 및 메서드
Sample.typeProperty = 300
print("타입 프로퍼티 값은?",Sample.typeProperty)
// ----- 출력값
// 타입 프로퍼티 값은? 300

Sample.typeMethod()
// ----- 출력값
// type Method - static

// 인스턴스에서는 타입 프로퍼티나 타입 메서드를 사용할 수 없다.
// 컴파일 오류 발생
// mutableReference.typeProperty = 200
// mutableReference.typeMethod()

예제) 학생 클래스 만들어보기

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
class Student {
// 가변 프로퍼티
var name : String = "unknown"

// 키워드도 `로 묶어주면 이름으로 사용할 수 있다.
var `class`: String = "Swift"

// 타입 메서드
class func selfIntroduce() {
print("학생 타입입니다.")
}

// 인스턴스 메서드
// self는 인스턴스 자신을 지칭하며, 몇몇 경우를 제외하고 사용은 선택사항이다.
func selfIntroduce() {
print("저는 \(self.class)\(name)입니다")
}
}

// 타입 메서드 사용
Student.selfIntroduce()
// ----- 출력값
// 학생 타입입니다.

// 가변 인스턴스 생성
var flora : Student = Student()
flora.name = "플로라"
flora.class = "스위프트"
flora.selfIntroduce()
// ----- 출력값
// 저는 스위프트반 플로라입니다.

// 불변 인스턴스 생성
let sujeong : Student = Student()
sujeong.name = "수정"
sujeong.class = "아이오에스"
sujeong.selfIntroduce()
// ----- 출력값
// 저는 아이오에스반 수정입니다.

정리

  • 클래스에서 정의한 프로퍼티를 사용하고 싶다면 인스턴스 생성 후 프로퍼티를 사용할 수 있다.

  • 그 중 타입 프로퍼티타입 메서드인스턴스 생성 없이 클래스 이름에 대입하여 바로 사용할 수 있다.

  • 인스턴스 메서드는 생성한 인스턴스와 함께 사용할 수 있다. (타입 메서드와는 다름)

  • 생성한 인스턴스에서는 타입 프로퍼티나 타입 메서드를 사용할 수 없다.

  • 가변 인스턴스 생성 시 가변 프로퍼티는 수정이 가능하지만, 불변 프로퍼티는 인스턴스 생성 후 수정할 수 없다.

  • 불변 인스턴스 생성 시 클래스의 인스턴스는 참조타입이므로 가변 프로퍼티 수정이 가능하지만 불변 프로퍼티는 인스턴스 생성 후 수정할 수 없다.

  • 불변 인스턴스를 가변 인스턴스로 참조정보를 변경할 수 없다.

참고

Author

Sujeong Kim

Posted on

2021-09-24

Updated on

2021-10-05

Licensed under

댓글