📚 목차
1️⃣ 열거형 Enum
2️⃣ 구조체 Struct
3️⃣ 클래스 Class
4️⃣ 차이점
Swift는 객체지향 프로그래밍 언어입니다.
그렇기 때문에 우리는 클래스, 구조체, 열거형에서 각각의 타입을 가지는 인스턴스(=객체)를 생성해서 사용할 수 있습니다.
-> 이 부분에서 많이들 붕어빵과 붕어빵틀로 인스턴스와 클래스를 설명하곤 하죠.
클래스, 구조체, 열거형의 인스턴스를 사용하기 위한 준비 작업을 이니셜라이저 즉, 초기화라고 합니다.
자,, 왜 여기에 이렇게 주저리 글을 적었냐...
그것은 제가 이해가 안갔기에 정리를 해봤습니다..
자 본론으로 들어가 열거형, 클래스, 구조체가 뭔지
어떤 경우에 열거형/구조체/클래스를 쓰는지 등의 차이점도 정리해보겠습니다!
1️⃣ 열거형 Enumerations
: 같은 성질을 가지는 것들에 대한 목록들을 case 별로 나열한 것입니다.
- 열거형 이름 자체는 UpperCamelCase을 사용합니다.
- 각 case 이름은 lowerCamelCase을 사용합니다.
- 각 case 자체가 고유의 값을 의미합니다.
- 각 case는 한 줄에 개별로 / 여러개도 정의 가능합니다.
- 열거형은 값 타입이며 상속이 불가능하고 확장이 가능합니다.
열거형의 기본형태
enum 이름 {
case 이름1
case 이름2
case 이름3
case 이름4, 이름5, 이름6
}
열거형의 분기처리
: 조건을 만족했을 때와 만족하지 못했을 때를 나누어 처리하는 것을 분기처리라고 하는데
switch 문과 enum 문을 합치면 case 별로 분기처리가 가능합니다.
-> 모든 case에 대한 분기처리를 해줄 경우에는 default가 따로 필요하지 않습니다.
north, south, east, west 총 4개의 case에 대해 분기처리를 해줬어여
열거형의 원시값 (raw Value)
: enum의 case에는 또 다른 값을 저장할 수 있고 문자열, 문자, 정수, 실수형 데이터 타입이 올 수 있습니다.
원시값 할당을 생략 시에는 0부터 1씩 증가하며, 차례대로 할당된답니다.
만약에 중간에 값을 할당할 경우에는 그 값부터 1씩 증가하게 됩니다.
열거형의 메소드
: 열거형 안에는 메소드도 추가할 수 있습니다.
⚠️구조체와 클래스는
여러 변수를 담을 수 있는 컨테이너 개념으로
데이터를 용도에 맞게 묶어 표현할 때 용이합니다.
- 프로퍼티와 메소드를 사용해 구조화된 데이터와 기능을 가집니다.
- 새로운 사용자 지정 타입을 만들어 줍니다.
- 초기화 init을 정의해서 초기 상태를 설정할 수 있습니다.
- extension이 가능합니다.
- 프로퍼티값에 접근할 때 점(.)을 사용합니다.
- 프로토콜 사용이 가능합니다.
- 타입을 정의하기 때문에 UpperCamelCase를 사용합니다.
2️⃣ 구조체 Structure
: 구조체는 Swift의 대부분 큰 뼈대를 구성하고 있습니다. 대부분의 데이터의 자료형 타입(Int, String, Double, Float, Array 등)은 모두 구조체로 구현되어 있습니다.
-> 그래서 dataModel.swift 파일을 만들어 줄 때 우리가 자주,, struct 타입으로 구현을 해주나봐요~
구조체의 기본형태
struct 구조체 {
프로퍼티와 메소드
}
구조체의 프로퍼티
* 구조체에서의 타입 프로퍼티 ?
: 타입 프로퍼티 선언을 위해서는 static 키워드를 사용합니다.
특정 타입에 속한 프로퍼티로 그 타입에 해당하는 단 하나만의 프로퍼티를 생성하고
이니셜라이저가 없기 때문에 인스턴스 프로퍼티와 다르게 항상 초기값을 지정해야 합니다.
** 타입 프로퍼티를 사용하는 이유?
: 어떤 구조체/클래스 내의 프로퍼티를 사용하고 싶은데
클래스/구조체 전체를 굳이 메모리에 할당해서 사용할 필요는 없을 때 사용합니다.
따라서, 위 코드 속 static 키워드가 붙은 [ typeProperty ] 변수는 Sample 이라는 타입 자체에서 사용할 수 있는 프로퍼티입니다.
구조체의 메소드
구조체의 인스턴스
- 가변 인스턴스 내 가변 프로퍼티는 수정 가능
- 가변 인스턴스 내 불변 프로퍼티는 수정 불가능
- 불변 인스턴스 내 가변 프로퍼티는 수정 불가능
- 불변 인스턴스 내 불변 프로퍼티는 수정 불가능
구조체의 타입 프로퍼티와 타입 메소드
- 타입 프로퍼티와 타입 메소드를 일반 인스턴스에 호출하면 에러가 납니다.
- 타입 프로퍼티와 타입 메소드는 해당 타입 자체에서 사용할 수 있는 값과 함수이기 때문이죠.
구조체에서는 'static' 키워드를 통해 타입 프로퍼티/메소드인지 아닌지를 나눕니다.
3️⃣ 클래스 Class
: Apple 프레임워크의 대부분의 큰 뼈대는 클래스로 구성되어 있습니다.
클래스의 기본형태
class 이름 {
/* 구현부 */
}
클래스의 프로퍼티 (구조체와 동일)
클래스의 메소드
⚠️ 타입 프로퍼티에서 class 키워드를 사용한다면 재정의 가능한 타입 메소드를 선언할 수 있습니다. (상속 = 오버라이딩이 가능)
클래스의 인스턴스
- 가변 인스턴스 내 가변 프로퍼티는 수정 가능
- 가변 인스턴스 내 불변 프로퍼티는 수정 불가능
- 불변 인스턴스 내 가변 프로퍼티는 수정 가능 ------>⚠️ 구조체와 다른 부분 (클래스는 참조이기 때문)
- 불변 인스턴스 내 불변 프로퍼티는 수정 불가능
클래스의 프로퍼티 (구조체와 동일)
4️⃣ 차이점
구조체 | 클래스 |
값 타입 call by value ( 데이터를 전달할 때 값을 복사하여 전달) 어떤 변수의 메모리 주소를 복사해서 보낼 때 = 복사본 |
참조 타입 call by reference ( 데이터를 전달할 때 값의 메모리 위치를 전달 ) 어떤 변수의 메모리 주소 자체를 보낼 때 = 원본 |
상속 불가능 | 상속 가능 ( 타입 메소드의 class 키워드 -> 상속이 가능 = 재정의 가능 ) |
스택 메모리 영역에 할당 -> 속도가 빠름 | 힙 메모리 영역에 할당 |
레퍼런스 형태가 아니기 때문에 공유 불가능 | 레퍼런스 형태로 공유가 가능 |
항상 새로운 변수로 값의 복사가 일어나기 때문에 멀티 스레드 환경에서 문제가 일어날 확률이 적음 | - |
그럼 언제 구조체를 쓰고 언제 클래스를 쓸까요 ?
1. 서로 연관된 몇 개의 기본 데이터 타입들을 캡슐화하여 묶는 것이 목적일 때
2. 캡슐화된 데이터에 상속이 필요하지 않을 때
3. 캡슐화된 데이터를 전달하거나 할당하는 과정에서 참조 방식보다는 값이 복사되는 것이 합리적일 때
4. 캡슐화된 원본 데이터를 보존해야 할 때
이 경우에 하나 이상 해당할 경우 구조체를 쓰고, 이 외에는 클래스를 씁니다!
'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글
[iOS] 데이터 직접 전달 방식(2) - Segue prepare 메소드를 통해 전달 (1) | 2021.04.29 |
---|---|
[iOS] 데이터 직접 전달 방식(1) - Property를 통해 전달 (1) | 2021.04.29 |
[iOS] UIPanGestureRecognizer 사용해서 모달화면 아래로 dismiss하기 (2) | 2021.04.24 |
[iOS] velocity.y < 0 이면 왜 방향이 up일까? (0) | 2021.04.18 |
[iOS] 스토리보드/코드로 화면 전환하기 - Navigation(push/pop) (1) | 2021.04.15 |