티스토리 뷰

언어 소개 - Swift

Swift - 프로퍼티

최초의 펭귄 2018. 6. 1. 16:30

안녕하세요. 오늘은 Swift의 프로퍼티에 대해 알아보겠습니다.
먼저 이 글은 제가 경험하면서 해석한 정의이기에 오류가 있을 수 있습니다.
(오류사항은 하단에 댓글로 남겨주시면 바로 수정하겠습니다!)

객체의 속성과 동작

객체 지향 프로그래밍은 객체들의 상호작용으로 하나의 커다란 문제를 해결합니다.
객체는 속성과 동작을 가지는데 속성은 그 객체가 가지고 있는 특성이며
동작은 객체가 속성을 가지도 어떠한 행동을 정의한 것이며
여러 객체의 동작의 상호작용을 통해 문제를 해결합니다.

그렇기에 객체를 생성하기 위해 속성과 동작은 필수적입니다.

오늘 말할 프로퍼티는 이 객체가 가지고 있는 특성을 Swift로 정의하는 것을 의미합니다.

프로퍼티

Swift의 프로퍼티는 3가지로 나눌 수 있습니다.

  • 저장 프로퍼티 : 인스턴스의 변수나 상수
  • 연산 프로퍼티 : 직접적인 값을 저장하지 않고 값을 연산한 결괏값
  • 타입 프로퍼티 : 특정 타입에 사용되는 프로퍼티 (클래스 변수)
    Swift는 추가적으로 프로퍼티의 변화를 감시하는 프로퍼티 감시자도 있습니다.

저장 프로퍼티 && 지연 저장 프로퍼티

객체의 속성을 저장하는 기본적인 프로퍼티입니다.
Swift는 지연 저장 프로퍼티도 제공하는데
기본적으로 모든 프로퍼티는 객체에 생성될 때 초기화가 되는 반면
지연 저장 프로퍼티는 호출이 되어야만 초기화를 합니다.
그렇기에 지연 저장 프로퍼티는 상수(let)으로 선언할 수 없습니다.

지연 저장 프로퍼티를 잘 사용하면 성능저하나 공간 낭비를 줄일 수 있습니다.
(아직 경험이 부족하여 경험을 남기지 못합니다. ㅠㅠ)

연산 프로퍼티

실제 값을 저장하는 프로퍼티가 아닌
여러 값들을 참조하여 값을 돌려주거나 내부의 은닉화 된 프로퍼티를 설정하는 프로퍼티입니다.
(기존 언어의 Getter, Setter의 역할을 수행할 수 있습니다.)
기존 언어의 Getter, Setter보다 코드의 분산도 줄고 직관적이라는 장점을 가지고 있습니다.

// 참조 야곰의 Swift 프로그래밍
struct Point{
    var x: Int
    var y: Int

    var oppositePoint: Point{
        set(point){
            x = - point.x
            y = - point.y
        }
        get{
            return Point(x: -x, y: -y)
        }
    }

}

val point = Point(x: 10, y: 10)
print(point.oppositePoint)
// -10, -10
print(point)
// 10, 10
point.oppositePoint = Point(x: 10, y: 10)
print(point)
// -10, -10

또한 set에 매개변수 이름을 선언하지 않아도
newValue라는 이름으로 매개변수를 사용할 수 있습니다.

var oppositePoint: Point{
    set{
        x = - newValue.x
        y = - newValue.y
    }
    get{
        return Point(x: -x, y: -y)
    }
}

프로퍼티 감시자

프로퍼티 감시자는 프로퍼티의 값이 변경됨에 따라 어떠한 동작을 실행할 수 있도록 합니다.
프로퍼티 감시자는 값이 할당될 때마다 호출되므로 값의 변화가 같더라도 호출됩니다.
프로퍼티 감시자는 오직 일반 저장 프로퍼티에만 적용이 가능합니다.
추가적으로 override되는 저장 프로퍼티와 연산 프로퍼티에도 적용이 가능합니다.

var num: Int = 0{
    willSet{
        print("num이 \(num)에서 \(newValue)로 변경됩니다.")
    }
    didSet{
        print("num이 \(oldValue)에서 \(num)으로 변경되었습니다.")
    }
}

// num이 0에서 10으로 변경됩니다.
num = 10
// num이 0에서 10으로 변경되었습니다.

프로퍼티 감시자는 willSet과 didSet이라는 두가지 메소드를 가지고 있으며
각각 변경되기 전, 변경된 후에 한번씩 호출됩니다.
또한 각각 newValue, oldValue라는 인자를 통해 변경 전후의 값을 확인 할 수 있습니다.

여기서 잠깐
프로퍼티 감시자가 있는 프로퍼티가 inout키워드를 사용되어 함수에 전달되었다면
함수가 종료되는 시점에 무조건 호출됩니다.
(값이 변경되어도 변경되지 않아도)

타입 프로퍼티

타입 프로퍼티는 인스턴스에 소속되지 않고 타입에 속하는 프로퍼티입니다.
타입 프로퍼티는 모든 인스턴스가 공통으로 사용하는 값이나
공용으로 접근하는 값을 정의할 때 유용합니다.

타입 프로퍼티는 저장 타입, 연산 타입으로 선언할 수 있으며
지연 초기화되며 단 한 번만 초기화 됩니다.

마치며

오늘은 프로퍼티의 종류에 대해 알아보았으며
프로퍼티를 사용하면서 느낀 제 생각에 맞추어 정의를 내렸습니다.
윗 내용에서 궁금한 점이나 오류사항은 하단의 댓글로 남겨주세요!

감사합니다.

'언어 소개 - Swift' 카테고리의 다른 글

Swift - 접근지정자  (1) 2018.06.02
Swift - 클로저  (0) 2018.06.02
Swift - 클래스와 구조체  (0) 2018.05.31
Swift - 옵셔널  (0) 2018.05.30
Swift - 흐름 제어  (0) 2018.05.29
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday