- 열거형(enum)
: 관련있는 데이터들이 멤버로 구성되어 있는 자료형 객체
wrtn. 열거형(enum)을 지원하는 프로그래밍 언어를 전부 알려줘
- C#: C#도 `enum` 키워드를 사용하여 열거형을 지원하며, Java와 유사하게 메서드와 필드를 가질 수 있습니다.
- Python:** Python은 `enum` 모듈을 통해 열거형을 지원합니다. Python 3.4부터 표준 라이브러리에 포함되었습니다.
- Swift:** Swift는 `enum` 키워드를 사용하여 열거형을 강력하게 지원합니다. 연관 값(associated values)을 가질 수 있으며, 패턴 매칭과 함께 사용하기 유용합니다.
- Kotlin:** Kotlin은 `enum class`를 사용하여 열거형을 지원하며, Java와 유사하게 동작합니다.
- TypeScript:** TypeScript는 JavaScript의 superset으로, `enum` 키워드를 사용하여 열거형을 지원합니다.
- Go:** Go는 `iota`를 사용하여 열거형과 유사한 상수를 정의할 수 있습니다. 명시적인 enum 키워드는 없지만, 상수 그룹을 통해 비슷한 효과를 낼 수 있습니다.
- Rust:** Rust는 `enum` 키워드를 사용하여 열거형을 강력하게 지원합니다. 대수적 데이터 타입(Algebraic Data Types)의 핵심적인 부분입니다.
- PHP:** PHP는 8.1 버전부터 `enum` 키워드를 사용하여 열거형을 지원합니다.
▶ 열거형 정의
enum Compass {
case North
case South
case East
case West
} //case들이 member임
//var x : Compass // Compass형 인스턴스 x
print(Compass.North) // North
var x = Compass.West
print(type(of:x)) // Compass
x = .East //Compass생략 가능. 열거형 이름을 생략 가능하다.
print(x) // East
enum Compass {
case North, South, East, West
}
//이렇게 쭉 나열해서 써도 실행 가능
문맥에서 타입의 추론이 가능한 시점(등호 왼쪽의 변수 타입이 확정적일 때)에는 열거형명 생략 가능
▶ 열거형 멤버별 기능 정의
enum Compass {
case North
case South
case East
case West
}
var direction : Compass
direction = .East
switch direction { //switch의 비교값이 열거형 Compass
case .North: //direction이 .North이면 "북" 출력
print("북")
case .South:
print("남")
case .East:
print("동")
case .West:
print("서") //원래 case문에는 default문장을 써야하는데, 모든 열거형 case를 포함하면 default 없어도 됨
}
▶ 열거형 멤버에 메서드(함수)도 가능
enum Week {
case Mon,Tue,Wed,Thur,Fri,Sat,Sun
func printWeek() { //메서드/함수도 가능
switch self {
case .Mon, .Tue, .Wed, .Thur, .Fri:
print("주중")
case .Sat, .Sun:
print("주말")
}
}
}
Week.Sun.printWeek() //주말
▶ 열거형의 rawValue : 원시값
: 자료형
enum Color: Int { //원시값(rawValue) 지정
case red //0
case green = 2 //값 지정, =2가 없었다면 0 1 2였겠지만 =2를 줘서 1을 뛰어넘고 0 2 3이 된다.
case blue //3
}
print(Color.red) //red
print(Color.blue) //blue
print(Color.red.rawValue) //0
print(Color.blue.rawValue) //3
▶ String형 값을 갖는 rawValue
enum Week: String { //string형 값을 갖는 열거형
case Monday = "월"
case Tuesday = "화"
case Wednesday = "수"
case Thursday = "목"
case Friday = "금"
case Saturday //값이 지정되지 않으면 case 이름이 할당됨
case Sunday // = "Sunday"
}
print(Week.Monday) //Monday
print(Week.Monday.rawValue) //월
print(Week.Sunday) //Sunday
print(Week.Sunday.rawValue) //Sunday
▶ 연관 값(associated value)을 갖는 열거형(enum)
enum Date {
case intDate(Int,Int,Int) //(int,Int,Int)형 연관값을 갖는 intDate
case stringDate(String) //String형 연관값을 값는 stringDate
}
var todayDate = Date.intDate(2025,4,30)
todayDate = Date.stringDate("2025년 5월 20일") //Date. 생략가능
switch todayDate {
case .intDate(let year, let month, let day):
print("\(year)년 \(month)월 \(day)일") //tddayDate를 주석처리하면 2025년 4월 30일 출력력
case .stringDate(let date):
print(date) //2025년 5월 20일
}
▶ 옵셔널은 연관 값을 갖는 열거형(enum)으로 구현했다.
let age: Int? = 30 //Optional(30)
switch age {
case .none: // nil인 경우
print("나이 정보가 없습니다.")
case .some(let a) where a < 20:
print("\(a)살 미성년자입니다")
case .some(let a) where a < 71:
print("\(a)살 성인입니다")
default:
print("경로우대입니다")
} //30살 성인입니다.
(몰라도되긴함)
- 구조체(struct)
■ 구조체/enum의 인스턴스는 값(value) 타입, 클래스의 인스턴스는 참조(reference) 타입
■ 구조체는 상속 불가
struct Resolution { //구조체 정의
var width : Int //프로퍼티 초기값이 없어요!!
var height : Int
} //init()메서드 없다. 근데 실행이 됨.
let myComputer = Resolution(width:1920,height:1080) //Memberwise Initializer
print(myComputer.width) //1920 출력
구조체 장점 : Memberwise Initializer를 자동으로 만들어 준다.
Memberwise Initializer : Resolution 구조체의 width와 height 프로퍼티를 초기화하는 역할을 한다. 별도의 initializer를 정의하지 않아도 자동으로 제공되므로, 구조체를 쉽게 초기화하고 사용할 수 있다는 장점이 있다
- class로 바꾸기
// class Resolution { //class로 바꾸니 error발생.
// var width : Int //멤버에 초기값이 없어서 init를 만들어야 함.
// var height : Int
// }
// let myComputer = Resolution(width:1920,height:1080) //Memberwise Initializer
// print(myComputer.width) //error발생.
class Resolution { //구조체 정의
var width : Int //프로퍼티 초기값이 없어요!!
var height : Int
init(width : Int, height : Int) { //초기값이 없기 때문에 init정의
self.width = width
self.height = height
}
}
let myComputer = Resolution(width:1920,height:1080) //Memberwise Initializer struct일때 초기값이 없는 경우에도 실행이 되는 이유가 이것 때문임.
print(myComputer.width) //1920 출력력
▶ 클래스 내에 구조체
struct Resolution {
var width = 1024
var height = 768
}
class VideoMode {
var resolution = Resolution()
var frameRate = 0.0
}
let myVideo = VideoMode()
print(myVideo.resolution.width) //1024
- Class vs Struct 구분
▷ 공통점
- 프로퍼티(property)를 정의할 수 있음
- []를 사용해 첨자(subscript) 문법으로 내부의 값을 액세스할 수 있는 첨자를 정의할 수 있음
- 클래스, 구조체, 열거형이 컬렉션 멤버에 접근하기 위한 문법
- 초기 상태 설정을 위한 초기화 함수(initializer)를 정의할 수 있음
- extension 가능 extension Double {}
- protocol 채택 가능 class Man : Runnable {}
▷차이점
■ class가 갖는 특징
- class는 상속이 가능
- 타입 캐스팅(is as as? as!)을 통해 실행 시점에 클래스 인스턴스의 타입을 검사하고 해석 가능
struct Resolution { //타입 이름은 대문자로 시작, Upper Camel Case
var width = 0 //클래스,구조체 안의 프로퍼티나 메소드는 lower Camel Case
var height = 0
}
class VideoMode { //타입 이름은 대문자로 시작, Upper Camel Case
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
▶ 구조체 - 값 타입(value type)
struct Human {
var age : Int = 1
}
var kim = Human()
var lee = kim //값 타입
print(kim.age, lee.age) //1 1
lee.age = 20
print(kim.age, lee.age) //1 20
kim.age = 30
print(kim.age, lee.age) //30 20
값 타입은 복사할 때 새로운 데이터가 하나 더 생긴다.
kim과 lee는 완전히 개인
▶ 클래스 - 참조 타입(reference type)
class Human {
var age : Int = 1
}
var kim = Human()
var lee = kim //참조(reference) 타입
print(kim.age, lee.age) //1 1
lee.age = 20
print(kim.age, lee.age) //20 20
kim.age = 30
print(kim.age, lee.age) //30 30
참조타입은 복사할 때 주소를 복사하기 때문에 한 데이터의 reference가 2개 생긴다.
→ 클래스는 주소(reference)를 복사하여 여러 변수가 같은 데이터를 공유하고, 구조체는 데이터 자체를 복사하여 각 변수가 독립적인 데이터를 가지는 것이 핵심 차이점입니다.
▷ 클래스와 구조체를 쓰는 경우
- 구조체 : 간단한 데이터 값들을 한데 묶어서 사용하는 경우, 전체 덩어리 크기가 작은 경우, 복사를 통해 전달해도 좋은 경우, 멀티 쓰레드 환경, 상속할 필요가 없는 경우(너비,높이를 표현하는 기하하적 모양을 처리할 경우, 시작값,증분,길이 등으로 순열을 표현할 경우, 3차원 좌표 시스템의 각 좌표)
- extension
: 기존 클래스, 구조체, 열거형, 프로토콜에 새로운 기능을 추가하는 기능
extension 기존타입이름 {
// 새로운 기능
}
- 두배의 값을 반환하는 프로퍼티를 추가
extension Double {
var squared : Double {
return self * self
}
}
let myValue: Double = 3.0
print(myValue.squared) //9.0
print(4.0.squared) //16.0
print(myValue.isZero) //instance property, false출력력
'iOS프로그래밍 실무' 카테고리의 다른 글
[2주차] - 자료형, 튜플, 옵셔널 등 (0) | 2025.04.15 |
---|---|
6주차 - iOS앱 (0) | 2025.04.09 |
[5주차] 간단한 iOS앱 만들기 (맛집 앱 1) (0) | 2025.04.02 |
[4주차] iOS프로그래밍 실무 (0) | 2025.03.26 |
3주차 - Night Light iOS앱 만들기 (0) | 2025.03.19 |