쌓고 쌓다

[JavaScript] private 속성과 메소드 + get, set 키워드 본문

프로그래밍/JavaScript

[JavaScript] private 속성과 메소드 + get, set 키워드

승민아 2023. 1. 10. 14:14

아래와 같이 정사각형 클래스가 있다고 하자.

class Square {
    constructor(length) {
        if(length<=0){
            throw '길이는 0보다 커야함.'
        }
        this.length = length
    }
    
    getArea() {
        return this.length * this.length
    }
}

누군가 길이를 잘못 넣는 것을 방지하고자 if문을 추가하였다.

 

그런데 누군가 아래처럼 객체 생성 후에 수정하는 것을 막지 못한다.

const square = new Square(5)
square.length = -1

 

이처럼 클래스 또는 객체를 잘못 사용하는 것을 막기 위해, 클래스의 안정성을 올리기 위해 나온 문법이

private 속성과 메소드이다.

 

private 속성과 메소드

 

형태

class 클래스이름 {
    #속성이름
    
    #메소드이름() {
        ....
    }
}

private 속성과 메소드는 이름 앞에 #을 붙인다.

중요한 것은 private 속성을 사용하려면 클래스에 #속성이름을 미리 작성해놔야 한다는 것이다.

#length 미리 작성

 

그리고 이 속성을 사용하려면 이름 앞에 #을 붙여 사용해야 한다.

private 속성을 이용하여 정사각형 클래스를 다시 만들어 보자.

 

 

정사각형 클래스

class Square {
    #length

    constructor(length) {
        if(length<=0){
            throw '길이는 0보다 커야함.'
        }
        this.#length = length
    }
    
    getArea() {
        return this.#length * this.#length
    }
}

 

private 속성 접근 및 수정

const square = new Square(5)
square.length = -1

누군가 객체를 생성하고 length를 -1로 수정하여도

length 속성이 추가될 뿐이지

private 속성 #length는 수정이 되지 않는다.

length가 생길뿐...

 

const square = new Square(5)
square.#length = -1

누군가 #length로 private 속성에 수정을 가하려 해도 외부에서는 수정이 불가능해진다.

#length 수정 불가

 

물론 접근하여 출력만 하려고 해도 안된다.

private 속성 접근

 

하지만 Square 클래스 내부의 메소드에서는 privte 속성에 접근이 가능하다.

내부 메소드로 접근

getArea 메소드에서 #length 속성을 이용해 넓이를 계산해 반환해 준다.

 

 

private 속성은 클래스 외부에서 해당 속성에 접근할 수 없다.

그럼 어떻게 접근하고 수정하는가?

게터(getter), 세터(setter) 메소드를 만들어 private에 접근 수정한다.

 

게터와 세터

게터 세터라고 뭐 어렵게 생각할 필요 없다 키워드를 사용할 수 있지만

간단하게 그냥 private 속성에 접근 및 수정이 가능한 메소드를 만드는 것이다.

 

게터 세터가 있는 클래스

class Square {
    #length

    constructor(length) {
        if(length<=0){
            throw '길이는 0보다 커야함.'
        }
        this.#length = length
    }
    
    getLength() {
        return this.#length
    }

    setLength(length) {
        if(length<=0){
            throw '길이는 0보다 커야함.'
        }
        this.#length = length
    }
}

게터 세터 메소드

 

get, set 키워드를 사용한 클래스

위의 메소드를 만들어 사용하는 것이 아닌 get 키워드와 set 키워드 문법을 통해 작성이 가능하다.

 

형태

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

 

get, set 키워드로 작성된 클래스

class Square {
    #length

    constructor(length) {
        if(length<=0){
            throw '길이는 0보다 커야함.'
        }
        this.#length = length
    }
    
    get length() {
        return this.#length
    }

    set length(value) {
        if(value<=0){
            throw '길이는 0보다 커야함.'
        }
        this.#length = value
    }
}

get, set 키워드 사용

 

여기서 중요한 것은 get set 키워드를 사용하여 메소드를 만들었지만

사용할 때는 속성을 사용하는 형태로 사용해야 한다!

자동으로 게터와 세터가 호출되기 때문이다.

 

get, set 사용

const square = new Square(5)
square.length = 777 // square.length(777)는 에러남!
console.log(square.length) // square.length()는 에러남!

 

사용할때 메소드 형태가 아닌 속성 형태로 그냥 사용하면 된다!

Comments