Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

[Swift] Swift의 Class 본문

iOS/문법

[Swift] Swift의 Class

김먐 2024. 4. 1. 00:42

여러 프로퍼티와 메서드를 담아 이를 묶어 하나의 사용자 정의 데이터 타입으로 만든 것

구조체와 정의는 동일하다.

따라서 클래스에서도 구조체처럼 프로퍼티, 메서드 등을 사용하기도 하는데

클래스에서는 구조체와 구분되는 플러스 알파적인 기능들이 있음.

  • 상속을 사용하면 한 클래스가 다른 클래스의 특성을 상속할 수 있습니다.
  • 타입 캐스팅을 사용하면 런타임에 클래스 인스턴스의 타입을 확인하고 해석할 수 있습니다.
  • 초기화 해제 구문 (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 초기화 구문 가튼 거 없다.

 

 

따라서 클래스 내부의 프로퍼티는

  1. 기본값을 지정해 주기
  2. 초기화 구문을 추가해 주기

둘 중에 하나는 꼭 필요함.

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