💡클래스
클래스는 참조 타입이다.
class Sample {
//가변 프로퍼티
var mutableProperty: Int = 100
//불변 프로퍼티
let immutableProperty: Int = 100
//타입 프로퍼티
static var typeProperty: Int = 100
//인스턴스 메서드
func instanceMethod() {
print("instance method")
}
//타입 메서드 - 재정의 불가
static func typeMethod() {
print("type method - static")
}
//타입메서드 - 재정의 가능
class func classMethod() {
print("type method - class")
}
}
class Sample {
//가변 프로퍼티
var mutableProperty: Int = 100
//불변 프로퍼티
let immutableProperty: Int = 100
//타입 프로퍼티
static var typeProperty: Int = 100
//인스턴스 메서드
func instanceMethod() {
print("instance method")
}
//타입 메서드 - 재정의 불가
static func typeMethod() {
print("type method - static")
}
//타입메서드 - 재정의 가능
class func classMethod() {
print("type method - class")
}
}
//인스턴스 생성 - 참조정보 수정 가능
var mutableReference: Sample = Sample()
var copyReference: Sample = Sample()
copyReference.mutableProperty = 1206
//참조정보 수정
mutableReference = copyReference
print(mutableReference.mutableProperty)
//인스턴스 생성 - 참조정보 수정 불가
let immutableInstance: Sample = Sample()
//클래스의 인스턴스는 참조타입이라 let으로 선언되어도 인스턴스 프로퍼티 값 변경이 가능
immutableInstance.mutableProperty = 1206
//참조정보 수정 불가능
//컴파일 오류 발생
//immutableInstance = copyReference
//참조 타입이라도 불변 프로퍼티는 변경할 수 없다
//컴파일 오류 발생
//immutableInstance.immutableProperty = 1206
Sample.typeProperty = 1206
Sample.typeMethod()
//인스턴스에서는 타입 프로퍼터나 타입 메서드 사용 불가
//컴파일 오류 발생
//mutableReference.typeProperty
//mutableReference.typeMethod()
class Student {
//가변 프로퍼티
var name: String = "studentName"
var `class`: String = "className"
//타입 메서드
class func selfIntroduce() {
print("학생 타입 클래스지롱")
}
//인스턴스 메서드
//self는 인스턴스 자신을 지칭하며, 몇몇 경우를 제외하고 사용은 선택사항임
func selfIntroduce() {
print("\(self.class)의 \(self.name)이다!")
}
}
//타입 메서드 사용
Student.selfIntroduce()
//인스천스 생성
var sujilee: Student = Student()
sujilee.name = "sujilee"
sujilee.class = "S"
sujilee.selfIntroduce()
//인스턴스 생성
let jji: Student = Student()
jji.name = "jji"
jji.class = "S"
jji.selfIntroduce()
타입 메서드는 왜 필요한걸까? 에 대한 의문을 시작으로 공부한 내용이다.
타입 메서드는 class
, static
키워드를 func
앞에 붙여줌으로써 선언할 수 있다.
class | static |
---|---|
서브(하위)클래스에서 오버라이드 가능 | 서브(하위)클래스에서 오버라이드 불가능 |
class someClass {
//인스턴스 멤버. 타입 someClass에서는 사용 불가능하다
//타입 메서드 내에서 사용 불가
var mutableProperty: Int = 0
//타입 멤버. 타입 someClass에서는 사용 가능하다.
//타입 메서드 내에서 사용 가능
static var typeProperty: Int = 0
//타입 메서드
class func typeMethod() {
//컴파일 에러
// mutableProperty = 1206
//컴파일 에러
// self.mutableProperty = 1206
//타입 메서드 내에서의 self는 인스턴스가 아닌 자신(타입 자체)를 지칭한다.
self.typeProperty = 1206
}
}
someClass.typeMethod()
print(someClass.typeProperty)
//OUTPUT : 1206
: 해당 프로퍼티나 메서드가 타입 자체와 연관될 때 사용하면 좋다. 유일한 값을 값을 가져야하는 경우 띠용?
EX) 볼륨을 담당하는 클래스, 영화 재생과 음악 재생을 담당하는 클래스가 있다.
볼륨은 시스템에서 유일한 값이어야하며, 영화 재생과 음악 재생을 오고 가더라도 값이 변하지 않아야 한다. 이 경우 볼륨을 타입 프로퍼티로 선언하고, 볼륨을 조절하는 기능을 타입 메서드로 선언해 사용한다. 메서드를 class
혹은 static
키워드로 선언할지는 상속 여부로 결정하겠지?