[Swift] 중첩 타입

Zoe·2022년 2월 15일
0

Swift

목록 보기
18/21
post-thumbnail

중첩 타입


🌟 중첩 타입 : 타입 내부에 타입을 정의하고 구현할 수 있는데 이렇게 타입 내부에 새로운 타입을 선언해 준 것

🌟 클래스 내부에 새로운 클래스, 새로운 구조체, 새로운 열거형을 정의할 수 있고 반대로 구조체 내부에 새로운 열거형 등의 타입을 중첩해서 새 타입으로 정의할 수 있음.

//클래스 타입 안에 새로운 열거형 타입 선언
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
  • Person이라는 클래스 안에 Job이라는 열거형 타입을 새롭게 선언해주었고 Student클래스는 Person클래스를 상속받고 안에 School이라는 열거형 타입을 새롭게 선언

  • 중첩 데이터 타입을 사용할 때는 자신을 둘러싼 타입(여기서는 Person, Student타입)의 이름을 자신보다 앞에 적어줘야 함

  • 예를 들면 Person클래스 내부에 정의 Job타입을 나타내려면 Person.Job이라고 표현하고 Student에 있는 School타입을 나타내려면 Student.school이라고 표현

  • personJob 상수를 선언한 Person.Job타입과 Student.Job 상수를 선언한 Student.Job타입은 동일하게 사용. 그 이유는 Job열거형 타입은 Person내부에도 정의되었지만 Person을 상속받은 Student클래스의 중첩 데이터 타입으로도 취급할 수 있기 때문

✅ 이름이 같은 데이터 타입이지만 각 구조체에 맞게 정의된 경우

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.live.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: "제주",package: "SA"

let someGameType: Sports.GameType = .football
let anotherGameType: Esports.GameType = .online
  • SportsEsports 구조체는 GameType 열거형과 GameInfo 구조체를 모두 다 가지고 있지만 각 구조체에 맞게 서로 다른 종류의 게임이 있으므로 제공해야 하는 게임 정보도 서로 다른 것을 확인

  • 만약 GameTypeGameInfo타입을 외부에서 정의했다면 이 두 열거형 타입은 공통으로 쓰지 못하고 오히려 더 복잡

  • 따라서 위 예제처럼 같은 이름의 타입을 다른 타입의 내부에 중첩하여 구현한 것과 같이 목적에 따라 타입을 중첩하는 것은 타입의 목적성을 명확하게 하는데 도움

profile
iOS 개발자😺

0개의 댓글

관련 채용 정보