자바스크립트 리뷰
클래스 정의시 넣은 #length 같은 실수방지 코드의 단점과 그 해결책
가문비7
2023. 4. 6. 14:35
일단 #length 같은 실수방지 코드가 뭐나면 아래와 같다. 속성명 앞에 #을 넣어 private 하게 만들어 준다. 이러면 class 정의영역 밖에서 메서드를 아무리 써도 #length 값을 읽을수도, 바꿀수도 없다. 보호되는 것이다. 이게 참 좋은 취지지만 속성을 건들지 못하니 개발자들이 불편하다. 이 단점의 해결책이 getter와 setter이다.
class Square {
#length
constructor (length) {
this.setLength(length)
}
setLength (value) {
if (value <= 0) {
throw '길이는 0보다 커야 합니다.'
}
this.#length = value
}
getLength (value) {
return this.#length
}
getPerimeter () { return 4 * this.#length }
getArea () { return this.#length * this.#length }
}
// 클래스 사용하기
const square = new Square(10)
console.log(square) // Square {} 이 출력된다. 인스턴스를 읽을 수 없다.
console.log(`한 변의 길이는 ${square.getLength()}입니다.`)
// 예외 발생시키기
square.setLength(-10)
console.log(`한 변의 길이는 ${square.getLength()}입니다.`)
console.log(`둘레는 ${square.getPerimeter()}입니다.`)
getter는 물론 getLength() 메서드다. 속성값을 가져와서 사용할 수 있다. setter는 setLength() 메서드다. 속성값 자체를 바꿀 수 있다. 자세히 보면 생성자 (constructor)에서도 setter로 클래스를 정의하고 있다. 이렇게 하면 실수 방지 코드를 유지하면서도 값을 읽어오고 바꿀 수 있다.
console창에는 아래와 같이 뜰 것이다.
Square {}
한 변의 길이는 15입니다.
Uncaught 길이는 0보다 커야 합니다.