구조체와 클래스
구조체와 클래스에는 내용이 상당히 많은 편인데, 간략하게 정리하고 넘어간다. 이 파트를 재 학습을 한 이유는 실무에서 접한 코드에서 구조체가 다양하게 많이 쓰여지고 있었고 물론 클래스가 더 많지만, 구조체의 적절한 사용 방안에 대한 생각을 정립해보기 위해서다.
구조체와 클래스의 가장 큰 차이는 값과 참조의 차이다. 이 개념은 값을 전달하느냐 참조를 전달하느냐에 차인데 참조란 C 의 포인터 같은 개념으로 어느정도 프로그래밍에 대한 사전 지식이 있다면 무난하게 이해할 수 있는 부분이다.
구조체늬 인스턴스는 값 타입고, 클래스의 인스턴스는 참조 타입이라는 것이다.
1.구조체
구조체는 struct 키워드로 정의한다. (대문자 카멜케이스를 사용)
struct Person {
var name: String
var age: Int
}
기본적으로 생성된 이니셜라이저의 매개변수는 구조체의 프로퍼티 이름을 자동 지정한다. 인스턴스를 생성 후 프로퍼티에 접근하기위해서는 마침표 ( . )를 사용한다. 구조체를 상수 let으로 선언하면 인스턴스 내부의 프로퍼티 값을 변경할 수 없고 var로 선언하면 내부의 프로퍼티가 var로 선언된 경우에는 값을 변경할 수 있다.
사용예:
var aUser: Person = Person(name: "youghu", age: 99)
aUser.age = 45
let aUser: Person = Person(name: "younghu", age: 99)
aUser.age = 45 // 변경불가 Error
2.클래스
스위프트의 클래스는 부모를 상속받지 않고도 단독으로 정의가 가능하다. 클래스를 정의할 때는 class라는 키워드로 사용한다.
클래스 역시 대문자 카멜케이스를 사용한다.
class 클래스 이름 {
프로퍼티와 메서드들
}
부모 클래스를 상속받을 때는
class 클래스 이름 : 부모 클래스 이름 {
프로퍼티와 메서들
}
콜론 ( : )을 사용해준다.
class Person {
var height: Float = 0.0
var weight : Float = 0.0
}
구조체와 다르게 클래스의 인스턴스는 참조 타입이므로 클래스의 인스턴수를 상수 let으로 선언해도 내부 프로퍼티 값을 변경할 수 있다.
클래스 인스턴스의 소멸에는 deinit이라는 디이니셜라이저가 호출된다. (구현하면...)
class Person {
var height: Float = 0.0
var weight: Float = 0.0
deinit {
print("클래스가 소멸될 때 호출된다.")
}
}
var aUser: Person? = Person()
aUser = nil // Person클래스의 인스턴스가 소멸된다 : deint이 호출됨
3. 구조체와 클래스의 차이
같은점:
- 값을 저장하기 위해 프로퍼티를 정의할 수 있다.
- 메서드를 정의할 수 있다.
- 서브스크립트 문법을 통해 값(프로퍼티)에 접근하도록 서브스크립트를 정의할 수 있다.
- 초기화될 때의 상태를 지정하기 위해 이니셜라이저를 정의할 수 있다.
- 초기구현과 더불어 새로운 기능 추가를 위해 익스텐션을 통해 확장이 가능하다.
- 특정 기능을 실행하기 위해 특정 프로토콜을 준수할 수 있다.
다른점:
- 구조체는 상속할 수 없다.
- 타입캐스팅은 클래스의 인스턴스에만 허용된다.
- 클래스의 인스턴스에만 디이니셜라이저가 호출된다.
- 참조 횟수 계산(RC)은 클래스의 인스턴스에만 적용된다.
스위프트의 기본 데이터 타입은 모두 구조체로 정의 되었다.
public struct String {
///An empty 'String'
public init()
}
Bool, Int, Array, Dictionary, Set 등등..
자 정리,
구조체와 클래스를 각각 어떨 때 사용하면 좋은가?
구조체와 클래스는 새로운 데이터 타입을 정의하고 기능을 추가한다는 점이 같다. 구조체 인스턴스는 항상 값 타입이고, 클래스는 인스턴스 참조타입이다. 생긴건 비슷하지만 용도는 다르다는 의미,
프로젝트의 성격에 따라,
데이터의 활용도에 따라,
특정 타입을 구현할 때 구조체와 클래스 둘 중 하나를 선택해서 사용해야 한다.
애플 가이드라인에서 제시한 구조체를 사용하는 것을 권장하는 다음 조건을 참고
- 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일때
- 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
- 구조체에 저장된 프로퍼티가 값 타입이며 참조하는 것보다 복사하는 것이 합당할 때
- 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때
대다수 사용자정의 데이터 타입은 클래스로 구현할 일이 더 많을 것이라고...
'프로그래밍 > Spring' 카테고리의 다른 글
18. 인스턴스의 생성과 소멸 (0) | 2019.02.25 |
---|---|
17. 스위프트의 프로퍼티와 메서드에 대한 이해 (0) | 2019.02.24 |
15. 옵셔널(Optional) (0) | 2019.02.22 |
14. Swift의 다양한 함수들 (0) | 2019.02.21 |
13. Swift함수의 반환 타입 (0) | 2019.02.20 |