자바스크립트 리뷰

클래스 정의시 넣은 #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보다 커야 합니다.