18. Property and Method

13287 단어 swiftswift

1. Property

* 정의

프로퍼티는 우리말로 속성으로, 형식 내에 존재하는 값이라고 할 수 있다. 프로퍼티의 종류로는 저장 프로퍼티(Stored Properties)와 연산 프로퍼티(Computed Properties)가 있다.
ex) 
struct Person {
    let name: String // Constant Instance Stored Property 
    var birthYear: Int // Variable Instance Stored Property 
위에서 보이는 것 처럼, 저장 프로퍼티는 말 그대로 형식 내부에서 값을 저장하고 있는 프로퍼티이다. 변수와 상수 둘다 선언이 가능하다.
    var age: Int {  //  Read-Only Instance Computed Property 
    get {
        let calender = Calendar.current
        let year = calender.component(.year, from: Date())
        return year - birthYear
    }
계산 프로퍼티는 특정하게 계산한 값을 반환해 주는 프로퍼티이다. 실제 값을 메모리에 저장을 하고 있는 것은 아니고, 해당 프로퍼티로 접근을 하여 계산된 값을 읽어오거나, 다른 프로퍼티의 값을 변경하는 역할을 한다.
let p  = Person(name: "김무개", birthYear: 1990)
p.age // 30
그레고리력 속성의 달력에 현재시점을 알려주는 Date()메소드의 속성 중에서 연도를 알려주는 year 속성을 불러와, 태어난 날짜를 차감(계산)하여 결과가 return 되는 것을 볼 수 있다.
지금까지 위에서 다루었던 프로퍼티들은 인스턴스에 속한 '인스턴스프로퍼티' 였다. 그러나 타입프로퍼티는 인스턴스에 속한 프로퍼티가 아닌 타입에 속한 프로퍼티이다. 때문에 인스턴스를 생성하지 않아도, 타입을 통해 접근할 수 있으며 타입자체에 생성자가 없기 때문에 항상 초기값을 가지고 있어야 한다. 타입프로퍼티는 변수나 상수 키워드 앞에 'static'을 붙여주기만 하면 된다
struct Person {
    let name: String // Constant Instance Stored Property
    var birthYear: Int
    static var fakeGrade: String = "A+" // Type Property
    var age: Int {  //  Read-Only Instance Computed Property
        get {
            let calender = Calendar.current
            let year = calender.component(.year, from: Date())
            return year - birthYear
        }
    }
}
var p  = Person(name: "김무개", birthYear: 1990)
p.age
p.birthYear
Person.fakeGrade // 타입(Person)을 통해 접근해야 비로소 초기화가 이루어진다. 
Lazy Property도 Type Propery와 초기화방식이 동일하다. 프로퍼티에 접근을 하는 시점에 초기화가 된다. 그러나 Type Property 처럼 타입에 접근하는 것이 아닌, 인스턴스을 통해 접근을 해야 한다. 즉 Lazy Property는 인스턴스 프로퍼티이다.
1.) 인스턴스 이름으로 (접근/호출) => 인스턴스 프로퍼티
2.) 타입 이름으로 접근/호출) => 타입프로퍼티

2. Method

* 정의

특정한 동작을 수행하는 코드블록으로써 함수와 기능면에서는 크게 다르지 않다. 그러나 어디에 속해 있는가가 둘의 차이를 나타낸다. 이전에 공부했던 함수는 전역범위에 위치해 있는 코드블록이며, 메소드는 특정 타입 내에 존재하는 코드블록이다.

struct Size {
    var width: Double
    var height: Double
    
    func area() -> Double { // Method
        return width * height 
    }
    
    init(width: Double , height: Double) {
        self.width = width   
        self.height = height 
    }
    
    mutating func reset() { // Mutating Method
        width = 0.0         
        height = 0.0
        Size.doSomething() 
    }

    static func doSomething() {
        var s = Size(width: 100, height: 100)
        s.reset()
    }
}
Size 구조체 안에 area 메소드가 width 와 height 를 곱한값을 return 해주고 있다. 그런데 그 밑에 mutating이라는 키워드가 붙은 메소드가 존재한다. 저것은 무엇일까?
=> 구조체와 열거형은 값 타입이다. 그 말은 기본적으로 Size 내부의 속성은 메소드에서 수정을 하는 것이 불가능하다는 뜻이다. 그러나 그럼에도 반드시 수정을 해야 한다면 mutataing 키워드를 메소드 앞에 붙여서 표현하면 된다.

* 서로 다른 멤버들끼리의 접근

    static func doSomething() {
        var s = Size(width: 100, height: 100)
        s.reset()
    }
Size 구조체를 잘보면 Type Method (doSomething) 가 있는 것을 알 수 있다. 그리고 메소드안에서 다른메소드로 접근을 하고 있다. 방식은 총 두가지로 나뉜다.
1. Instance Member에서 Type Member로 접근
2. Type Member에서 Instance Member로 접근
Instance Member에서 Type Member로 접근할때는 간단하다.
mutating func reset() { 
        width = 0.0         
        height = 0.0
        Size.doSomething()  // 접근
    }  
=> 이렇게 타입뒤에 메소드를 호출하면 된다.
그러나 Type Member에서 Instance Member로 접근하는 것은 상대적으로 조금 복잡하다.
    static func doSomething() {
        var s = Size(width: 100, height: 100)
        s.reset()
    }
=> 메소드 내부에 인스턴스를 생성하여, 해당 메소드를 호출한다.

좋은 웹페이지 즐겨찾기