Dart에서의 클래스 캡슐화와 오류 처리는 객체 지향 프로그래밍의 중요한 부분입니다. 이번 포스트에서는 Dart의 캡슐화, 오류 처리 및 유효성 검사 기법을 살펴보고, 간단한 예시를 통해 이를 설명하겠습니다.
캡슐화 (Encapsulation)
캡슐화는 객체의 세부 구현 내용을 숨기고, 공개 인터페이스만을 통해 객체와 상호작용하는 방법입니다. Dart에서는 필드에 _
(언더스코어)를 붙여 private 필드로 만들어 클래스 외부에서의 직접적인 접근을 제한합니다.
예시: 은행 계좌 클래스
class BankAccount {
late double _balance; // private 필드
BankAccount(double initialBalance) {
_balance = initialBalance;
}
double get balance => _balance; // getter
set deposit(double amount) {
if (amount < 0) {
throw Exception("입금액은 음수일 수 없습니다.");
}
_balance += amount;
}
bool withdraw(double amount) {
if (amount > _balance) {
return false; // 잔액 부족
}
_balance -= amount;
return true;
}
}
위 클래스에서 _balance
는 외부에서 직접 접근할 수 없고, deposit
와 withdraw
메소드를 통해 안전하게 조작됩니다.
오류 처리 (Error Handling)
오류 처리는 프로그램에서 예상치 못한 상황에 대처하고 안정적인 동작을 보장하는 방법입니다. Dart에서는 try
, catch
, finally
블록을 사용하여 오류를 처리합니다.
예시: 파일 읽기
void readFile(String path) {
try {
// 파일 읽기 시도
} catch (e) {
print('파일 읽기 오류: $e');
} finally {
// 파일 닫기 또는 추가 작업
}
}
위 예시에서 파일을 읽는 동안 오류가 발생하면 catch
블록이 실행되며, 오류에 관한 정보를 출력합니다. finally
블록은 예외 발생 여부와 상관없이 실행됩니다.
유효성 검사 (Validation)
유효성 검사는 객체가 현실적으로 불가능한 상태를 가지지 않도록 보장하는 방법입니다. 이는 주로 setter 메소드 내에서 수행됩니다.
예시: 사용자 프로필
class UserProfile {
String _username;
UserProfile(this._username);
set username(String value) {
if (value.length < 3 || value.length > 15) {
throw Exception("사용자 이름은 3자 이상 15자 이하여야 합니다.");
}
_username = value;
}
}
위 예시에서 username
의 길이가 3자 미만이거나 15자를 초과하는 경우, 오류가 발생합니다.
이처럼 Dart에서 클래스 캡슐화, 오류 처리 및 유효성 검사는 코드의 안전성과 강건성을 향상시키는 중요한 요소입니다. 이러한 기법을 통해 보다 견고하고 유지보수하기 쉬운 애플리케이션을 개발할 수 있습니다.
Private 필드
Private 필드는 클래스 안의 비밀스러운 정보예요. 마치 비밀 일기장에 적힌 내용처럼, 이 정보는 클래스 안에서만 볼 수 있고, 클래스 밖에서는 볼 수 없어요. Dart에서는 이런 비밀 필드 앞에 _
(언더스코어)를 붙여요.
예시: 내 동전 저금통
class PiggyBank {
int _coins; // 이것이 private 필드예요. 동전의 개수를 비밀로 해요.
PiggyBank(this._coins);
}
여기서 _coins
는 우리의 동전 개수를 나타내요. 이건 우리만 볼 수 있고, 다른 사람은 볼 수 없어요.
Getter와 Setter는 뭐에요?
Getter와 Setter는 우리가 private 필드에 안전하게 접근할 수 있게 도와주는 친구들이에요. Getter는 필드의 값을 읽어주고, Setter는 필드의 값을 바꿔줘요.
Getter의 예시
class PiggyBank {
int _coins;
// 이것이 Getter예요. 동전의 개수를 알려줘요.
int get coins => _coins;
PiggyBank(this._coins);
}
여기서 get coins
는 현재 동전의 개수를 알려줘요. 이걸 사용하면, 동전이 몇 개인지 확인할 수 있어요.
Setter의 예시
class PiggyBank {
int _coins;
int get coins => _coins;
// 이것이 Setter예요. 동전의 개수를 바꿔줘요.
set coins(int value) {
if (value < 0) {
throw Exception("동전 개수는 음수가 될 수 없어요!");
}
_coins = value;
}
PiggyBank(this._coins);
}
여기서 set coins
는 동전의 개수를 바꿔줘요. 하지만 동전의 개수를 음수로 바꾸려고 하면, 오류 메시지를 보여줘요.
왜 이것들이 중요할까요?
이렇게 private 필드와 getter/setter를 사용하면, 우리의 중요한 정보를 안전하게 지키면서 필요할 때만 사용할 수 있어요. 이것은 마치 우리가 비밀 일기장에 비밀번호를 걸어 놓는 것과 같아요. 이렇게 하면, 우리의 정보가 잘못 바뀌거나, 누군가 우연히 볼 수 없도록 보호할 수 있어요.
결론
Dart에서 private 필드와 getter/setter를 사용하는 것은 우리의 코드를 안전하게 보호하는 중요한 방법이에요. 이것을 사용하면 우리의 정보를 안전하게 지키고, 필요할 때만 사용할 수 있어요. 그래서 우리의 프로그램은 더 강하고, 안전하게 될 수 있답니다!
'IT.모바일 > 배움' 카테고리의 다른 글
Flutter UI 위젯 | SingleChildScrollView | RichText (0) | 2023.12.20 |
---|---|
DART 예외 Exception 처리 (0) | 2023.12.11 |
안드로이드 스튜디오 단축키 (0) | 2023.12.03 |
생성자 스타일 Named / Positional parameter 선택적 매개변수 (0) | 2023.12.01 |
Dart lowerCamelCase / static const / 생성자 ? ?? / required / named positional parameter | DART 언어 (1) | 2023.12.01 |
댓글