본문 바로가기
etc/Swift

프로퍼티

by IT learning 2021. 5. 27.
728x90

 

오늘은 프로퍼티의 다양한 사용에 대해 공부했다.

 

프로퍼티는 구조체, 클래스, 열거형 내부에 구현 할 수 있다. 약간 C++로 따지자면 생성자, 함수, 변수 등으로 나눠지는 느낌이다.

단 열거형 내부에는 연산 프로퍼티만 구현할 수 있다.

 

인스턴스 저장 프로퍼티

struct Student {
    
    // 인스턴스 저장 프로퍼티
    var name: String = ""
    var `class`: String = "Swift"
    var koreanAge: Int = 0
  }

각 타입에 맞는 것들을 저장 할 수 있는 저장 프로퍼티이다.

 

인스턴스 연산 프로퍼티

struct Student {
    
    // 인스턴스 연산 프로퍼티
    var westernAge: Int {
        get {
            return koreanAge - 1
        }
        // 직접 저장하고 그러는게 아니라 위에 저장 프로퍼티를 끌어와서 연산을 한 후에
        // 할당을 해주거나 변환을 해주는 작업을 수행할 수 있다.
        set(inputValue) {
            koreanAge = inputValue + 1
        }
    }
  }

기존의 저장 프로퍼티는 뭔가를 입력받아 저장만 하는 용도였다면, 연산 프로퍼티는 저장된 저장 프로퍼티를 가져와 연산을 한 후에 다시 할당을 해주는 역할을 하게 된다. 하지만, 연산 프로퍼티 단독적으로 뭔가를 저장하고 막 그러는 것이 아님을 기억해라.

 

타입 저장 프로퍼티

struct Student {
    
    // 타입 저장 프로퍼티
    static var typeDescription: String = "학생"
  }

구조체에서 바로 불러올 수 있는 타입 저장 프로퍼티도 이렇게 생성이 가능하다.

 

읽기전용 인스턴스 연산 프로퍼티

struct Student {
    
    /*
     // 인스턴스 메서드
     func selfIntroduce() {
        print("저는 \(self.class)반 \(name)입니다")
     }
     */
    
    // 읽기전용 인스턴스 연산 프로퍼티
    var selfIntroduction: String {
        get {
            return "저는 \(self.class)반 \(name)입니다."
        }
    }
 }

기존의 인스턴스 메서드도 가능하지만, 읽기전용 인스턴스 연산 프로퍼티를 이용해 출력을 할 수 있다. 읽기전용이라함은 get 블럭만 유지해놓고 프로퍼티를 만든 것을 의미한다.

 

읽기 전용 타입 연산 프로퍼티

struct Student {
    
    /* 타입 메서드
     static func selfIntroduce() {
         print("학생입니다")
     }
    */
    
    // 읽기전용 타입 연산 프로퍼티
    // 일기전용에서는 get을 생략할 수 있습니다.
    static var selfIntroduction: String {
        return "학생입니다"
    }
 }

기존의 타입 메서도드 사용이 가능하지만, 읽기 전용 타입 연산 프로퍼티로 기존의 기능을 대체할 수 있다. 타입 연산 프로퍼티이기때문에 static 이 붙는다. 구조체를 바로 불러와 사용이 가능하다.

 

사용

// 타입 연산 프로퍼티 사용
print(Student.selfIntroduction)
// 학생타입입니다

// 인스턴스 생성
var ITlearning: Student = Student()
ITlearning.koreanAge = 10

// 인스턴스 저장 프로퍼티 사용
ITlearning.name = "ITlearning"
print(ITlearning.name)
// ITlearning

// 인스턴스 연산 프로퍼티 사용
print(ITlearning.selfIntroduction)
// 저는 Swift반 ITlearning 입니다

print("제 한국나이는 \(ITlearning.koreanAge)이고, 미국나이는 \(ITlearning.westernAge)살입니다")

코드를 차근차근 풀어보자.

 

아까 읽기 전용 연산 프로퍼티를 생성했었다. 그리고 static 키워드가 붙어있었다. 그래서 구조체를 바로 불러와서 사용할 수 있다.

 

그리고 인스턴스를 생성해 값을 변경해 출력하는 모습이 보인다.

 

응용

struct Money {
    var currencyRate: Double = 1100
    var dollar: Double = 0
    var won: Double {
        get {
            return dollar * currencyRate
        }
        set { // newValue - 특별히 매개변수 이름을 넣지 않았을 경우에 할당된다.
            dollar = newValue / currencyRate
        }
    }
}

var moneyInPocket = Money()

moneyInPocket.won = 11000

print(moneyInPocket.won)
// 11000

moneyInPocket.dollar = 10
print(moneyInPocket.won)
// 11000

먼저 Money라는 이름의 구조체를 만들고, 안에는 저장 프로퍼티, 연산 프로퍼티를 생성한게 보인다.

연산 프로퍼티에서 처음보는 것이 하나 있다. 쓰기 부분에 newValue 키워드이다. 특별히 매개변수 이름을 넣지 않을 경우에 자동으로 저 키워드에 할당을 해준다. 유용하게 쓸 수있을 듯하다. 그리고, moneyInPocket 인스턴스를 생성해 사용할 수 있게 했다. 값을 변경하고 won 의 값을 변경할때는 바로 get 블럭이 보여지고, dollar를 조정했을 경우 set 블럭이 발동해 10 * 1100 을 하게 되어 11000이 나오게 된다.

 

지역변수,전역변수

var a: Int = 100
var b: Int = 200
var sum: Int {
    return a + b
}

print(sum) // 300

저장 프로퍼티와 연산 프로퍼티의 기능은 함수, 메서드, 클로저, 타입 등의 외부에 위치한 지역/전역 변수에도 모두 사용이 가능하다.

전역 변수를 생성해 연산 프로퍼티에서 사용을 해 출력하는 모습의 코드이다.

728x90

'etc > Swift' 카테고리의 다른 글

상속  (0) 2021.05.28
프로퍼티 감시자  (0) 2021.05.27
클로저 고급  (0) 2021.05.26
클로저  (0) 2021.05.24
클래스 vs 구조체 / 열거형  (0) 2021.05.24

댓글

IT_learning's Commit