[Swift] (복습) Struct & Class / 구조체 & 클래스

2022. 9. 1. 01:17🍏/Swift 기초 공부

구조체와 클래스

구조체 (Struct)

  • 값 타입.
  • 애플은 성능과 안정성 측면에서 구조체 사용을 권장합니다.
  • 사용 사례:
    1. 데이터를 복사해야 할 때.
    2. 상속이 필요하지 않을 때.
    3. 데이터를 캡슐화하면서 비교적 간단한 로직만 필요할 때.
    4. 서로 연관된 몇 개의 기본 데이터 타입들을 캡슐화하여 묶는 것이 목적일 때
    5. 캡슐화된 데이터에 상속이 필요하지 않을 때
    6. 캡슐화된 데이터를 전달하거나 할당하는 과정에서 참조 방식보다는 값이 복사되는 것이 합리적일 때
    7. 캡슐화된 원본 데이터를 보존해야 할 때

클래스 (Class)

  • 참조 타입.
  • 상속, 다형성, 객체 간 데이터 공유가 필요할 때 사용합니다.
  • 사용 사례:
    1. 상속이 필요할 때.
    2. 여러 객체가 동일한 데이터 인스턴스를 참조해야 할 때.
    3. 런타임에 객체의 생명 주기를 관리해야 할 때.
    4. 구조체의 사용사례에서 벗어날 때 일반적으로 구조체보다는 클래스를 정의하여 사용하는 것이 좋음.
      상수나 변수에 할당할 때도 값의 복사가 발생하지 않기 때문에 여러 곳에서 할당하더라도 메모리의 낭비가 없으며, 인스턴스가 늘어나지 않으므로 코딩상에서도 혼란이 적음.

구분 요약

특징 구조체(Struct) 클래스(Class)
타입 값 타입 참조 타입
상속 지원 여부 지원하지 않음 지원
메모리 관리 방식 스택 메모리 (주로 Copy on Write) 힙 메모리 (참조 카운트 기반)
성능 가볍고 빠름 무겁고 느릴 수 있음

 

 

 

- 독자적인 프로세스 수행 능력 덕분에 매우 강력한 사용성을 지닌다.
이 때문에 스위프트가 언어적으로 유연성을 가질 수 있게 하는 근간이 된다.
여기서 말하는 유연성이란 코드를 떼어서 다른 곳으로 옮기거나 새로운 코드를 추가하기 쉽다는 뜻.

유연성 <=> 의존성

의존성이 강한 코드는 분리할 때 떼어 내어야 하는 부분이 많다.

구조체와 클래스 내에서 정의된 변수와 상수, 그리고 함수는 부르는 명칭이 다르다.
변수와 상수는 프로퍼티(Properties)라고 정의. 속성 변수 또는 속성 상수라고도 불림
함수는 메소드(Method)라고 불린다. 이는 변수와 상수, 함수가 구조체나 클래스 안에 들어가면서 특별한 성격을 갖기 때문

프로퍼티와 메소드를 합해서 구조체나 클래스의 멤버라고 표현.

스위프트는 기본적으로 객체지향의 언어이며, 필요한 기능을 객체로 구현하여 사용.
이때 객체를 만들어내는 주요 대상이 바로 구조체와 클래스.

 

구조체와 클래스의 공통점
프로퍼티 변수나 상수를 사용하여 값을 저장하는 프로퍼티를 정의
메소드 함수를 사용하여 기능을 제공하는 메소드를 정의
서브스크립트 속성값에 접근할 수 있는 방법을 제공하는 서브스크립트를 정의
초기화 블록 객체를 원하는 초기 상태로 설정해주는 초기화 블록을 정의
확장 객체에 함수적 기능을 추가하는 확장(extends) 구문을 사용 가능
프로토콜 특정 형식의 함수적 표준을 제공하기 위한 프로토콜을 구현

 

클래스 기준의 구조체와의 차이점 (클래스가 할 수 있는 기능)
상속 클래스의 특성을 다른 클래스에게 상속 가능
타입 캐스팅 실행 시 컴파일러가 클래스 인스턴스의 타입을 미리 파악하고 검사 가능
소멸화 구문 인스턴스가 소멸되기 직전에 처리해야 할 구문을 미리 등록 가능
참조에 의한 전달 클래스 인스턴스가 전달될 대에는 참조 형식으로 제공되며, 이때 참조가 가능한 개수는 제약이 없다.