1. 접근 제어자(Access modifier) 란?
접근 제어자는 클래스 내부에서 특정 속성이나 메서드에 대한 접근 권한을 제어하는 방법이다.
사실 JavaScript는 프로토타입 기반의 언어이기 때문에
전통적인 접근 제어자인 public, protected, private 키워드를 지원하지 않아,
필요하다면 임의의 패턴을 이용하여 이러한 기능을 사용해야 했다.
ES6 이후 #을 사용하여 비공개(private) 필드를 정의할 수 있는 문법이 추가되었다.
접근제어자를 사용하여 접근권한을 제어하는 이유가 뭘까?
클래스는 외부에서 객체가 어떻게 사용할지를 결정하고, 객체는 각 클래스의 속성을 이용한다.
이때 자바스크립트에서는 기본적으로 모든 속성과 메서드가 클래스의 public 접근 권한을 가지기 때문에
클래스 외부에서 직접 접근할 수 있다.
즉,
객체지향프로그래밍(OOP)에서는 클래스의 내부 구현을 외부로부터 직접 접근할 수 있기 때문에
그로 인해 객체의 무결성이 쉽게 손상될 수 있다.
따라서 객체의 상태를 안전하게 유지하고 불필요한 외부 접근을 차단하는 것이 중요하다.
📌 접근 제어자의 주요 특징
1. public (공개)
-클래스 외부에서 자유롭게 접근 가능
-JS 는 기본적으로 클래스의 모든 속성과 메서드가 public 으로 설정
-외부에서 사용할 메서드는 public 으로 정의
2. private (비공개)
- 클래스 내부에서만 접근
-외부에서 변경되지 않아야 하거나 내부에서만 관리해야만 하는 속성에 적합
3. protected (보호)
- 객체지향개념에서는 주로 서브클래스(상속받은 클래스)에서만 접근할수있도록 보호된 멤버이당
⏭️ JavaScript에서는 public이 기본 접근 제어자이며, #을 통해 private을 구현할 수 있다.
2. 코드 구현
(1) 접근제한자를 사용하지 않은 경우
class BankAccount {
constructor(initialBalance) {
this.balance = initialBalance;
// public 필드
}
}
const account = new BankAccount(1000);
//new 를 통해 새로운 생성자 함수를 만들어서 BankAccount 메서드 사용하려고 함
account.balance = -5000;
// 외부에서 직접 수정 가능 - 잘못된 값이 들어감
console.log(account.balance);
// -5000
코드를 잘 살펴보면,
BankAccount 클래스는 this를 통해 initialBalance를 받아 this.balance로 설정하는데
이때 balance는 기본적으로 public 속성이라 외부에서 직접 접근이 가능하다.
따라서 new 키워드를 통해 BankAccount 클래스의 인스턴스인 account 를 생성한 후
account.balance 가 직접 수정이 가능해진것이다.
-> 이렇게 되면 오류가 일어날 수 있다.
(2) 접근제한자를 사용한 경우
class BankAccount {
#balance; // private 필드로 정의
constructor(initialBalance) {
this.#balance = initialBalance; // private 필드 초기화
}
getBalance() {
return this.#balance; // 외부에서 balance 값을 확인할 때 사용
}
}
const account = new BankAccount(1000);
console.log(account.getBalance());
// 1000 (입력받은 잔액이 그대로 유지됨)
console.log(account.balance);
// 에러 발생: 직접 접근 불가
BankAccount 클래스에 #balance라는 private 필드를 사용하여 접근 제한자를 적용하면,
외부에서 balance 필드에 직접 접근할 수 없게 된다.
#balance는 클래스 내부에서만 접근이 가능하며, 클래스 외부에서는 보이지 않는다.
이로 인해, new BankAccount(1000)을 통해 생성된 account 인스턴스의 balance는 외부에서 직접 변경할 수 없어서,
입력받은 값 1000이 그대로 유지가 된다.
'Java Script' 카테고리의 다른 글
[JS] 객체의 프로퍼티-getter/setter (1) | 2024.11.03 |
---|---|
[JS] 자바스크립트 클래스와 생성자 함수 차이 (3) | 2024.11.02 |
[JS] 스프레드 연산자(Spread Operator) 란? (4) | 2024.07.24 |
[JS] 자바스크립트 비동기처리(2) - async / await 이해하기 (0) | 2024.06.27 |
[JS] 자바스크립트 비동기처리란? (1) (0) | 2024.06.27 |