클래스의 속성중 하나인 private속성은 class안에서만 사용하는 값이므로 외부에서 수정할 수 없고

확인도 할 수 없다.

 

때문에 상황에 따라서 속성을 읽고 쓸 수 있는 메소드를 만드는데 이것이 게터와 세터라고 할 수 있다.

 

여기서 게터는 getter라는 이름처럼 속성값을 확인할 때 사용하고

세터는 setter라는 이름처럼 속성값을 지정해줄 때 사용한다.

 

아래 코드를 보자

  // 정사각형 클래스
  class Square {
    #length							//#length는 private

    constructor (length) {					//클래스의 파라미터로 length 추가
      this.length = length
    }

    //아래 코드는 위의 길이값을 바탕으로 둘레, 한 변의 길이, 넓이를 계산하는 코드
    get length () {return this.#length}
    get perimeter () {return this.#length * 4}
    get area () {return this.#length * this.#length}
    
    //아래 코드는 set을 사용
    set length (length) {
      if (length <= 0) {
        throw '길이는 0보다 커야 합니다.'
      }
      this.#length = length
    }
  }

  // 클래스 사용하기
  const squareA = new Square(10)
  console.log(`한 변의 길이: ${squareA.length}`)
  console.log(`둘레: ${squareA.perimeter}`)
  console.log(`넓이: ${squareA.area}`)

  // 예외 발생시키기
  const squareB = new Square(-10)
  
  // 실행결과
  // 한 변의 길이: 10
  // 둘레: 40
  // 넓이: 100
  // 에러 하나

자, 여기서 length는 private다.

 

아래 get을 사용한 코드 3줄이 있는데, 이것은 private 값인 length를 이리저리 조작해서 얻은 값을 불러오게 하는 코드다

실제로 아래 '클래스 사용하기' 줄을 보면 결과적으로, private값을 가져온 것을 알 수 있다.

 

아래 set을 사용한 코드를 보면 조건문의 경우는 그냥 에러걸러내는 용이니 넘어가고 그 다음줄을 보면

this.#length = length가 있다.

즉 private 값인 #length에 외부에서 가져온 파라미터 값인 length를 넣는다는 뜻이다.

 

결과적으로 외부에서 내부 private에 간섭을 한것이라고 볼 수 있는데

 

어쨌든 값 변화는 클래스 내부에서 일어난 것이기 때문에 문제는 없다.

 

 

정리

밖과 절대로 소통하지 않는 방구석 폐인에게 외부인이 편지를 써봤자 그 폐인은 우체통을 결코 확인하지 않을 것이다.

때문에 그와 함께 사는 가족들에게 직접 편지를 건네고

그 가족을 통해 폐인에게 편지가 도착하는 것이다.

 

여기서 방구석 폐인은 private라고 할 수 있고

그와 소통해주는 가족이 게터와 세터라고 할 수 있고

외부인은 그 private에 접근하려고 하는 외부인자들이라고 할 수 있다.

 

다만 주의해야할 것이

코딩의 편의성을 위해 모든 private에 게터와 세터를 사용하려는 경우가 있을 수 있다는 것이다.

하지만 그렇게 했다간 대체 왜 private 속성을 사용하겠는가

만약 값을 함부로 보여줘선 안 된다고 한다면 게터와 세터의 사용을 지양해야 할 것이다.

 

마지막으로 게터와 세터 코드의 간결한 코드를 작성하고 끝내겠다.

 

class 클래스 이름{
	get 이름() {return 값}
    set 이름(value) {}
}

 

 

+ Recent posts