일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- SWiFT
- c언어
- 재귀
- 암호수학
- web
- ftz
- 미로 탐색 알고리즘
- 파이썬
- 정렬 알고리즘
- 두근두근 자료구조
- War Game
- 자료구조
- LoB
- 스택
- 백준
- 큐
- HTML
- 시간복잡도
- OSI
- ftz level13
- Stack
- pwnable.kr
- System
- windosw 문자열
- windosws wbcs
- C
- level13
- Java
- PHP
- 파일 시스템
Archives
- Today
- Total
나의 기록, 현진록
[Swift] 구조체와 클래스의 차이 / 식별연산자 본문
반응형
스위프트 프로그래밍 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)나 물건의 크기를 표현하는 가로, 세로, 높이 등이 있습니다.
반응형
'Programming > Swift' 카테고리의 다른 글
[Swift] 10.1.3 연산 프로퍼티 / 접근자와 설정자 (0) | 2021.07.16 |
---|---|
[Swift] 10.1.2 지연 저장 프로퍼티 (0) | 2021.07.16 |
[Swift] 구조체와 클래스 (0) | 2021.07.15 |
[Swift] 8.2.2 옵셔널 바인딩 (0) | 2021.07.14 |
[Swift] 8.1 옵셔널 (0) | 2021.07.13 |