쌓고 쌓다
[JavaScript] private 속성과 메소드 + get, set 키워드 본문
아래와 같이 정사각형 클래스가 있다고 하자.
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 속성을 사용하려면 클래스에 #속성이름을 미리 작성해놔야 한다는 것이다.
그리고 이 속성을 사용하려면 이름 앞에 #을 붙여 사용해야 한다.
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는 수정이 되지 않는다.
const square = new Square(5)
square.#length = -1
누군가 #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 사용
const square = new Square(5)
square.length = 777 // square.length(777)는 에러남!
console.log(square.length) // square.length()는 에러남!
사용할때 메소드 형태가 아닌 속성 형태로 그냥 사용하면 된다!
'프로그래밍 > JavaScript' 카테고리의 다른 글
[JavaScript] Promise(프로미스) + 콜백 지옥 (0) | 2023.01.13 |
---|---|
[JavaScript] static 속성과 메소드 (0) | 2023.01.11 |
[JavaScript] 상속과 오버라이드(오버라이딩) (0) | 2023.01.09 |
[JavaScript] ToDoList 만들기 (0) | 2023.01.09 |
[JavaScript] 클래스 (+객체) (0) | 2023.01.08 |