반응형
안녕하세요 공공돌🧸 입니다.
클래스에 대해 정리 해봤습니다.
1. 클래스
1. 클래스란?
- 클래스는 참조(reference) 타입입니다.
- 타입이름은 대문자 카멜케이스를 사용하여 정의합니다.
- Swift의 클래스는 다중 상속이 되지 않습니다.
2. 클래스 문법
- 정의 : "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")
}
}
- 클래스 사용
// 인스턴스 생성 - 참조정보 수정 가능
var mutableReference: Sample = Sample()
mutableReference.mutableProperty = 200
// 불변 프로퍼티는 인스턴스 생성 후 수정할 수 없습니다
// 컴파일 오류 발생
//mutableReference.immutableProperty = 200
// 인스턴스 생성 - 참조정보 수정 불가
let immutableReference: Sample = Sample()
// 클래스의 인스턴스는 참조 타입이므로 let으로 선언되었더라도 인스턴스 프로퍼티의 값 변경이 가능합니다
immutableReference.mutableProperty = 200
// 다만 참조정보를 변경할 수는 없습니다
// 컴파일 오류 발생
//immutableReference = mutableReference
// 참조 타입이라도 불변 인스턴스는
// 인스턴스 생성 후에 수정할 수 없습니다
// 컴파일 오류 발생
//immutableReference.immutableProperty = 200
// 타입 프로퍼티 및 메서드
Sample.typeProperty = 300
Sample.typeMethod() // type method
// 인스턴스에서는 타입 프로퍼티나 타입 메서드를
// 사용할 수 없습니다
// 컴파일 오류 발생
//mutableReference.typeProperty = 400
//mutableReference.typeMethod()
3. 학생 클래스 만들어 보기
class Student {
// 가변 프로퍼티
var name: String = "unknown"
// 키워드도 `로 묶어주면 이름으로 사용할 수 있습니다
var `class`: String = "Swift"
// 타입 메서드
class func selfIntroduce() {
print("학생타입입니다")
}
// 인스턴스 메서드
// self는 인스턴스 자신을 지칭하며, 몇몇 경우를 제외하고 사용은 선택사항입니다
func selfIntroduce() {
print("저는 \(self.class)반 \(name)입니다")
}
}
// 타입 메서드 사용
Student.selfIntroduce() // 학생타입입니다
// 인스턴스 생성
var ggdol: Student = Student()
ggdol.name = "GGDol"
ggdol.class = "스위프트"
ggdol.selfIntroduce() // 저는 스위프트반 GGDol입니다
// 인스턴스 생성
let bin: Student = Student()
bin.name = "Bin"
bin.selfIntroduce() // 저는 Swift반 Bin입니다
2. 생각해보기
▶'사람'을 나타내는 클래스를 만들어 봅시다.
- Hint 1 : 사람이 가질 수 있는 속성을 프로퍼티로, 사람이 할 수 있는 행동을 메서드로 구현할 수 있습니다.
- Hint 2 : 이름짓기 규칙을 다시 한 번 살펴보세요. 중요한 포인트입니다.
class Person {
var name: String = "unknown"
var age: Int = 0
var height: Float = 0.0
class func introduceMyself(){
print("클래스 타입 메서드 입니다.")
}
static func typeIntroduceMyself(){
print("스태틱 타입 메서드 입니다.")
}
func introduceMyself(){
print("안녕하세요. 제 이름은 \(name) 입니다. 나이는 \(age)이고 키는 \(height)입니다.")
}
func walk(){
print("걷는 중...")
}
func eat(){
print("먹는 중...")
}
}
var ggdol: Person = Person()
ggdol.name = "GGDol"
ggdol.age = 25
ggdol.height = 184.4
Person.introduceMyself()
Person.typeIntroduceMyself()
ggdol.introduceMyself()
ggdol.walk()
ggdol.eat()
공공돌의 생각💬
클래스 타입 메서드와 스태틱 타입 메서드에 대해 설명이 미흡하다고 생각해서 추가로 정리해 봤습니다.
class func
class func 키워드는 클래스 계층 구조에서 상속될 수 있는 메서드를 정의합니다.
서브클래스에서 해당 메서드를 오버라이드할 수 있습니다.
동적 디스패치를 지원하므로 실행 시간에 객체의 실제 타입에 따라 적절한 메서드가 호출됩니다.
클래스 메서드는 메서드가 호출된 실제 타입이 아니라 메서드를 호출한 타입을 기준으로 오버라이드를 선택합니다.
class MyClass {
class func introduceMyself() {
print("클래스 타입 메서드 입니다.")
}
}
class MySubclass: MyClass {
override class func introduceMyself() {
print("서브클래스에서 오버라이드된 클래스 타입 메서드 입니다.")
}
}
MyClass.introduceMyself() // 출력: 클래스 타입 메서드 입니다.
MySubclass.introduceMyself() // 출력: 서브클래스에서 오버라이드된 클래스 타입 메서드 입니다.
static func
static func 키워드는 클래스나 구조체의 최종 타입에서 사용됩니다.
상속과 관련이 없으며, 서브클래스에서 오버라이드할 수 없습니다.
컴파일 시간에 정적 디스패치를 사용하므로 실행 시간에 실제 타입에 따라 메서드가 선택되지 않습니다.
struct MyStruct {
static func typeIntroduceMyself() {
print("스태틱 타입 메서드 입니다.")
}
}
MyStruct.typeIntroduceMyself() // 출력: 스태틱 타입 메서드 입니다.
따라서, 클래스 메서드(class func)는 상속 가능하며 오버라이드 가능한 반면, 스태틱 메서드(static func)는 상속과 관련이 없고 서브클래스에서 오버라이드할 수 없습니다.
공부하는 공돌이, 공공돌입니다🐻
@sheep1sik
출처 : 야곰 iOS 프로그래밍을 위한 스위프트 기초
반응형
'iOS > Swift 기초' 카테고리의 다른 글
[ Swift 기초 ] 클래스 vs 구조체/열거형 (1) | 2024.01.12 |
---|---|
[ Swift 기초 ] 열거형 (2) | 2024.01.11 |
[ Switf 기초 ] 구조체 (1) | 2024.01.09 |
[ Swift 기초 ] 옵셔널 추출 (2) | 2024.01.08 |
[ Swift 기초 ] 옵셔널 (1) | 2024.01.07 |