저번 스터디에 참여하면서 스터디장님이 내주신 문제가 있었는데
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 |