Language/Swift

Swift 사용자 정의 타입 - Class

Greensky0026 2021. 3. 11. 15:41
반응형

클래스는 참조 타입입니다.

 구조체와 쓰임이 비슷하지만, 구조체와는 다르게 상속할 수있고,

deinit를 사용할수 있으며, 참조횟수 계산도 가능합니다.

또한, 클래스의 인스턴스에 타입 캐스팅이 가능합니다.

 

기본 형태

class ClassName{
	//구현부
}

 

예제

class Food{
    //불변 프로퍼티
    
    //가변 프로퍼티
    var name: String
    var price: Int
    //타입 프로퍼티
    final class var writer:String{
        return "녹색하늘"
    }
    class var location: String{
       return "안양"
    }

    //생성자
    init(){
        name = ""
        price = 0
    }
    
    init(name: String, price: Int){
        self.name = name
        self.price = price
    }
    
    //소멸자 : 클래스가 역할을 다하고 메모리에서 사라질 때 호출
    deinit{
        print("소멸되었습니다.")
    }
    
}

여기서, 생성자가 두종류입니다.

아이에 매개변수가 없는 생성자와 매개변수가 있는 생성자가 있죠?

이는 별도의 매개변수 없이도 인스턴스를 생성할 수 있게 해줍니다.

 

그리고 deinit 생소한 함수가 하나 있는데요,

해당 클래스의 인스턴스가 메모리 해제되기 직전 호출이 됩니다.

//init call
var food : Food? = Food(name: "스시",price: 4000)

//deinit call
food = nil //소멸되었습니다.

 

위 예제에 추가로 예시를 들어보겠습니다. Food 클래스 안에 아래의 메서드를 넣을 수 있을까요?

func print(){
	Swift.print("\(Food.location)에 있는\(self.name)의 가격은 \(self.price)입니다.")
더보기

클래스안의 인스턴스 메서드 내에서 타입 프로퍼티에 self 사용 불가합니다.

왜냐하면, 인스턴스 매서드는

클래스의 인스턴스에서 호출할 수 있기 때문이죠.

타입 프로퍼티는 인스턴스에서 접근이 불가능했죠? ㅎㅎ

 

그럼 반대는 어떨까요? 타입 메서드 안에 타입 프로퍼티 외의 프로퍼티를 사용할 수 있을까요?

static func print(){
	Swift.print("\(Food.location)에 있는\(Food.name)의 가격은 \(self.price)입니다.")
}

 

더보기

클래스 내부의 타입 메서드에서는 타입 프로퍼티 외에는 사용이 불가능합니다.

self가 아닌 Food를 참조해도 마찬가지입니다.

 

클래스 상속과 Override

 상속은 자식클래스(서브클래스)가 부모클래스(슈퍼클래스)의

프로퍼티와 메소드를 그대로 이어받는 것 입니다.

 Override는 부모클래스(슈퍼클래스)의 프로퍼티나 메소드를

자식메서드(서브클래스)가 재정의해서 사용하는것입니다.

위의 예제의 Food를 상속받는 detailFood 클래스를 만들어 보겠습니다.

 

상속 및 override

class DetailFood: Food{
    var restaurantName : String
    var phoneNumber : Int
    
    //자식클래스의 프로퍼티먼저 초기화한 후 super.init를 사용해야 한다.
    init(name : String, price : Int, restaurantName: String, phoneNumber: Int){
        self.restaurantName = restaurantName
        self.phoneNumber = phoneNumber
				//부모클래스의 이니셜라이저 호출
        super.init(name: name, price: price)
    }
    
    //class 타입 프로퍼티 override
    override class var location: String{
        return "강남"
    }

    /*
    부모클래스에서 final로 override를 막아놓아 사용 불가
    override class var writer: String{
        return "푸른하늘"
    }
    */

    func print(){
        Swift.print("\(restaurantName)의 전화번호는 \(phoneNumber)입니다.")
        Swift.print("\(name)는 \(price)입니다.")
    }
}

Food 클래스를 상속받아서 변수와 프로퍼티 메서드를 추가한 모습입니다.

이니셜라이저 또한 상속 및 override가 가능합니다.

print함수에서 detailFood에선 선언하지 않은 name과 price까지 사용한 것 보이시나요?

 

 

 추가적으로, 클래스의 인스턴스는 참조타입이라 불변으로 선언되었어도

인스턴스 프로퍼티의 값 변경이 가능합니다.

var food : Food? = Food(name: "스시",price: 4000)

food.name = "불고기"
food.price = "6000"

 

 

 


공부에 도움이 된 사이트들

 

전체적인 공부 가이드라인

yagom.net

 

야곰닷넷 - yagom.net

iOS 개발자들의 놀이터, 배움터, 모임터, 기록보관소 야곰닷넷입니다.

yagom.net

클래스와 구조체에 대한 상세한 설명 및 예시

https://minominodomino.github.io/devlog/2019/05/01/swift-class-struct/

 

[SWIFT] 클래스와 구조체(Class and Struct)

클래스와 구조체(Class and Struct)를 알아보자.

minominodomino.github.io

프로퍼티 상속 예제

https://zeddios.tistory.com/251

 

Swift ) Properties - Type Properties

자 < Stored Property(저장 프로퍼티)>에서 말했던 Swift에는 3가지 종류의 프로퍼티가 있다고 한 것 기억나시나요? 우리는 에서 저장프로퍼티를 봤고, 에서 연산프로퍼티를 봤습니다! 그리고...이제

zeddios.tistory.com

이니셜라이저 상속 및 orverride

https://m.blog.naver.com/PostView.nhn?blogId=jdub7138&logNo=220927306550&proxyReferer=https:%2F%2Fwww.google.com%2F

 

[아이폰 개발 | Swift 3] 초기화 (Initialization)

Swift 문서: Initialization https://developer.apple.com/library/content/documentation/Swift/Conce...

blog.naver.com

deinit에대한 자세한 내용

https://0urtrees.tistory.com/132

 

스위프트 문법, 메모리 해제 간 소멸자 Deinit 동작방식

Deinitialization 소멸자 소멸자(deinitializer)는 클래스 인스턴스가 메모리 해제될 때 즉시 호출되는 함수입니다. 스위프트의 소멸자는 deinit 키워드를 사용해서 사용할 수 있습니다. 그 작성방식은 생

0urtrees.tistory.com

반응형