iOS/Swift

구조체와 클래스의 차이

밤새는 탐험가89 2024. 1. 18. 05:40

 

 

값 타입과 참조 타입

값 타입과 참조 타입의 가장 큰 차이점은 

값 타입 경우, 전달될 값이 복사 

참조 타입 경우, 전달될 값이 복사되는게 아니라, 참조(주소)가 전달

 

 

값 타입과 참조 타입 차이

// 구조체 예시
struct PersonStruct {
    var name: String
    var age: Int
    
    // 구조체에서 멤버 메서드를 정의할 수 있습니다.
    func printInfo() {
        print("Struct - Name: \(name), Age: \(age)")
    }
}

// 클래스 예시
class PersonClass {
    var name: String
    var age: Int
    
    // 클래스에서는 초기화 메서드를 사용해야 합니다.
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    // 클래스에서는 멤버 메서드를 정의할 수 있습니다.
    func printInfo() {
        print("Class - Name: \(name), Age: \(age)")
    }
}

// 구조체와 클래스의 사용 예시
var personStruct = PersonStruct(name: "John", age: 25)
var personClass = PersonClass(name: "Jane", age: 30)

// 구조체는 값 타입이므로 새로운 복사본이 생성됩니다.
var anotherPersonStruct = personStruct
anotherPersonStruct.name = "Steve"

// 클래스는 참조 타입이므로 동일한 객체를 참조합니다.
var anotherPersonClass = personClass
anotherPersonClass.name = "Emily"

// 각각의 인스턴스의 정보 출력
personStruct.printInfo()    // Struct - Name: John, Age: 25
anotherPersonStruct.printInfo()  // Struct - Name: Steve, Age: 25

personClass.printInfo()    // Class - Name: Jane, Age: 30
anotherPersonClass.printInfo()  // Class - Name: Emily, Age: 30

 

 

 

클래스

1. 참조 타입 

클래스는 참조 타입이므로 인스턴스가 메모리에 한 번만 적재되고 참조

여러 곳에서 하나의 인스턴스를 공유하고 변경할 필요가 있을 때 사용 

 

2. 상속 및 다형성

클래스는 상속을 지원하므로 다른 클래스의 특성을 상속하여 코드 재사용 가능

다형성을 활용하여 유연하게 코드 작성

 

3. 두 가지 초기화 방법

지정과 편의 이니셜라이저를 모두 제공

 

4. 비동기 작업

비동기 작업, 동시성, 멀티스레드 프로그래밍에 적합

 

5. 데이터의 동적인 특성

런타임에 객체의 속성을 추가히거나 변경할 수 있는 

다이나믹한 특성이 필요한 경우 사용 

 

 

 

구조체 

1. 값타입

구조체는 값 타입으로 복사되어 전달 및 변경될 때에는 새로운 복사본이 생성

간단한 데이터를 표현 및 전달할 때 유용

 

2. 불변성

구조체는 일반적으로 불변성을 가짐

(즉, 속성 값의 변경이 불가능한 경우 많음)

불변성은 코드를 예측 가능하게 만들어 안전성을 높임

 

3. 값 복사 

값이 복사되므로 여러 곳에서 각각의 독립적인 인스턴스를 가질 수 있음

멀티스레드 환경에서 상태 변경에 대한 걱정이 줄어듬

 

4. 프로토콜과 확장을 활용한 기능 추가 

구조체는 포로토콜을 채택하고 확장을 통해 기능 추가 

 

5. 단순한 데이터 모델 

단순한 데이터 구조를 표현 또는 기본적인 기능을 제공할 때 사용 

 

 

----------

값을 전달하고 복사할 때 -> "구조체"

 

동일한 객체를 참조하고 공유할 때 -> "클래스"

 

불변성이 필요하거나 단순한 데이터를 표현할 때 -> "구조체"

 

상속이 필요하거나 참조 타입이 필요할 때 -> "클래스"

 

 

'iOS > Swift' 카테고리의 다른 글

프로퍼티 2편 (연산 프로퍼티)  (0) 2024.01.22
프로퍼티 1편 (저장 프로퍼티)  (0) 2024.01.19
클래스  (0) 2024.01.17
구조체  (0) 2024.01.17
옵셔널  (0) 2024.01.16