본문 바로가기
iOS/SWIFT

[Swift] Chapter 24. 타입 중첩

by 원만사 2021. 10. 13.
반응형

스위프트에는 타입 내부에 타입을 정의하고 구현할 수 있다. 이처럼 타입 내부에 새로운 타입을 선언해준 것을 중첩 타입(Nested Type)이라고 부른다.

타입 내부에 새로운 타입을 정의하고 싶다면, 자신의 정의 내부에 새로운 타입을 정의하고 구현해주기만 하면 된다.

 

24.1 중첩 데이터 타입


함수 중첩처럼 클래스 내부에 새 클래스, 클래스 내부에 새 구조체, 구조체 내부에 새 열거형 등의 타입을 중첩해서 타입 내부에 새 타입을 정의할 수 있다.

 

/*
	코드 24-1. 중첩 데이터 타입 구현
*/

class Person {
    enum Job {
        case jobless, programmer, student
    }

    var job: Job = .jobless
}

class Student: Person {
    enum School {
        case elementary, middle, high
    }

    var school: School

    init(school: School) {
        self.school = school
        super.init()
        self.job = .student
    }
}

let personJob: Person.Job = .jobless
let studentJob: Student.Job = .student

let student: Student = Student(school: .middle)
print(student.job) // student
print(student.school) // middle

 

[코드 24-1]에는 Person 클래스 내부에 중첩 데이터 타입으로 Job이라는 열거형 타입이 정의되어 있다. 또, Student 클래스 내부에는 중첩 데이터 타입으로 School 이라는 열거형 타입이 정의되어 있다. 중첩 데이터 타입을 사용할 때는 자신을 둘러싼 타입(자신이 속해 있는 타입)의 이름을 자신보다 앞에 적어줘야 한다.

예를 들어 Person 클래스 내부에 정의한 Job 타입을 나타내려면 Person.Job이라고 표현한다. 이 순서로 중첩된 타입이 정확히 어떤 역할을 위해 만들어졌는지 더욱 확실히 알 수 있다.

Job 열거형은 Person 내부에 정의되어 있지만 Person을 상속받은 Student 클래스의 중첩 데이터 타입으로도 취급할 수 있다. 그래서 Person.Job과 Student.Job이라는 표현은 동일하게 사용할 수 있다.

 

/*
	코드 24-2. 같은 이름의 중첩 데이터 타입 구현
*/

struct Sports {
    enum GameType {
        case football, basketball
    }

    var gameType: GameType

    struct GameInfo {
        var time: Int
        var player: Int
    }

    var gameInfo: GameInfo {
        switch self.gameType {
        case .basketball:
            return GameInfo(time: 40, player: 5)
        case .football:
            return GameInfo(time: 90, player: 11)            
        }
    }
}

struct ESports {
    enum GameType {
        case online, offline
    }

    var gameType: GameType

    struct GameInfo {
        var location: String
        var package: String
    }

    var gameInfo: GameInfo {
        switch self.gameType {
        case .online:
            return GameInfo(location: "www.liveonline.co.kr", package: "LoL")
        case .offline:
            return GameInfo(location: "제주", package: "SA")
        }
    }
}

var basketball: Sports = Sports(gameType: .basketball)
print(basketball.gameInfo) // (time: 40, player: 5)

var sudden: ESports = ESports(gameType: .offline)
print(sudden.gameInfo) // (location: "제주", pakage: "SA")

let someGameType: Sports.GameType = .football
let anotherGameType: ESports.GameType = .online
// let errorIfYouWantIt: Sports.GameType = .online // 오류 발생

 

[코드 24-2]의 중첩 데이터 타입 구현을 보면 Sports 구조체와 ESports 구조체에 각 GameType과 GameInfo가 있다. 이름이 같은 데이터 타입이지만 각 구조체에 맞게 서로 다른 종류의 게임이 있으며 제공해야 하는 게임 정보도 서로 다르다.

이와 같이 목적에 따라 타입을 중첩 하는 것은 타입의 목적성을 명확히 하는 데 큰 도움이 된다.

 

 

스위프트 프로그래밍: Swift 5 - 교보문고

객체지향, 함수형, 프로토콜 지향 패러다임까지 한 번에! | 스위프트를 제대로 이해하고 싶은 개발자를 위한 책스위프트는 iOS와 macOS용 애플리케이션 개발에 주로 사용하는 프로그래밍 언어입니

www.kyobobook.co.kr

반응형

'iOS > SWIFT' 카테고리의 다른 글

[Swift] Chapter 26. where 절  (0) 2021.10.23
[Swift] Chapter 25. 패턴  (0) 2021.10.23
[Swift] Chapter 23. 프로토콜 지향 프로그래밍  (0) 2021.10.13
[Swift] Chapter 22. 제네릭  (0) 2021.10.13
[Swift] Chapter 21. 익스텐션  (0) 2021.10.11

댓글