자바스크립트 리뷰
class 정의시 사용자 실수방지 코드를 넣었음에도 사용자가 메서드까지 써서 굳이 실수할 때는? [혼공자 9-2-7]
가문비7
2023. 4. 6. 13:35
제목과 같은 경우도 있을 것이다. 아래 코드를 보자.
// 정사각형 클래스
class Square {
constructor (length) {
if (length <= 0) {
throw '길이는 0보다 커야 합니다.'
}
this.length = length
}
getPerimeter () { return 4 * this.length }
getArea () { return this.length * this.length }
}
// 클래스 사용하기
const square = new Square(10)
square.length = -10
console.log(`정사각형의 둘레: ${square.getPerimeter()}`)
console.log(`정사각형의 넓이: ${square.getArea()}`)
사용자는 굳이 square.length 메소드를 통해 square 클래스의 파라미터로 음수를 넣었다. 이 경우 throw를 통해 빨간 에러메시지가 나도록 조치해 놓은 방패막도 뚫고 length가 음수인 class가 하나 생겨 버린다. console창에는 아래처럼 찍힌다.
Square {length: -10}
이런 경우를 대비하는 코드가 바로 아래와 같다.
// 사각형 클래스
class Square {
#length
constructor (length) {
if (length <= 0) {
throw '길이는 0보다 커야 합니다.'
}
this.#length = length
}
getPerimeter () { return 4 * this.#length }
getArea () { return this.#length * this.#length }
}
// 클래스 사용하기
const square = new Square(10)
square.length = -10
console.log(`정사각형의 둘레: ${square.getPerimeter()}`)
console.log(`정사각형의 넓이: ${square.getArea()}`)
#이 square.length = -10 이라는 메소드로부터 class Square를 보호해 준다. length 를 private 속성으로 만든 것이다. 이 #을 건드리려면 애초에 class Square를 정의한 코드에서 건드려야 한다. 외부에서는 아무리 square.#length = -10 이런 식으로 건드려도 에러메시지만 날 뿐 #length값을 바꿀 수 없다. #length의 privacy는 지켜진다.