[Swift] 구조체, 클래스, 열거형

승아·2021년 4월 17일
0

부스트코스-iOS 프로그래밍을 위한 스위프트 기초

✅⠀구조체란?

  • 스위프트 대부분 타입은 구조체로 이루어져 있습니다.
  • 구조체는 값(value) 타입입니다.
  • 타입이름은 대문자 카멜케이스를 사용하여 정의합니다.
struct Sample {
    // 가변 프로퍼티(값 변경 가능)
    var mutableProperty: Int = 100 
    
    // 불변 프로퍼티(값 변경 불가능)
    let immutableProperty: Int = 100 
    
    // 타입 프로퍼티(static 키워드 사용 : 타입 자체가 사용하는 프로퍼티)
    static var typeProperty: Int = 100 
    
    // 인스턴스 메서드(인스턴스가 사용하는 메서드)
    func instanceMethod() {
        print("instance method")
    }
    
    // 타입 메서드(static 키워드 사용 : 타입 자체가 사용하는 메서드)
    static func typeMethod() {
        print("type method")
    }
}

✅⠀클래스란?

  • 클래스는 참조(reference) 타입입니다.
  • 타입이름은 대문자 카멜케이스를 사용하여 정의합니다.
  • Swift의 클래스는 다중 상속이 되지 않습니다.
class Sample {
    // 가변 프로퍼티
    var mutableProperty: Int = 100 

    // 불변 프로퍼티
    let immutableProperty: Int = 100 
    
    // 타입 프로퍼티
    static var typeProperty: Int = 100 
    
    // 인스턴스 메서드
    func instanceMethod() {
        print("instance method")
    }
    

    // 타입 메서드
    // 상속시 재정의 불가 타입 메서드 - static
    static func typeMethod() {
        print("type method - static")
    }
    
    // 상속시 재정의 가능 타입 메서드 - class
    class func classMethod() {
        print("type method - class")
    }
}

✅⠀열거형이란?

  • 유사한 종류의 여러 값을 한 곳에 모아서 정의한 것입니다. 예) 요일, 월, 계절 등
  • enum 자체가 하나의 데이터 타입으로, 대문자 카멜케이스를 사용하여 이름을 정의합니다.
  • 각 case는 소문자 카멜케이스로 정의합니다.
  • 각 case는 그 자체가 고유의 값입니다.(각 case에 자동으로 정수값이 할당되지 않음)
  • 각 case는 한 줄에 개별로도, 한 줄에 여러개도 정의할 수 있습니다.
enum Weekday {
    case mon
    case tue
    case wed
    case thu, fri, sat, sun
}

// 열거형 타입과 케이스를 모두 사용하여도 됩니다
var day: Weekday = Weekday.mon

// 타입이 명확하다면 .케이스 처럼 표현해도 무방합니다
day = .tue

print(day) // tue

// switch의 비교값에 열거형 타입이 위치할 때
// 모든 열거형 케이스를 포함한다면
// default를 작성할 필요가 없습니다
switch day {
case .mon, .tue, .wed, .thu:
    print("평일입니다")
case Weekday.fri:
    print("불금 파티!!")
case .sat, .sun:
    print("신나는 주말!!")
}

rawValue (원시값)

  • C 언어의 enum 처럼 정수값을 가질 수 있습니다.
  • rawValue는 case별로 각각 다른 값을 가져야합니다.
  • 자동으로 1이 증가된 값이 할당됩니다.
  • rawValue를 반드시 지닐 필요가 없다면 굳이 만들지 않아도 됩니다.
  • 정수 타입 뿐만 아니라, Hashable 프로토콜을 따르는 모든 타입을 원시값의 타입으로 지정 할 수있습니다.

원시값을 통한 초기화

  • rawValue를 통해 초기화 할 수 있습니다.
  • rawValue가 case에 해당하지 않을 수 있으므로, rawValue를 통해 초기화 한 인스턴스는 옵셔널 타입입니다.

메서드

  • Swift 열거형에는 메서드도 추가할 수 있습니다.

✅⠀클래스 vs 구조체/열거형

  • 클래스는 참조타입, 열거형과 구조체는 값 타입이라는 것이 가장 큰 차이
  • 클래스는 상속이 가능하지만, 열거형과 구조체는 상속이 불가능 하다.

값 타입과 참조 타입

  • 값 타입(Value Type) : 데이터를 전달 할 때 값을 복사하여 전달한다.
  • 참조 타입(Reference Type) : 데이터를 전달 할 때 값의 메모리 위치를 전달합니다.

값 타입을 사용하는 경우

  • 연관된 몇몇의 값들을 모아서 하나의 데이터 타입으로 표현하고 싶은 경우
  • 다른 객체 또는 함수 등으로 전달될 때 참조가 아니라 복사(값 복사) 할 경우
  • 자신을 상속할 필요가 없거나, 다른 타입을 상속 받을 필요가 없는 경우

0개의 댓글