반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- firebase
- Choosing Between Structures and Classes
- for-in
- IBOutletCollection
- IBOutlet
- TableView
- tableViewCell
- userdefaults
- CoreLocation
- RunLoop
- property wrapper
- entrypoint
- Understanding Swift Performance
- DispatchQueue
- OperationQueue
- WWDC16
- 동시성프로그래밍
- weak
- Remot Push
- 트레일링 클로저
- 후행 클로저
- 연산 프로퍼티
- uikit
- 원격 푸시
- viewcontroller
- AppTransportSecurity
- UIButton
- ios
- SWiFT
- 진입점
Archives
- Today
- Total
iOS 공부하는 감자
Day7) 클래스와 구조체 본문
반응형
클래스와 구조체
- 클래스와 구조체를 정의하는 것은 새로운 데이터 타입을 생성하는 것이다.
- 데이터 타입의 이름에는 대문자 카멜케이스를 사용하므로 클래스와 구조체의 이름 또한 대문자 카멜케이스로 정의해야 한다.
- 클래스와 구조체 내부의 프로퍼티와 메서드는 소문자 카멜케이스를 사용한다.
- 클래스나 구조체를 통해 생성된 인스턴스의 프로퍼티 또는 메서드에 접근하려면 인스턴스 이름에 점연산자를 사용하여 접근 가능하다.
클래스 (Class)
- 클래스끼리 상속이 가능하다.
- 클래스의 인스턴스는 참조 타입으로 해당 인스턴스를 상수(let)으로 선언해도 내부 프로퍼티 값을 변경할 수 있다.
- 클래스를 정의할 때 직접 이니셜라이저를 작성해야 한다.
- 디 이니셜라이저(deinit)를 사용하여 인스턴스가 소멸되기 직전에 실행할 작업을 작성할 수 있다.
-
class Person { // 저장 프로퍼티 var name: String var age: Int // 이니셜라이저 init(name: String, age: Int) { self.name = name self.age = age } // 디 이니셜라이저 deinit { print("Person 클래스의 인스턴스 소멸") } } var dong: Person? = Person(name: "dong", age: 25) dong = nil // Person 클래스의 인스턴스 소멸
구조체 (Struct)
- 구조체는 상속이 불가능하다.
- 구조체의 인스턴스는 값 타입으로 구조체를 사용하여 생성한 인스턴스를 상수(let)으로 선언하면 내부 프로퍼티도 수정 불가능하다.
- 구조체의 인스턴스를 변수(var)로 선언했더라도 구조체를 정의한 부분에서 해당 프로퍼티를 상수(let)로 선언했다면 수정 불가
- 이니셜라이저가 자동으로 생성된다.
-
struct Person { // 저장 프로퍼티 var name: String var age: Int // 이니셜라이저 - 없어도 잘 작동, 있어도 상관없음 // init(name: String, age: Int) { // self.name = name // self.age = age // } // 구조체에서는 deinit 사용 불가 // deinit { // print("Person 클래스의 인스턴스 소멸") // } } // 이니셜라이저를 자동으로 생성 let dong: Person = Person(name: "dong", age: 25) dong.age += 1 // 인스턴스를 상수로 선언해서 오류 발생
구조체와 클래스의 차이
같은 점
- 값을 저장하기 위해 프로퍼티를 정의할 수 있다.
- 기능 실행을 위한 메서드를 정의할 수 있다.
- 서브스크립트 문법을 통해 구조체 또는 클래스가 갖는 값(프로퍼티)에 접근하도록 서브스크립트를 정의할 수 있다.
- 초기화될 때의 상태를 지정하기 위해 이니셜라이저를 정의할 수 있다.
- 초기구현에 새로운 기능 추가를 위해 익스텐션을 사용하여 기능 확장이 가능하다.
- 특정 기능의 실행을 위해 특정 프로토콜을 준수할 수 있다.
다른 점
- 클래스는 상속이 가능하지만 구조체는 상속할 수 없다.
- 타입캐스팅은 클래스의 인스턴스에만 해당된다.
- 디이니셜라이저(deinit)은 클래스의 인스턴스에서만 사용 가능하다.
- 참조 횟수 계산(reference count)는 클래스의 인스턴스에만 적용된다.
무엇을 선택해서 사용할까?
- 애플 개발자 문서에서 언제 어떤것을 사용하면 좋을지에 대한 가이드라인을 제시해준다.
- 기본적으로 구조체를 사용한다.
- Object-C로 작성된 무언가와 연관되어 있다면 클래스를 사용한다.
- 모델링 중인 데이터에 대하여 직접 동일성을 제어해야 한다면 클래스를 사용한다. (클래스의 인스턴스는 참조타입이기 때문
반응형
'22 베이직 챌린지' 카테고리의 다른 글
Day9) 메서드, 접근제한자, Static (1) | 2022.01.11 |
---|---|
Day8) 프로퍼티, 연산 프로퍼티 (0) | 2022.01.10 |
Day6) 함수, 파라미터, 클로저 (0) | 2022.01.08 |
Day5) 연산자, 조건문, 반복문 + 알고리즘 (0) | 2022.01.07 |
Day4) 연산자, 조건문, 반복문 + 알고리즘 (0) | 2022.01.06 |