새벽의 기록

[SOPT] 고량주 2주차 이론 과제 본문

SOPT

[SOPT] 고량주 2주차 이론 과제

OneTen 2024. 11. 8. 02:59
1. Delegate, Closure에 대해서 복습하세요.
- 클로저의 캡처는 무엇일까요?
- 클로저는 어느 메모리 영역에서 작동할까요?
- escaping 클로저와 non-escaping 클로저의 차이점은 무엇인가요?
- 델리게이트에서 weak, 클로저 내부에서 weak self를 왜 사용했을까요?
- 캡쳐 리스트는 무엇인가요?
2. 싱글톤 패턴에 대해서 알아보고, 어떨 때 사용하는 것이 좋은지 알아봅시다.
3. 열거형에 대해서 알아보고, 원시값과 연관값의 차이도 알아봅시다.
4. stored, type, computed property에 대해서 알아봅시다.
- 메모리 상에서 어떤 차이가 있는지도 알려주세요.

열거형에 대해서 알아보고, 원시값과 연관값의 차이도 알아봅시다.

열거형(enum)

관련된 값들의 집합을 정의하는 자료형

→ 공통된 주제에 대해서 이미 정해놓은 값만 선택해서 받고 싶을 때 사용하는 자료형

→ 오타같은 실수의 가능성도 줄어들고 코드의 가독성도 좋아짐

enum Direction {
    case north
    case south
    case east
    case west
}
enum Direction {
    case north, south, east, west
}

원시값(Raw value)

열거형의 각 케이스가 가질 수 있는 고정된 값

→ 주로 정수, 실수, 문자, 문자열 등이 사용되며 이 값들은 상수처럼 사용할 수 있다.

정수형

enum Direction: Int {
    case north                // 0
    case south                // 1 
    case east                 // 2
    case west                 // 3
} 

Int 타입을 enum 선언 시 이름 옆에 명시해주면

가장 먼저 선언된 case 부터 0부터 1씩 증가된 값이 들어간다

enum Direction: Int {
    case north = 0           // 0  
    case south = 10          // 10  
    case east                // 11
    case west = 20           // 20
    case northEast           // 21
} 

직접 RawValue를 지정해줄 수도 있지만, RawValue를 지정해주지 않은 case는

바로 이전 case의 RawValue에서 +1 한 값으로 자동 세팅된다

실수형

enum Direction: Double {
    case north = 1.0           // 1.0  
    case south = 2.0           // 2.0  
    case east = 3.0            // 3.0
    case west = 4.0            // 4.0
    case northEast             // 5 -> Error
} 

만약 Double 혹은 Float 타입을 원시 값으로 설정했으면 모든 case에 대해 RawValue를 지정해줘야 한다

→ RawValue 값이 지정되지 않은 case는 이전 값에서 +1 한 정수값이 자동으로 지정되기 때문에 실수형의 원시값 enum에서는 Error가 발생하는 것

enum Direction: Double {
    case north = 1.0           // 1.0  
    case south = 2.0           // 2.0  
    case east = 3.0            // 3.0
    case west = 4              // 4.0
    case northEast             // 5.0
} 

따라서, 실수형을 원시값으로 사용할 경우 RawValue를 생략하고 싶다면

바로 이전 case의 RawValue를 정수 값으로 세팅해주어야한다

문자형

enum Direction: Character {
    case north = "a"           // a  
    case south = "b"           // b  
    case east = "c"            // c
    case west = "d"            // d
    case northEast = "e"       // e
} 

문자형을 원시값으로 사용할때도 마찬가지로 모든 case에 대한 RawValue를 직접 선언해주어야 한다

enum Direction: Character {
    case north = "a"           // a  
    case south                 // b -> Error 
    case east = "c"            // c
    case west = "d"            // d
    case northEast = "e"       // e
} 

만약 하나라도 입력해주지 않으면 아까 실수형에서와 같은 맥락으로 에러가 발생한다

→ 지정되지 않은 RawValue는 이전 case에서 +1 한 값을 갖는데, 이전 case의 RawValue가 정수형이 아니라서 +1을 할 수 없으니 Error

문자열형

enum Direction: String {
    case north            // north  
    case south            // south
    case east             // east
    case west             // west
    case northEast        // northEast
} 

문자형이 원시값인 enum은 RawValue를 지정하지 않으면 case 이름으로 RawValue가 세팅된다

원시값 사용예시

enum Weekday: String {
    case monday = "Mon"
    case tuesday = "Tue"
    case wednesday = "Wed"
    case thursday = "Thu"
    case friday = "Fri"
}

print(Weekday.monday.rawValue)  // "Mon"

연관값(Associated Value)

열거형의 각 case에 동적으로 다른 값들을 추가로 지정할 수 있게 하는 값

원시값과 달리, 각 case마다 다른 타입을 가질 수 있다

// 이름이 없고 타입만 있는
enum EnumName {
    case caseName(Type)              
    case caseName(Type, Type, ...)             
} 

// 이름도 있고 타입도 있는
enum EnumName {
    case caseName(name1: Type)              
    case caseName(name2: Type, name3: Type, ...)             
} 

연관값은 이렇게 case 옆에 튜플(지정되지 않은 데이터의 나열) 형태로 원하는 Type을 명시해서 사용

enum AppleProduct: String {
    case iPad = "5, 128GB"              
    case iPhone = "6, 64GB"           
    case macbook = "Pro, 256GB"            
} 

이렇게 case별로 RawValue를 정해주는 원시값을 사용할 수도 있지만,

모든 iPad5가 128GB이고, iPhone6가 64GB는 아님

→ 원시값은 모든 case가 동일한 형식(위에선 String)으로 RawValue를 가져야 하고, case 별 값은 미리 지정된 한 가지 값만 가질 수 있다는 단점이 있음

→ 그래서 이를 보완해서 사용할 수 있는 것이 연관값

enum AppleProduct {
    case iPad(model: String)              
    case iPhone(model: String, storage: Int)            
    case macbook(model: String, storage: Int, size: Int)             
} 

연관값 사용예시

enum MediaType {
    case book(title: String, author: String)
    case movie(title: String, director: String)
}

let favoriteBook = MediaType.book(title: "The Man Who Laughs", author: "Victor-Marie Hugo")
let favoriteMovie = MediaType.movie(title: "파묘", director: "장재현")

원시값 vs 연관값

원시값 (Raw Value)연관값 (Associated Value)

열거형의 각 케이스에 미리 정의된 고정된 값. 각 케이스가 필요할 때마다 저장하는 동적인 값.
모든 케이스는 같은 데이터 타입의 원시값을 가져야 함. 각 케이스가 서로 다른 타입의 값을 가질 수 있음.
열거형 정의 시에 값을 지정하거나 자동으로 할당됨. 케이스가 생성될 때 연관값을 저장함.
각 케이스는 값이 고정되어 있으며, 변경할 수 없음. 연관값은 동적으로 다르게 설정할 수 있음.
값을 사용할 때 rawValue로 접근 가능. 연관값은 switch를 사용해 추출하거나 직접 접근.

 

 

 

 

 

'SOPT' 카테고리의 다른 글

[SOPT] 고량주 1주차 이론 과제  (0) 2024.11.07
[SOPT] 35기 iOS 파트 합격 후기  (4) 2024.09.26
Comments