본문 바로가기

Swift

[Swift] lazy?

저번 스터디에 참여하면서 스터디장님이 내주신 문제가 있었는데

7. 몬스터를 클래스로 추상화하려고 한다.
MARK: 몬스터는 다음과 같은 속성들과 특징을 가지고 있다.
 - hp, mp, atk, level, damage
 - hp는 level * 50의 값을 가지고 있다. MARK: (Hint : lazy)
 - 각 속성들은 생성된 인스턴스에서 접근할 수 없다.
 - damage는 atk * level의 값을 반환하는 읽기 전용 변수이다.
 
MARK: 몬스터는 다음과 같은 스킬을 가지고 있다.
 - attack(enemy: Monster)
    - enemy에게 damage를 입힌다.
 
 - checkMyHp()
    - 객체의 hp를 출력한다.

 - getDamage(damage: Int)
    - 받은 damage만큼 체력이 감소된다.
 
TODO:
 1) 몬스터 두마리 ( slime, skeleton ) 생성한다.
 2) 몬스터는 각각 다음과 같은 스텟을 가지고 있다.
    -slime      ( level: 10, mp: 50, atk: 10)
    -skeleton   ( level: 15, mp: 20, atk: 25)
 3) slime이 skeleton을 공격하여 skeleton의 hp를 출력하시오.

바로 요거!

 

근데 여기서 lazy라는 키워드가 있었다..! 나는 처음봐 이거..

그래서 정리하고자 한당

 

 

 


lazy?

- swift에서는 메모리에 굉장히 예민! 따라서 메모리 관리를 굉장히 예민하게 해주어야하는데, 이때 사용될 수 있는 키워드가 바로 lazy이다.

- 프로퍼티 선언에 쓰이며 꼭 var 키워드와 함께 사용되어야 한다!

- lazy는 뜻이 "지연"이라는 거 그대로, 다른 프로퍼티의 선언에 비해 선언이 지연된다는 뜻이다

- 즉, lazy로 선언된 프로퍼티는 사용되기 전에는 메모리상에 올라가지 않고 사용되어야 비로소 메모리 상에 올라가게 되는 것이다!

- 따라서, 메모리 관리를 효율적으로 할 수 있음 :)

 

 

 

위의 문제에서 

 - hp는 level * 50의 값을 가지고 있다. MARK: (Hint : lazy)

라고 되어있듯

실제로 해답 코드로 hp 프로퍼티의 선언은

private var lazy hp: Int = level * 50

이렇게 선언될 것이다.

hp 프로퍼티는 딱 이 hp가 필요할 때 level * 50이 연산되어 메모리 상에 올라가게 되는 것!

 

 

'Swift' 카테고리의 다른 글

[Swift] Extension  (0) 2022.08.24
[Swift] Protocol  (0) 2022.08.24
[Swift] Any / AnyObject  (0) 2022.08.14
[Swift] 타입캐스팅 : is, as  (0) 2022.08.13
[Swift] 서브스크립트  (0) 2022.08.13