728x90
오늘은 클래스에 대해 공부하였다.
클래스는 구조체와 거의 비슷하지만, 약간 다른점이 존재한다.
구조체는 값 타입이지만 클래스는 참조 타입이라는 것이 차이점 중 하나이다.
그리고 중요한 것 하나는 Swift의 클래스는 다중상속이 되지 않는다. (충격)
정의
class 이름 {
/* 구현부 */
}
클래스의 정의는 위와 같다.
프로퍼티와 메서드
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")
}
}
클래스 구현은 구조체와 같다. 하지만 다른게 몇가지 존재한다.
인스턴스 메서드 까지는 같지만, 타입 메서드에서 2가지로 나뉜다.
나누는 기준은 나중에 상속을 받았을 때 재정의가 가능하냐, 할 수 없냐에 따라 나눠진다.
하나는 재정의 불가 타입 메서드인 static , 다른 하나는 재정의 가능 타입 메서드인 class 이다.
클래스 사용
// 클래스는 구조체와 다르게 var 로 선언이 됐든 let으로 선언이 됐든간에, mutableProperty(가변 프로퍼티) 가 변경이 가능하다.
var mutableReference: Sample = Sample()
mutableReference.mutableProperty = 200
//mutableReference.immutableProperty = 200
let immutableReference: Sample = Sample()
immutableReference.mutableProperty = 200
//immutableReference.immutableProperty = 200
//immutableReference = mutableReference
// 타입 프로퍼티 및 메서드
// 구조체와 크게 다른 모습을 보여주지 않는다.
Sample.typeProperty = 300
Sample.typeMethod() // type method
//mutableReference.typeProperty = 400
//mutableReference.typeMethod()
클래스 사용도 구조체와 비슷하지만 다른점이 존재한다.
먼저 클래스는 구조체와 다르게 var로 선언을 하든 let으로 선언을 하든간에 class내에서 가변 프로퍼티로 선언된 값을 변경할 수 있다.
주석 처리 된 것들은 애초에 불변 프로퍼티이다.
// MARK: - 학생 클래스
class Student {
var name: String = "known"
var `class`: String = "Swift"
class func selfIntroduce() {
print("학생입니다")
}
func selfIntroduce() {
print("저는 \(self.class)반 \(name)입니다.")
}
}
Student.selfIntroduce() // 학생입니다.
var ITlearning: Student = Student()
ITlearning.name = "Itlearning"
ITlearning.class = "스위프트"
ITlearning.selfIntroduce()
// 가변 프로퍼티를 let으로 인스턴스를 선언했음에도 불구하고 변경이 가능하다.
let enji: Student = Student()
enji.name = "enji"
enji.class = "스위프트"
enji.selfIntroduce()
학생 클래스에도 약간 다른점이 존재하는데,
마지막 문단의 코드를 보면 가변 프로퍼티를 let으로 인스턴스를 선언 했음에도 불구하고 변경이 가능하다.
기존의 구조체에서는 let으로 선언했기에 불변하기 마련이었는데, class에서는 그딴거 신경 안쓰나보다. 안에 있는 것이 더 우선이라고 판단하는 듯 하다. 따라서 은지로도 변경이 가능하다 ㅎ
728x90
'etc > Swift' 카테고리의 다른 글
클래스 vs 구조체 / 열거형 (0) | 2021.05.24 |
---|---|
열거형(enum) (0) | 2021.05.24 |
구조체 (0) | 2021.05.21 |
옵셔널(Optional) (0) | 2021.05.17 |
반복문 (0) | 2021.05.16 |
댓글