먐
[Swift] Swift의 Class 본문
여러 프로퍼티와 메서드를 담아 이를 묶어 하나의 사용자 정의 데이터 타입으로 만든 것
구조체와 정의는 동일하다.
따라서 클래스에서도 구조체처럼 프로퍼티, 메서드 등을 사용하기도 하는데
클래스에서는 구조체와 구분되는 플러스 알파적인 기능들이 있음.
- 상속을 사용하면 한 클래스가 다른 클래스의 특성을 상속할 수 있습니다.
- 타입 캐스팅을 사용하면 런타임에 클래스 인스턴스의 타입을 확인하고 해석할 수 있습니다.
- 초기화 해제 구문 (Deinitializers) 을 사용하면 클래스의 인스턴스가 할당된 리소스를 해제할 수 있도록 합니다.
- 참조 카운팅은 하나 이상의 클래스 인스턴스 참조를 허락합니다.
이런 내용들이 document에 있음. 일단은 구조체보다 클래스가 더 많고 복잡한 기능들을 지원한다는 것만 알고 넘어가자. 어차피 다 공부해 볼 내용이다.
암튼 이런 식으로 기능을 추가하다 보니 클래스가 지원하는 기능들은 복잡한 편이다.
따라서 일반적으로는 구조체를 사용하고 적절한 상황에 클래스를 사용하는 것을 추천한다.
선언
class SomeClass {
}
- class 키워드 사용
- 구조체와 같이 클래스도 결국 사용자가 정의한 새로운 타입이므로 UpperCamelCase 변수명 짓기
프로퍼티
구조체와의 차이점은 class 키워드로 작성된 연산 타입 프로퍼티는 서브 클래스에서 재정의가 가능함
머선 말인지 모르겠으면 글 추천. (나의 글... ㅎ)
[Swift] 프로퍼티에 대하여
프로퍼티 클래스나 구조체 안의 변수나 상수를 흔히 프로퍼티라고 칭함. 저장 프로퍼티: 말 그대로 값을 저장 연산 프로퍼티: 값을 저장하지 않고 계산 타입 프로퍼티: 저장 프로퍼티, 계산 프로
don2bye.tistory.com
class AClass {
class var testTypeProperty: Int {
return 5
}
}
class BClass: AClass {
override class var testTypeProperty: Int {
return 10
}
}
print(AClass.testTypeProperty) // 5
print(BClass.testTypeProperty) // 10
메서드
구조체와 같이 메서드를 클래스 내부에 선언하고 외부에서 접근할 수 있음.
구조체와의 차이점은 class 키워드로 작성된 타입 메서드는 서브 클래스에서 재정의가 가능함.
[Swift] 메서드에 대하여
클래스, 구조체, 열거형 안에 구현되는 함수를 메서드라고 함. 인스턴스 메서드 타입 메서드 2가지가 존재한다. 인스턴스 메서드(Instance Methods) 특정 클래스, 구조체, 열거형의 인스턴스에 속하는
don2bye.tistory.com
class AClass {
class func hi() {
print("Hi")
}
}
class BClass: AClass {
override class func hi() {
print("Hi2")
}
}
AClass.hi() // Hi
BClass.hi() // Hi2
이처럼 구조체와 다른 클래스의 특성 중 하나가 바로 상속임.
상속도 무척이나 큰 개념이라 따로 정리를 했다.
클래스 인스턴스
class Car {
let model = "툭툭이"
var ownerName = "min"
}
var car = Car() // 인스턴스 생성 후 할당
구조체와 동일하게
Car 클래스는 그냥 타입임. 틀 자체.
우리가 직접 사용하려면 틀을 이용해 찍어낸 인스턴스를 호출해야 함.
var car = Car()
car.model = "외제차" // annot assign to property: 'model' is a 'let' constant
print(car)
인스턴스를 생성하여 변수에 할당해 보자.
let 으로 선언된 model 을 수정하려고 할 때는 당연히 에러가 뜬다.
var 로 선언된 ownerName 은 당연히 수정이 가능하다.
let car = Car()
car.model = "외제차" // Cannot assign to property: 'model' is a 'let' constant
car.ownerName = "june" // 변경 성공
그렇다면, 인스턴스를 생성하여 상수에 할당하면 어떻게 될까?
let 으로 선언된 model 은 당연히 변경이 안 되고,
var 로 선언된 ownerName 은 변경이 가능하다.
인스턴스를 생성하여 상수에 할당했는데 어떻게 값이 변경될 수 있을까?
이는 클래스가 reference type이기 때문이다.
구조체와 달리 car 상수 자체는 인스턴스를 저장하지 않고, Car 인스턴스를 참조한다.
따라서 상수 자체는 실제로 변경되는 것이 아니니 그 안의 멤버 프로퍼티는 변경이 가능한 것이다.
초기화
struct Student {
var name: String
var age: Int
}
let min = Student(name: "min", age: 25)
print(min)
구조체에서는 내부의 멤버 프로퍼티에 기본값을 지정해 주지 않아도, memberwise 초기화 구문을 통해 간단하게 생성할 수 있었음.
class Car {
var model: String
var ownerName: String
}
let car = Car(model: "BMW X5", ownerName: "Min")
// 🚨 Car' cannot be constructed because it has no accessible initializers
하지만 클래스에는 memberwise 초기화 구문 가튼 거 없다.
따라서 클래스 내부의 프로퍼티는
- 기본값을 지정해 주기
- 초기화 구문을 추가해 주기
둘 중에 하나는 꼭 필요함.
class Car {
var model: String
var ownerName: String
init() {
self.model = "BMW X5"
self.ownerName = "Mini"
}
init(ownerName: String) {
self.model = "BMW X5"
self.ownerName = ownerName
}
init(model: String, ownerName: String) {
self.model = model
self.ownerName = ownerName
}
}
let car1 = Car()
print(car1.model, car1.ownerName) // BMW X5 Mini
let car2 = Car(ownerName: "June")
print(car2.model, car2.ownerName) // BMW X5 June
let car3 = Car(model: "Benz eclass", ownerName: "Ham")
print(car3.model, car3.ownerName) // Benz eclass Ham
그리고 클래스는 reference type이다!
- value type과 반대로 변수 또는 상수에 할당될 때 복사되지 않음
- 하나의 인스턴스에 대한 참조가 사용됨
class Car {
let model = "툭툭이"
var ownerName = "min"
}
let car1 = Car()
print(car1.model, car1.ownerName) // 툭툭이 min
let car2 = car1
car2.ownerName = "june" // car1의 ownerName 수정
print(car1.ownerName, car2.ownerName) // june june
- car1 , car2 모두 같은 인스턴스를 참조 중
- car2 의 ownerName 의 값을 변경했고 이는 car1 에도 반영이 됨
- 구조체는 분명 독립된 인스턴스였는데... ㅇㅅㅇ!
Reference
구조체와 클래스 (Structures and Classes) | Swift
데이터를 캡슐화하는 사용자 정의 타입을 모델링합니다. 구조체 (Structures) 와 클래스 (classes) 는 프로그램 코드의 구성 요소가 되는 범용의 유연한 구조입니다. 상수, 변수, 그리고 함수를 정의하
bbiguduk.gitbook.io
'iOS > 문법' 카테고리의 다른 글
[Swift] escaping closure (0) | 2024.04.01 |
---|---|
[Swift] 상속 (0) | 2024.04.01 |
[Swift] 메서드에 대하여 (0) | 2024.04.01 |
[Swift] 프로퍼티에 대하여 (0) | 2024.04.01 |
[Swift] Swift의 Struct (0) | 2024.04.01 |