열거형(enum)

썹스·2022년 10월 1일
0

Swift 문법

목록 보기
12/68

열거형(enum)이란?

열거형(enum)은 관련 있는 여러 데이터를 하나의 이름으로 구성하여 사용하는 데이터 타입입니다.

또한 열거형은 사용자가 직접 정의하는 데이터 타입이기 때문에 커스텀 타입(Custom Type)이라고도 불립니다.

그렇다면 왜 열거형(enum)을 사용할까??🤔

열거형(enum)은 "입력값이 한정적일 때", "특정 값 중 하나만 선택할 때" 주로 사용됩니다.

이러한 까다로운 권고? 사항이 있음에도 불구하고 열거형을 사용하는 이유는 다양하지만, 가장 큰 이유는 "원치 않는 값이 잘못 입력되는 것을 방지"할 수 있기 때문에 자주 사용된다고 생각됩니다.
즉, 안전성 때문에 사용한다고 생각(관련 있는 데이터를 하나로 묶어 사용하는 자료형이기 때문에 코드의 가독성을 높이는 장점도 있음)


📌 열거형(enum)사용

열거형은 관련 있는 데이터를 하나로 구성하면서 한정적인 경우에만 사용하는 것을 권장하는데 이러한 조건을 만족하는 경우가 무엇이 있을까??🤔

아래와 같은 경우에만 열거형을 사용하는 것을 권장합니다.

  • 학교: 초등, 중등, 고등, 대학
  • 성별: 남성, 여성
  • 방향: 동, 서, 남, 북

위의 예시처럼 비슷한 성질의 여러 데이터를 하나로 구성할 수 있으며, 구성해야 할 데이터가 한정적(데이터의 수가 많지 않은 경우)인 경우에만 사용하는 것이 좋습니다.

✅ 열거형 사용 예시

enum Color{
    case red
    case orange
    case yellow
    case green
    case blue
    case navy
    case purple
    //아래와 같이 콤마( ,)를 이용하여 case를 한 줄로 나열할 수 있습니다.
    //case red, orange, yellow, green, blue, navy, purple
}

print(Color.red)     // red 출력
print(Color.blue)    // blue 출력

여기서 출력된 값 red와 blue는 String type이 아니라 Color type입니다.

이는 열거형(enum)이 하나의 데이터 타입이기 때문입니다. (사용자가 사용자 편의에 맞게 설정하는 일종의 커스텀 타입)

print(type(of: Color.red))     //Color 출력
print(type(of: Color.blue))    //Color 출력

처음에 열거형을 변수(상수)에 바인딩하여 사용할 경우 뒤에 이어지는 코드는 열거형의 이름을 생략하여 사용할 수 있습니다. (컴파일러가 추론할 수 있기 때문)

var myFavoriteColor = Color.blue     //처음 변수에 값을 초기화 할 때는 열거형명(열거형 타입)을 입력해야 한다.

myFavoriteColor = .red
//처음에 myFavoriteColor는 Color 타입으로 설정했기 때문에 열거형명을 생략할 수 있다.

열거형의 원시값(Raw Value)과 연관값(Associated Value)

📌 원시값(Raw Value)

각각의 케이스에 특정한 값(특정한 값은 Hashable한 타입만)을 지정하여 사용하는 방법입니다.

원시값에 접근하기 위해서는 .rawValue 속성을 사용해야 합니다.

✅ 열거형의 Int형 원시값

enum Color: Int{    //원시값의 데이터 타입을 명시해야 한다.
    case red = 0    //첫 케이스에 원시값을 할당하면, 뒤에 있는 케이스에는 자동으로 원시값이 할당된다.
    case orange     //1
    case yellow     //2
    case green = 5
    case blue       //6
    case navy       //7
    case purple     //8

}

print(Color.red.rawValue)    //0
print(Color.navy.rawValue)   //7

✅ 열거형의 String형 원시값

원시값의 타입을 String으로 설정하고 원시값을 할당하지 않으면 case에 정의된 이름이 자동으로 할당됩니다.

enum Color: String{    
    case red             //red  ->  String type
    case orange          //orange
    case yellow          //yellow
    case green = "G"     //G
    case blue            //blue
    case navy            //navy
    case purple          //purple

}

print(Color.red.rawValue)      //red
print(Color.green.rawValue)    //G
print(Color.navy.rawValue)     //navy

✅ 원시값을 사용하여 case 출력

<열거형명>(rawValue: <원시값>)     // 원시값과 매칭되는 열거형 case를 옵셔널타입으로 return
print(Color(rawValue: 2))    // Optional(__lldb_expr_153.Color.yellow)

📌 연관값(Associated Value)

열거형의 case에 추가정보를 작성하여 사용하는 방법입니다.

연관값은 case를 정의한 뒤, 정의한 이름 옆에 특징의 자료형 타입과 특징의 이름을 부여하여 사용할 수 있습니다. (특징의 이름은 선택사항)

✅ 열거형의 연관값

enum Student{
    case StudentName(이름: String)
    case StudentClass(학년: Int,: Int)
    case StudentNumber(Int)     //특징의 이름을 생략할 수 있다.
}


print(Student.StudentName(이름: "신짱구"))     //StudentName(이름: "신짱구")
print(Student.StudentClass(학년: 2,: 7))   //StudentClass(학년: 2, 반: 7)
print(Student.StudentNumber(5))             //StudentNumber(5)

📌 열거형의 활용

열거형의 기능과 사용법을 가지고 어떻게 활용할 수 있을까??🤔

열거형(enum)과 제어문(switch)

연관 있는 데이터를 하나로 묶어 사용하는 열거형(enum)은 각각의 케이스마다 작업을 실행하는 switch문과 만날 때 높은 효율성과 성능을 발휘합니다. (switch문 뿐만 아니라 if문, guard문에서도 에서도 사용할 수 있음)

제어문과 함께 사용하는 방법 외에도 열거형에 메서드를 선언하여 사용하는 활용 방법 또한 존재합니다.

✅ 열거형과 switch문

enum SimplePay: String{
    case naverPay
    case kakaoPay
    case samsungPay
    case applePay
    case otherPay
}

var mySimplePay = SimplePay.kakaoPay     //kakaoPay

switch mySimplePay{
case .naverPay:                          //변수 선언에서 타입을 결정했기 때문에 열겨형명 생략 가능
    print("네이버페이로 결제")
case .kakaoPay:
    print("카카오페이로 결제")
case .samsungPay:
    print("삼성페이로 결제")
case .applePay:
    print("애플페이로 결제")
case .otherPay:
    print("기타 결제수단으로 결제")
}


/*
출력 결과
카카오페이로 결제
*/

✅ 열거형의 메서드(func)를 선언

열거형 코드 블록 안에 메소드(method)를 선언하여 사용할 수 있습니다.

enum Rainbow: String{
    case red, orange, yellow, green, blue, navy, purple
   
    func choiceColor() {
        switch self{
        case .red, .blue, .green:
            print("My favorite color.")
        case .orange, .yellow, .navy, .purple:
            print("It's just...")
        }
    }
}

Rainbow.red.choiceColor()        //My favorite color.
Rainbow.yellow.choiceColor()     //It's just...


Reference

참고자료: 앨런 Swift문법 마스터 스쿨

profile
응애 나 코린이(비트코인X 코딩O)

0개의 댓글