iOS 공부하는 감자

Day7) 클래스와 구조체 본문

22 베이직 챌린지

Day7) 클래스와 구조체

DongTaTo 2022. 1. 9. 13:07
반응형

클래스와 구조체

  • 클래스와 구조체를 정의하는 것은 새로운 데이터 타입을 생성하는 것이다.
  • 데이터 타입의 이름에는 대문자 카멜케이스를 사용하므로 클래스와 구조체의 이름 또한 대문자 카멜케이스로 정의해야 한다.
  • 클래스와 구조체 내부의 프로퍼티와 메서드는 소문자 카멜케이스를 사용한다.
  • 클래스나 구조체를 통해 생성된 인스턴스의 프로퍼티 또는 메서드에 접근하려면 인스턴스 이름에 점연산자를 사용하여 접근 가능하다.

 

 


 

클래스 (Class)

  • 클래스끼리 상속이 가능하다.
  • 클래스의 인스턴스는 참조 타입으로 해당 인스턴스를 상수(let)으로 선언해도 내부 프로퍼티 값을 변경할 수 있다.
  • 클래스를 정의할 때 직접 이니셜라이저를 작성해야 한다.
  • 디 이니셜라이저(deinit)를 사용하여 인스턴스가 소멸되기 직전에 실행할 작업을 작성할 수 있다.
  • class Person {
        // 저장 프로퍼티
        var name: String
        var age: Int
        
        // 이니셜라이저
        init(name: String, age: Int) {
            self.name = name
            self.age = age
        }
        
        // 디 이니셜라이저
        deinit {
            print("Person 클래스의 인스턴스 소멸")
        }
    }
    
    var dong: Person? = Person(name: "dong", age: 25)
    
    dong = nil  // Person 클래스의 인스턴스 소멸

 

 

 

구조체 (Struct)

  • 구조체는 상속이 불가능하다.
  • 구조체의 인스턴스는 값 타입으로 구조체를 사용하여 생성한 인스턴스를 상수(let)으로 선언하면 내부 프로퍼티도 수정 불가능하다.
  • 구조체의 인스턴스를 변수(var)로 선언했더라도 구조체를 정의한 부분에서 해당 프로퍼티를 상수(let)로 선언했다면 수정 불가
  • 이니셜라이저가 자동으로 생성된다.
  • struct Person {
        // 저장 프로퍼티
        var name: String
        var age: Int
        
        // 이니셜라이저 - 없어도 잘 작동, 있어도 상관없음
    //    init(name: String, age: Int) {
    //        self.name = name
    //        self.age = age
    //    }
        
        // 구조체에서는 deinit 사용 불가
    //    deinit {
    //        print("Person 클래스의 인스턴스 소멸")
    //    }
    }
    
    // 이니셜라이저를 자동으로 생성
    let dong: Person = Person(name: "dong", age: 25)
    
    dong.age += 1   // 인스턴스를 상수로 선언해서 오류 발생

 


 

 

구조체와 클래스의 차이

같은 점

  • 값을 저장하기 위해 프로퍼티를 정의할 수 있다.
  • 기능 실행을 위한 메서드를 정의할 수 있다.
  • 서브스크립트 문법을 통해 구조체 또는 클래스가 갖는 값(프로퍼티)에 접근하도록 서브스크립트를 정의할 수 있다.
  • 초기화될 때의 상태를 지정하기 위해 이니셜라이저를 정의할 수 있다.
  • 초기구현에 새로운 기능 추가를 위해 익스텐션을 사용하여 기능 확장이 가능하다.
  • 특정 기능의 실행을 위해 특정 프로토콜을 준수할 수 있다.

다른 점

  • 클래스는 상속이 가능하지만 구조체는 상속할 수 없다.
  • 타입캐스팅은 클래스의 인스턴스에만 해당된다.
  • 디이니셜라이저(deinit)은 클래스의 인스턴스에서만 사용 가능하다.
  • 참조 횟수 계산(reference count)는 클래스의 인스턴스에만 적용된다.

 

 

 


 

무엇을 선택해서 사용할까?

  • 애플 개발자 문서에서 언제 어떤것을 사용하면 좋을지에 대한 가이드라인을 제시해준다.
    • 기본적으로 구조체를 사용한다.
    • Object-C로 작성된 무언가와 연관되어 있다면 클래스를 사용한다.
    • 모델링 중인 데이터에 대하여 직접 동일성을 제어해야 한다면 클래스를 사용한다. (클래스의 인스턴스는 참조타입이기 때문
반응형