본문 바로가기
카테고리 없음

7. 구조체(Struct)와 클래스(Class)

by swifttt 2025. 3. 30.

 

Swift에서 데이터를 표현하고 다루는 데 가장 기본이 되는 두 가지 유형은 구조체(Struct)와 클래스(Class)입니다.
이 둘은 매우 비슷한 문법을 갖지만, 중요한 차이점을 가지고 있으며 용도에 따라 선택적으로 사용해야 합니다.

Swift는 구조체 중심 언어(structure-oriented language)로 설계되었기 때문에, 클래스보다 구조체를 더 자주 사용하게 됩니다.

1. 구조체 정의와 사용

구조체는 struct 키워드를 사용하여 정의하며, 프로퍼티(속성)와 메서드(함수)를 포함할 수 있습니다.

struct User {
    var name: String
    var age: Int

    func introduce() {
        print("저는 \(name)이고, \(age)세입니다.")
    }
}

let user1 = User(name: "지민", age: 28)
user1.introduce()

구조체는 기본적으로 값 타입(value type)으로 동작하며, 변수에 할당하거나 함수에 전달할 때 복사됩니다.

2. 클래스 정의와 사용

클래스는 class 키워드를 사용하여 정의하며, 구조체와 유사한 방식으로 프로퍼티와 메서드를 가질 수 있습니다.
그러나 클래스는 참조 타입(reference type)입니다.

class Person {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }

    func greet() {
        print("안녕하세요, \(name)입니다.")
    }
}

let person1 = Person(name: "민호", age: 35)
person1.greet()

클래스는 초기화를 위해 init() 메서드를 필수로 구현해야 하며, 인스턴스는 힙(heap) 메모리에 저장됩니다.

3. 값 타입과 참조 타입의 차이

이 두 타입의 가장 큰 차이는 할당 시 복사 여부입니다.

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

var p1 = Point(x: 3, y: 5)
var p2 = p1
p2.x = 10

print(p1.x) // 3
print(p2.x) // 10

구조체는 복사되어 독립적인 두 개의 인스턴스를 갖게 됩니다.

class Location {
    var x: Int
    var y: Int
    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
}

var l1 = Location(x: 3, y: 5)
var l2 = l1
l2.x = 10

print(l1.x) // 10
print(l2.x) // 10

클래스는 참조를 공유하므로, 하나를 변경하면 다른 쪽에도 영향을 미칩니다.

4. 구조체와 클래스 선택 기준

Swift에서 구조체는 다음과 같은 경우에 적합합니다.

  • 데이터의 값 복사가 필요할 때
  • 상속이 필요하지 않을 때
  • 비교적 작고 단순한 데이터 모델일 때

클래스는 다음과 같은 상황에서 사용합니다.

  • 참조를 공유하거나 상속이 필요한 경우
  • 상태를 추적하거나 동일 인스턴스를 여러 곳에서 조작할 필요가 있는 경우

5. 기타 기능 차이

항목 구조체(Struct) 클래스(Class)
타입 값 타입 참조 타입
상속 불가능 가능
초기화 메서드 자동 제공 직접 구현 필요
ARC 적용 여부 적용되지 않음 적용됨 (메모리 관리)
Copy 동작 복사됨 참조 공유

마무리

구조체와 클래스는 Swift에서 매우 중요한 타입이며, 용도와 동작 방식이 다릅니다. Swift는 성능과 안정성을 위해 기본적으로 구조체를 우선 사용하도록 권장합니다. 그러나 참조 공유, 상속 등 객체 지향적 특성이 필요한 경우에는 클래스를 선택하는 것이 올바릅니다.