iOS/Swift

[Swift] 구조체(struct) vs 클래스(class)

겸둥이xz 2021. 2. 19. 14:45
반응형

 

구조체(struct)와 클래스(class)

공통점

  • 값을 저장하기 위해 프로퍼티를 정의할 수 있다.
  • 기능 수행을 위해 메서드를 정의할 수 있다.
  • 서브스크립트 문법을 통해 구조체 또는 클래스가 가지는 값에 접근하도록 서브스크립트 정의 가능.
  • 초기화될 때의 상태를 지정하기 위해 이니셜라이저 정의 가능.
  • extension을 통해 확장 가능.
  • 특정 protocol 준수 가능.

차이점

  • 구조체(struct)
    • 값 타입(Call by Value) : 데이터를 전달 할 때 값을 복사하여 전달.
    • Stack memory 영역에 할당
    • 상속 불가능 
  • 클래스(class)
    • 참조 타입(Call by Reference) : 데이터를 전달 할 때 값의 메모리 위치를 전달.
    • Heap memory 영역에 할당
    • 상속 가능
struct ValueType {
    var property = 1
}

class ReferenceType {
    var property = 1
}

// 첫 번째 구조체 인스턴스
let firstStructInstance = ValueType()

// 두 번째 구조체 인스턴스에 첫 번째 인스턴스 값 복사
var secondStructInstance = firstStructInstance

// 두 번째 구조체 인스턴스 프로퍼티 값 수정
secondStructInstance.property = 2

// 두 번째 구조체 인스턴스는 첫 번째 구조체를 똑같이 복사한 
// 별도의 인스턴스이기 때문에 
// 두 번째 구조체 인스턴스의 프로퍼티 값을 변경해도
// 첫 번째 구조체 인스턴스의 프로퍼티 값에는 영향이 없음
print("first struct instance property : \(firstStructInstance.property)")    // 1
print("second struct instance property : \(secondStructInstance.property)")  // 2


// 클래스 인스턴스 생성 후 첫 번째 참조 생성
let firstClassReference = ReferenceType()
// 두 번째 참조 변수에 첫 번째 참조 할당
let secondClassReference = firstClassReference
secondClassReference.property = 2

// 두 번째 클래스 참조는 첫 번째 클래스 인스턴스를 참조하기 때문에
// 두 번째 참조를 통해 인스턴스의 프로퍼티 값을 변경하면
// 첫 번째 클래스 인스턴스의 프로퍼티 값을 변경하게 됨
print("first class reference property : \(firstClassReference.property)")    // 2
print("second class reference property : \(secondClassReference.property)")  // 2

 

구조체와 클래스 선택해서 사용하기

구조체와 클래스는 새로운 데이터 타입을 정의하고 기능을 추가한다는 점에서는 같다. 하지만 구조체 인스턴스는 항상 값 타입, 클래스 인스턴스는 참조 타입이다.

 

생김새는 비슷하지만 용도는 다르다는 의미이다. 프로젝트의 성격에 따라, 데이터의 활용 용도에 따라, 특정 타입을 구현할 때 구조체와 클래스 둘 중 하나를 선택해서 사용해야한다.

 

Apple은 가이드라인에서 다음 조건 중 하나 이상에 해당된다면 구조체(struct) 사용을 권한다.

  • 연관된 간단한 값의 집합을 캡슐화 하는 것만이 목적일 때
  • 캡슐화된 값이 참조보다 복사되는 것이 합당할 때
  • 구조체에 저장된 프로퍼티가 값 타입이며 참조보다 복사되는 것이 합당할 때
  • 다른 타입으로부터 상속받거나 자신이 상속될 필요가 없을 때

 

 

 

<참고 자료>

blog.yagom.net/530/

BoostCourse - iOS 프로그래밍을 위한 스위프트 기초 : www.boostcourse.org/mo122/lecture/11274/

반응형