반응형
Greensky0026
삽질러의 대환장 공사판
Greensky0026
전체 방문자
오늘
어제
  • 분류 전체보기 (241)
    • Language (56)
      • JAVA (13)
      • Swift (38)
      • Kotlin (4)
      • Dart (0)
      • PHP (0)
      • JavaScript (1)
    • IDE & Framework (92)
      • Spring (10)
      • Android (48)
      • iOS (8)
      • NodeJS (1)
      • CodeIgniter (3)
      • Flutter (1)
      • 분류중 (18)
    • Infra (8)
    • Database (12)
    • VCS (4)
    • Debug Log (34)
      • java (7)
      • swift (3)
      • Android (9)
      • Web (7)
      • 삽질기 (7)
    • Others (19)
      • 코딩테스트 풀이 (0)
      • IT 이야기 (18)
    • 쉼터 (2)
    • 개발공부 (14)
      • Network (1)
      • 자료구조와 알고리즘 (2)
      • Code design (8)
      • ETC (1)
      • 아카이브 (1)

블로그 메뉴

    공지사항

    • 프로그래머스 코딩 테스트 관련글 비공개 처리

    인기 글

    태그

    • map
    • 프로그래밍
    • level1
    • 공부
    • 개발
    • 예제
    • kotlin
    • xcode
    • Android
    • 프로그래머스
    • ios
    • JSP
    • 타입
    • swift
    • 구축
    • swfit
    • reduce
    • Java
    • IT
    • 코딩테스트

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    Greensky0026

    삽질러의 대환장 공사판

    Swift 사용자 정의 타입 - Class
    Language/Swift

    Swift 사용자 정의 타입 - Class

    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

    반응형

    'Language > Swift' 카테고리의 다른 글

    Swift 사용자 정의 타입 - 값타입과 참조 타입 [추가정리]  (0) 2021.03.11
    Swift 사용자 정의 타입 - enum  (0) 2021.03.11
    Swift 사용자 정의 타입 - Struct  (0) 2021.03.11
    Swift 옵셔널  (0) 2021.03.11
    Swift 반복문  (0) 2021.03.10
      'Language/Swift' 카테고리의 다른 글
      • Swift 사용자 정의 타입 - 값타입과 참조 타입 [추가정리]
      • Swift 사용자 정의 타입 - enum
      • Swift 사용자 정의 타입 - Struct
      • Swift 옵셔널
      Greensky0026
      Greensky0026
      점이 모여 선이 된다. 내 삽질도 언젠간 거대한 지하 도시가 되겠지!

      티스토리툴바