IOS개발: SWIFT/4. 객체 지향 프로그래밍 심화

Swift의 클래스와 구조체

_Blue_Sky_ 2024. 9. 12. 15:32
728x90
728x90

Swift의 클래스와 구조체: 자세한 비교와 예시

Swift에서 클래스와 구조체는 데이터를 저장하고 기능을 수행하는 데 사용되는 중요한 개념입니다. 비슷해 보이지만 몇 가지 중요한 차이점이 있습니다. 이 차이점을 이해하는 것은 효율적이고 안전한 코드를 작성하는 데 필수적입니다.

1. 값 타입 vs. 참조 타입

  • 구조체(Struct): 값 타입입니다. 변수에 구조체를 할당하면 값이 복사되어 새로운 인스턴스가 생성됩니다. 즉, 원본 값은 변경되지 않습니다.
  • 클래스(Class): 참조 타입입니다. 변수에 클래스 인스턴스를 할당하면 메모리의 같은 객체를 참조하는 포인터가 할당됩니다. 따라서 하나의 인스턴스를 여러 변수에서 참조할 수 있으며, 한 변수에서 값을 변경하면 다른 변수에서도 변경된 값이 반영됩니다.

2. 상속

  • 구조체: 상속을 지원하지 않습니다. 즉, 다른 구조체로부터 기능을 상속받을 수 없습니다.
  • 클래스: 상속을 지원합니다. 부모 클래스의 프로퍼티와 메서드를 상속받아 코드 재사용성을 높일 수 있습니다.

3. 초기화

  • 구조체: 멤버와 동일한 이름의 프로퍼티를 가진 이니셜라이저를 통해 초기화됩니다.
  • 클래스: 지정 이니셜라이저와 편의 이니셜라이저를 사용하여 초기화할 수 있으며, 상속을 통해 초기화 과정을 커스터마이징할 수 있습니다.

4. 타입 캐스팅

  • 구조체: 값 타입이므로 타입 캐스팅 시 값이 복사됩니다.
  • 클래스: 참조 타입이므로 타입 캐스팅 시 참조가 변경됩니다.

5. 디이니셜라이저

  • 구조체: 디이니셜라이저를 사용할 수 없습니다.
  • 클래스: 디이니셜라이저를 사용하여 인스턴스가 메모리에서 해제되기 전에 필요한 정리 작업을 수행할 수 있습니다.

예시

struct Point {
    var x: Int
    var y: Int
}

class Shape {
    var name: String

    init(name: String) {
        self.name = name
    }
}

class Circle: Shape {
    var radius: Double

    init(radius: Double) {
        self.radius = radius
        super.init(name: "Circle")
    }
}
 
  • Point: 값 타입으로, 좌표를 나타냅니다.
  • Shape: 부모 클래스로, 도형의 기본적인 정보를 저장합니다.
  • Circle: Shape을 상속받아 원을 나타내는 클래스입니다.
var point1 = Point(x: 1, y: 2)
var point2 = point1 // point1의 복사본이 생성됨
point2.x = 3 // point1의 x 값은 변경되지 않음

var shape = Shape(name: "Square")
var circle = Circle(radius: 5.0)
 

언제 클래스를, 언제 구조체를 사용해야 할까요?

  • 구조체:
    • 값이 복사되는 것이 적절한 경우 (예: 좌표, 크기, 색상 등)
    • 작고 간단한 데이터를 나타내는 경우
    • 상속이 필요 없는 경우
  • 클래스:
    • 복잡한 객체를 표현하고 싶을 때
    • 상속을 통해 코드를 재사용하고 싶을 때
    • identity를 가지는 객체를 표현하고 싶을 때 (예: 사용자, 계정 등)

결론

Swift에서 클래스와 구조체는 서로 다른 특징을 가지고 있으며, 사용 목적에 따라 적절한 타입을 선택해야 합니다. 값 타입인 구조체는 안전하고 효율적인 코드를 작성하는 데 도움이 되며, 참조 타입인 클래스는 복잡한 객체를 모델링하고 상속을 통해 코드를 재사용하는 데 유용합니다.

요약:

특징구조체클래스
타입 값 타입 참조 타입
상속 불가 가능
초기화 멤버와 동일한 이름의 프로퍼티를 가진 이니셜라이저 지정 이니셜라이저, 편의 이니셜라이저
타입 캐스팅 값 복사 참조 변경
디이니셜라이저 사용 불가 사용 가능

 

728x90
728x90