2021년 11월 17일에 공부한 내용입니다.
class
키워드를 사용한다.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")
}
// 클래스는 let, var을 사용한 인스턴스 모두 안의 프로퍼티 내용을 변경할 수 있다.
// 클래스의 인스턴스는 참조 타입이기 때문에 값 변경이 가능하다.
var mutableReference: Sample = Sample() // 인스턴스 생성 - 참조정보 수정 가능
mutableReference.mutableProperty = 200
let immutableReference: Sample = Sample() // 인스턴스 생성 - 참조정보 숮어 불가
immutableReference.mutableProperty = 200
// 그러나 처음부터 불변 인스턴스로 선언되어 있다면 값을 바꿀 수 없다.
mutableReference.immutableProperty = 200
immutableReference.immutableProperty = 200
// 참조 정보를 변경할 수는 없다
// 컴파일 오류 발생
immutableReference = mutableReference
// 타입 프로퍼티 및 메서드
Sample.typeProperty = 300
Sample.typeMethod() // type method
// 인스턴스에서는 타입 프로퍼티, 메서드를 사용할 수 없다.
// 컴파일 오류 발생
mutableReference.typeProperty = 400
mutableReference.typeMethod()
}
class Student {
// 가변 프로퍼티
var name: String = "unknown"
// 키워드도 `로 묶어주면 이름으로 사용할 수 있다.
var `class`: String = "Swift"
// 타입 메서드
class func selfIntroduce() {
print("학생타입입니다")
}
// 인스턴스 메서드
// self는 인스턴스 자신을 지칭하며, 몇몇 경우를 제외하고 사용은 선택사항이다.
func selfIntroduce() {
print("저는 \(self.class)반 \(name)입니다")
}
}
Student.selfIntroduce() // 학생타입입니다
var seoyoung: Student = Student()
seoyoung.name = "seoyoung"
seoyoung.class = "스위프트"
seoyoung.selfIntroduce() // 저는 스위프트반 seoyoung입니다
// let으로 선언했음에도 불구하고 프로퍼티 값 변경이 가능하다
let beomgyu: Student = Student()
beomgyu.name = "beomgyu"
beomgyu.selfIntroduce() // 저는 Swift반 beomgyu입니다
class Person {
var name: String = "unknown"
var age: Int = 1
var sex: String = "unknown"
func selfIntroduce() {
print("제 이름은 \(name)이고 나이는 \(age)살입니다.")
}
}