본문 바로가기
Swift

9. 구조체와 enum

by 루에 2015. 10. 6.
반응형

구조체


구조체는 클래스처럼 프로퍼티와 함수를 선언한다. 클래스와 마찬가지로 구조체 객체를 생성하면서 구조체에 선언한 프로퍼티 값을 초기화해야 한다. 다만 convenience initializer의 경우 메소드에 convenience를 작성하지 않는다. 구조체는 상속을 지원하지 않으므로 부모 클래스로의 초기화 위임을 하지 않는다.

struct Point {

    var x : Int

    var y : Int

    

    init() {

        self.x = 0

        self.y = 0

    }

}


var obj = Point()



Mutating


구조체는 객체를 생성한 이후 구조체 내부에서 구조체 값을 변경할 수 없다. 초기화 메소드를 제외한 다른 메소드에서 프로퍼티 값을 설정할 수 없다.


구조체 내부에서 객체의 값을 변경하려면 메소드에 mutating을 선언해준다.

struct Point2 {

    var x = 0

    var y = 0

    

    mutating func moveTo(x x : Int, y : Int) {

        self.x = x

        self.y = y

    }

    // mutating 붙이지 않으면 이미 값이 설정된 프로퍼티 값을 변경할 없다.

    func moveTo2(x : Int, y : Int) {

        self.x = x  // error

        self.y = y  // error

    }

}



value type과 reference type


클래스는 레퍼런스 타입이고 구조체는 밸류 타입이다. 가장 큰 차이는 밸류 타입인 구조체 객체는 다른 변수에 대입하면 그 객체는 복사되어 서로 다른 객체가 되지만, 레퍼런스 타입인 클래스는 복사되지 않으므로 하나의 객체를 공유하게 된다.



Swift의 밸류 타입


문자열 String, 배열 Array, 딕셔너리 Dictionary는 모두 구조체로 정의되어 있으므로 밸류 타입이다.

그러므로 객체를 다른 변수에 할당하면 서로 다른 객체가 된다.


애플에서 구조체는 위치, 길이나 크기와 같이 데이터에 좀 더 중점적이고, 값을 복사해도 되는 상황에서 사용하고 그 외에는 클래스를 사용할 것을 권장한다.



열거형(Enumeration)


선택 범위의 값을 이름으로 정의하는 타입이다. 숫자보다 의미 있는 이름으로 사용할 수 있어서 가독성 좋은 코드를 작성하고 범위 내에서 설정하게 되는 장점이 있다.

enum Day {

    case AM // case 이용해 enum 설정

    case PM

}

// enum 참조

Day.AM

Day.PM


// enum switch 적용

var aa : Day.PM

switch aa {

case .AM :

    print("오전")

case .PM :

    print("오후")

default :

    break

}



프로퍼티와 메소드


enum에도 프로퍼티와 메소드를 작성할 수 있다. 프로퍼티의 경우, 별도의 저장 공간이 필요한 저장 프로퍼티는 사용할 수 없고 계산 프로퍼티만 가능하다.

enum Pet : Int {

    case Cat = 0

    case Dog

    case Other

    

    var name : String {

        switch self {

        case .Cat:

            return "cat"

        case .Dog:

            return "dog"

        default:

            return "other"

        }

    }

    

    func description() -> String {

        return self.name

    }

}


// 프로퍼티와 메소드 사용

var raz = Pet.Cat   // Cat

raz.description()   // "cat"







반응형

댓글