[Swift] Ch24. 타입 중첩

JJUDEV·2024년 6월 5일
0

Swift

목록 보기
18/21
post-thumbnail

Swift에서 타입 중첩(Nested Types)은 하나의 타입 내부에 다른 타입을 정의하는 기능을 말합니다. 이 기능을 통해 타입을 논리적으로 그룹화하고, 코드 구조를 더 깔끔하고 이해하기 쉽게 만들 수 있습니다.
열거형은 특정 클래스나 구조체의 기능을 명확히 사용하기에 용이합니다. 그러나 굳이 클래스나 구조체 외부에서는 열거형을 사용할 필요가 없을 때도 있습니다. 즉, 클래스나 구조체 내부에서 자신의 역할을 충실히 할 수 있도록 역할을 구분짓는 열거형을 선언해주고 자신의 내부에서만 사용할 수 있기를 원할 수 있습니다. 또는 특정 데이터 타입들을 하나의 클래스나 구조체에 구현하여 외부와의 혼선을 피하고 싶을 수도 있습니다.

24.1 중첩 데이터 타입

함수를 중첩해 사용했듯이 클래스 내부에 새 클래스, 클래스 내부에 새 구조체, 구조체 내부에 새 열거형 등의 타입을 중첩해서 타입 내부에 새 타입을 정의할 수 있습니다.

Class Person {
	enum Job {
    	case jobclass, 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 클래스 내부에는 중첩 데이터 타입으로 School이라는 열거형 타입이 정의되어 있습니다. Job 열거형은 Person 내부에 정의되어 있지만 Person을 상속받은 Student 클래스의 중첩 데이터 타입으로도 취급할 수 있습니다. 그래서 Person.Job과 Student.Job이라는 표현은 동일하게 사용할 수 있습니다.

// 같은 이름의 중첩 데이터 타입 구현
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 pakage: String
       	var gameInfo: GameInfo {
        	switch self.gameType {
           	case .online:
            	return GameInfo(location: "www.liveonline.co.kr", pakage: "LoL")
            case .offline:
            	return GameInfo(location: "제주", pakage: "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 // 오류 발생

위 예시에서 Sports 구조체와 ESports 구조체에 각각 GameType과 GameInfo가 있습니다. 이름이 같은 데이터 타입이지만 각 구조체에 맞게 서로 다른 종류의 게임이 있으며 제공해야 하는 게임 정보도 서로 다릅니다. 이렇게 이름이 같더라도 역할이 달라야 할 때, 예를 들어 외부에 GameType과 GameInfo 타입을 정의했다면 공용으로 쓰지 못하고 오히려 혼란만 초래했을 것입니다.

타입 중첩을 통해 관련된 타입을 그룹화하고, 코드의 가독성과 유지 보수성을 높일 수 있습니다. Swift의 타입 중첩 기능을 적절히 활용하면 코드 구조가 더 직관적이고 논리적으로 조직될 수 있습니다.

참고자료

  • 스위프트 프로그래밍 3판(지은이: 야곰, 출판사: 한빛미디어(주))
  • ChatGPT 4
profile
4년차 앱개발자입니다.

0개의 댓글