나의 기록, 현진록

[Swift] 구조체와 클래스의 차이 / 식별연산자 본문

Programming/Swift

[Swift] 구조체와 클래스의 차이 / 식별연산자

guswlsdk 2021. 7. 15. 14:56
반응형

스위프트 프로그래밍 3판 - 야곰 지음

 

 

9.3 구조체와 클래스의 차이

같은점

  • 값을 저장하기 위해 프로퍼티를 정의할 수 있습니다.
  • 기능 실행을 위해 메소드를 정의할 수 있습니다.
  • 서브스크립트 문법을 통해 구조체 또는 클래스가 갖는 값(프로퍼티)에 접근하도록 서브스크립트를 정의할 수 있습니다.
  • 초기화될 때의 상태를 저장하기 위해 이니셜라이저를 정의할 수 있습니다.
  • 초기 구현과 더불어 새로운 기능 추가를 위해 익스텐션을 통해 확장할 수 있습니다.
  • 특정 기능을 실행하기 위해 특정 프로토콜을 준수할 수 있습니다.

다른점

  • 구조체는 상속할 수 없습니다.
  • 타입캐스팅은 클래스의 인스턴스에만 허용됩니다.
  • 디이니셜라이저는 클래스의 인스턴스에만 활용할 수 있습니다.
  • 참조 횟수 계산은 클래스의 인스턴스에만 적용됩니다.

 

두 타입을 구분 짓는 가장 큰 차이점은 값 타입참조 타입입니다.

 

9.3.1 값 타입과 참조 타입

구조체는 값 타입, 클래스는 참조 타입입니다. 이 둘의 큰 차이는 "무엇이 전달되느냐"로 말할 수 있습니다. 예를 들어 어떤 함수의 전달인자로 값 타입의 값을 넘긴다면 전달될 값이 복사되어 전달됩니다. 그러나 참조 타입이 전달인자로 전달될 때는 값을 복사하지 않고 참조(주소)가 전달됩니다. 타 언어에서 사용되는 포인터와 유사한 개념이지만 *를 따로 사용하진 않습니다.

 

struct BasicInformation{
    let name: String
    var age: Int
}

var hyunjinInfo: BasicInformation = BasicInformation(name: "hyunjin", age: 111)
hyunjinInfo.age = 100

var friendInfo: BasicInformation = hyunjinInfo

print("hyunjin's age : \(hyunjinInfo.age)")
print("friend's age : \(friendInfo.age)")

friendInfo.age = 111

print("hyunjin's age : \(hyunjinInfo.age)")
print("friend's age : \(friendInfo.age)")

class Person{
    var height: Float = 0.0
    var weight: Float = 0.0
}

var hyunjin: Person = Person()
var friend: Person = hyunjin

print("hyunjin's height : \(hyunjin.height)")
print("friend's height : \(friend.height)")

friend.height = 185.5

print("hyunjin's height : \(hyunjin.height)")
print("friend's height : \(friend.height)")

func changeBasicInfo(_ info: BasicInformation){
    var copiedInfo: BasicInformation = info
    copiedInfo.age = 1
}
func changePersonInfo(_ info: Person){
    info.height = 155.3
}

changeBasicInfo(hyunjinInfo)
print("hyunjin's age: \(hyunjinInfo.age)")

changePersonInfo(hyunjin)
print("hyunjin's height \(hyunjin.height)")

 

코드와 결과를 보며 이해할 수 있다.

 

 

클래스의 인스턴스끼리 참조가 같은지 확인할 때는 식별 연산자를 사용한다.

 

class Person{
    var height: Float = 0.0
    var weight: Float = 0.0
}


var hyunjin: Person = Person()
let friend: Person = hyunjin
let anotherFriend: Person = Person()

print(hyunjin === friend)
print(hyunjin === anotherFriend)
print(friend !== anotherFriend)

 

 

 

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

구조체와 클래스는 프로젝트의 성격에 따라, 데이터의 활용에 따라 둘 중 하나를 선택해서 사용해야 합니다.

 

애플은 가이드라인에서 다음 조건 중 하나 이상에 해당한다면 구조체를 사용하는 것을 권장합니다.

 

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

 

가장 적합한 예로는 좌표계(x, y)나 물건의 크기를 표현하는 가로, 세로, 높이 등이 있습니다.

 

 

 

 

반응형