티스토리 뷰
[시작]
- 구조체와 클래스는 프로그래머가 데이터를 용도에 맞게 묶어 표현하고자 할 때 사용함
- Swift에서 구조체의 인스턴스는 값 타입, 클래스의 인스턴스는 참조 타입
- 소스 파일 하나에 여러 개의 구조체와 여러 개의 클래스를 정의하고 구현 가능
- 중첩 타입의 정의 및 선언 가능
[구조체]
1 2 3 4 5 6 7 8 9 10 11 12 | struct MyInfo{ let name: String let age: Int let city: String func printInfo(){ print(name, age, city) } //구조체에 메서드 정의 가능 } let myInfo: MyInfo = MyInfo(name: "Name", age: 13, city: "What") myInfo.printInfo() | cs |
[클래스]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class MyInfo{ let name: String let height: Double let favorite: String init() { name = "HIHI" height = 1234 favorite = "AJVJ" } deinit { print("MyInfo 인스턴스 소멸") } //소멸자 : 인스턴스가 메모리에서 해제되기 직전 호출 } var myInfo: MyInfo? = MyInfo() myInfo = nil //MyInfo 인스턴스 소멸 출력 | cs |
[구조체와 클래스의 차이]
- 공통점
: 프로퍼티를 정의하여 값을 저장할 수 있음
: 메서드를 정의하여 기능을 실행할 수 있음
: 서브스크립트를 정의하여 구조체 또는 클래스가 갖는 값에 접근할 수 있음
: 생성자를 정의하여 초기화될 때의 상태를 지정할 수 있음
: 익스텐션을 통해 새로운 기능을 추가할 수 있음
: 특정 프로토콜을 준수하여 특정 기능을 실행할 수 잇음
- 차이점
: 구조체는 상속 불가능
: 타입캐스팅은 클래스의 인스턴스에만 허용됨 -> 구조체는 상속 불가능하니까
: 소멸자는 클래스의 인스턴스에만 활용할 수 있음
: 참조 횟수 계산은 클래스의 인스턴스에만 적용됨
[값 타입과 참조 타입]
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 | struct MyInfoStruct{ var name: String var age: Int var city: String } class MyInfoClass{ var name: String var age: Int var city: String init() { name = "Swift" age = 4 city = "Earth" } } var myInfoStruct = MyInfoStruct(name: "Swift", age: 4, city: "Earth") var myInfoClass = MyInfoClass() print(myInfoStruct.age, myInfoClass.age) let copyStruct = myInfoStruct let copyClass = myInfoClass myInfoStruct.age = 10000 myInfoClass.age = 10000 print(copyStruct.age, copyClass.age) | cs |
위의 코드에서 구조체는 값 타입이므로 값 자체가 복사되어 copyStruct.age의 값이 변하지 않음
하지만 클래스는 참조 타입이므로 copyClass.age의 값이 10000으로 변함
- === 연산자를 사용하여 인스턴스끼리 참조가 같은지 확인 가능
[구조체와 클래스 선택해서 사용하기]
- 다음과 같은 경우를 제외하면 일반적으로 클래스를 정의하여 사용
: 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
: 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
: 구조체에 저장된 프로퍼티가 값 타입이며 참조하는 것보다 복사하는 것이 합당할 때
: 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때
: 예) 좌표계
'Swift > 야곰의 스위프트' 카테고리의 다른 글
11장 인스턴스 생성 및 소멸 (0) | 2018.02.05 |
---|---|
10장 프로퍼티와 메서드 (0) | 2018.02.03 |
8장 옵셔널 (0) | 2018.02.03 |
7장 함수 (0) | 2018.01.29 |
6장 흐름 제어 (0) | 2018.01.29 |