private 변수는 해당 변수가 선언된 클래스 외부에서는 직접적으로 접근할 수 없는 변수를 말합니다.
Dart에서는 private 변수를 선언할 때 변수 이름 앞에 밑줄(_)을 붙여 표시합니다.
Dart에서 private 변수를 사용하는 이유는 코드의 캡슐화(encapsulation)와 정보 은닉(information hiding)을 지원하기 위해서입니다.
- 클래스나 모듈 내부의 구현 세부사항을 숨기고 외부에 공개할 인터페이스만 노출함으로써 코드의 복잡성을 감소시킵니다.
- Private 변수를 사용하면 외부에서 직접적으로 접근하여 수정할 수 없으므로 클래스나 모듈의 내부 상태를 보호할 수 있습니다.
private 변수를 사용하는 클래스의 예시)
// private 변수 선언, getter와 setter 생성
class Example {
int _privateVariable; // 필드(데이터)
Example(this._privateVariable); //생성자
int get privateVariable => _privateVariable;
void set privateVariable(int value) {
_privateVariable = value;
}
}
// private 변수에 접근하는 방법
void main() {
Example example = Example(42);
// getter를 사용하여 private 변수에 접근
print(example.privateVariable); // 출력: 42
// setter를 사용하여 private 변수에 값을 할당
example.privateVariable = 100;
// getter를 사용하여 변경된 private 변수의 값을 확인
print(example.privateVariable); // 출력: 100
}
- 데이터를 외부로부터 숨기는 것
- 데이터에 직접적으로 접근하는 것을 제한하고, 오직 특정한 방법을 통해서만 데이터에 접근하도록 합니다.
class BankAccount {
// private 변수로 선언하여 정보 은닉
double _balance;
// 생성자
BankAccount(double initialBalance) {
_balance = initialBalance;
}
// 입금 메서드
void deposit(double amount) {
_balance += amount;
}
// 출금 메서드
void withdraw(double amount) {
if (_balance >= amount) {
_balance -= amount;
} else {
print('Insufficient balance');
}
}
// 잔액 조회 메서드
double getBalance() {
return _balance;
}
}
void main() {
// 정보 은닉된 클래스 사용 예시
BankAccount account = BankAccount(1000);
// 입금
account.deposit(500);
// 출금
account.withdraw(200);
// 잔액 조회
print('Current balance: ${account.getBalance()}');
}
정리
캡슐화는 데이터와 메서드를 묶어서 클래스를 구조화하는 것을 의미하고, 정보 은닉은 데이터의 직접적인 접근을 제한하여 데이터를 보호하는 것을 의미합니다. 정보 은닉은 캡슐화의 한 측면으로 클래스의 내부 구현을 숨겨 외부에서의 직접적인 접근을 제한합니다.