Struct VS Class

Gooreum·2021년 10월 28일
0

Swift

목록 보기
4/16

구조체와 클래스

  • 구조체와 클래스는 프로그래머가 데이터를 용도에 맞게 묶어 표현하고자 할 때 유용하다.
  • 구조체와 클래스는 프로퍼티와 메서드를 사용하여 구조화된 데이터와 기능을 가질 수 있다.
  • 하나의 새로운 사용자 정의 데이터 타입을 만들어 주는 것이다.
  • 둘의 가장 큰 차이점은 구조체의 인스턴스는 값 타입이고, 클래스의 인스턴스는 참조 타입이다.
  • 스위프트가 구조체, 클래스를 다룰 때 있어 다른 언어와 차이점은 소스파일 하나에 여러 개의 구조체와 여러 개의 클래스를 정의하고 구현해도 문제가 없다는 점이다.
  • 또, 중첩 함수와 마찬가지로 구조체 안에 구조체, 클래스 안에 클래스 등과 같이 중첩 타입의 정의 및 선언이 가능하다.

구조체 정의

  • struct를 붙여준다.

구조체 인스턴스의 생성 및 초기화

  • 구조체 정의를 마친후, 인스턴스를 생성하고 초기화하고자 할 때는 기본적으로 생성되는 멤버와이즈 이니셜라이저를 사용한다. 구조체에 기본 생성된 이니셜라이저의 매개변수는 구조체의 프로퍼티 이름으로 자동 지정된다.
  • 기본 제공되는 멤버와이즈 이니셜라이저 외에 사용자 정의 이니셜라이저도 구현 가능하다.
  • 구조체를 상수 let으로 선언하면 인스턴스 내부의 프로퍼티 값을 변경할 수 없고, 변수 var로 선언하면 내부의 프로퍼티가 var로 선언된 경우에 값을 변경해줄 수 있다.

클래스 정의

  • class 키워드 사용

클래스 인스턴스의 생성과 초기화

  • 구조체와는 다르게 클래스의 인스턴스는 참조 타입이므로 클래스의 인스턴스를 상수 let으로 선ㅇ너해도 내부 프로퍼티 값을 변경할 수 있다.
  • 기본 이니셜라이저 외에 사용자가 직접 이니셜라이저를 정의할 수도 있다.

클래스 인스턴스의 소멸

  • 클래스의 인스턴스는 참조 타입이므로 더는 참조할 필요가 없을 때 메모리에서 '해제' 된다.
  • 이 과정을 소멸이라고 하는데, 소멸되기 직전 deinit라는 메서드가 호출된다.
  • 클래스 내부에 deinit 메서드를 구현해주면 소멸되기 직전 deinit 메서드가 호출된다.
  • 이렇게 호출되는 deinit메서드는 '디이니셜라이저'라고 부른다.
  • deinit 메서드는 매개변수를 위한 소괄호도 적어주지 않는다.
  • 보통 deinit 메서드에는 인스턴스가 메모리에서 해제되기 직전에 처리할 코드를 넣어준다.

구조체와 클래스의 차이

  • 비슷한점
    • 값을 저장하기 위해 프로퍼티를 정의할 수 있다.
    • 기능 실행을 위해 메서드를 정의할 수 있다.
    • 서브스크립트 문법을 통해 구조체 또는 클래스가 갖는 값(프로퍼티)에 접근하도록 서브스크립트를 정의할 수 있다.
    • 초기화될 때의 상태를 지정하기 위해 이니셜라이저를 정의할 수 있다.
    • 초기구현과 더불어 새로운 기능 추가를 위해 익스텐션을 통해 확장할 수 있다.
    • 특정 기능을 실행하기 위해 특정 프로토콜을 준수할 수 있다.
  • 차이
    • 구조체는 상속할 수 없다.
    • 타입캐스팅은 클래스의 인스턴스에만 허용된다.
    • 디이니셜라이저는 클래스의 인스턴스에만 활용할 수 있다.
    • 참조횟수계산(Reference Counting)은 클래스의 인스턴스에만 적용된다.

값 타입과 참조 타입

  • 값 타입과 참조 타입의 가장 큰 차이는 '무엇이 전달되느냐' 이다.
  • 값 타입의 데이터를 함수의 전달인자로 전달하면 메모리에 전달인자를 위한 인스턴스가 새로 생성된다. 생성된 새 인스턴스에는 전달하려는 값이 복사되어 들어간다.
  • 반면 참조타입의 데이터는 전달인자로 전달할 때 기존 인스턴스의 참조를 전달하므로 새로운 인스턴스가 아닌 기존의 인스턴스 참조를 전달한다.
  • 함수의 전달인자뿐만 아니라 새로운 변수에 할당될 때 또한 마찬가지이다.
  • 클래스의 인스턴스끼리 참조가 같은지 확인할 때는 식별 연산자(identity operators)를 사용한다.

스위프트의 기본 데이터 타입은 모두 구조체

  • 스위프트의 기본 타입(Bool, Int, Array, Dictionary, Set, String 등등) 모두 구조체로 구현되어 있다.
  • 이는 기본 데이터 타입은 모두 '값 타입'이라는 뜻이다.
  • 전달인자를 통해 데이터를 전달하면 모두 값이 복사되어 전달될 뿐, 함수 내부에서 아무리 전달된 값을 변경해도 기존의 변수나 상수에는 전혀 영향을 미치지 못한다.
  • 이런 점을 더욱 확실히 하기 위해 스위프트의 전달인자는 모두 상수로 취급되어 전달되는 것일지도 모른다.
profile
하루하루 꾸준히

0개의 댓글