클래스는 객체 지향 프로그래밍에서 데이터와 이를 조작하는 메소드를 함께 묶는 방법입니다. Dart에서 클래스는 객체를 생성하는 템플릿 역할을 합니다. 객체는 클래스의 인스턴스로, 클래스에 정의된 속성과 기능을 실제로 사용할 수 있게 해줍니다.
Dart에서 클래스를 정의할 때는 class 키워드를 사용합니다. 클래스 내에서는 변수(속성)와 함수(메소드)를 정의할 수 있습니다. 예를 들어, 사람(Person) 클래스는 번호(no), 이름(name), 나이(age), 몸무게(weight) 등의 속성을 가질 수 있으며, 걷기(walk)나 먹기(eat) 같은 행동을 메소드로 정의할 수 있습니다.
Dart와 Flutter를 사용한 앱 개발에서 클래스는 중요한 역할을 합니다. 예를 들어, 사용자 인터페이스의 각 부분은 위젯으로 표현되며, 각 위젯은 Dart 클래스로 구현됩니다. 클래스를 사용하면 코드의 재사용성과 유지 보수성이 향상되며, 복잡한 앱의 구조를 효과적으로 관리할 수 있습니다.
예시: 사용자 프로필 페이지를 구현할 때, User 클래스를 정의하여 사용자의 이름, 프로필 사진, 친구 목록 등을 관리할 수 있습니다. 각 사용자 객체는 User 클래스의 인스턴스로, 앱 전반에 걸쳐 일관된 방식으로 사용자 데이터를 처리하고 표시할 수 있습니다.
아래 코드 예시로 이해해봅시다.
코드 예시에서 Person 클래스는 사람을 나타내며, no, name, age, weight 속성과 walk, eat 메소드를 포함합니다. main 함수에서는 Person 객체를 세 개 생성하고, 각 객체의 name 속성에 다른 이름을 할당한 후, walk와 eat 메소드를 호출하여 각 객체의 행동을 출력합니다.
void main() {
// 클래스명 변수명 = new 클래스명();
Person p1 = new Person();
var p2 = new Person();
var p3 = Person();
p1.name = '전영주';
p2.name = '전일주';
p3.name = '전이주';
p1.walk('극장');
p2.walk('시장');
p3.eat('짬뽕');
p1.eat('초밥');
}
// [1] 사람 클래스
// [2] 번호, 이름, 나이, 몸무게 속성
// [3] run() 메소드, eat(), walk() 메소드
class Person {
int no;
String name;
int age;
double weight;
void walk(String str) {
print('${this.name} 님이 $str 으로 걸어갑니다.');
}
void eat(String food) {
print('${this.name} 님이 $food 를 먹습니다.');
}
}
실행결과는 다음과 같습니다.
접근 제한자는 객체 지향 프로그래밍에서 매우 중요한 개념으로, 클래스 내부의 멤버(속성이나 메소드)가 외부에서 접근 가능한지 여부를 결정합니다. 다른 언어에서는 public, private, protected 등 다양한 접근 제한자를 제공하지만, Dart 언어는 이를 좀 더 심플하게 접근합니다.
Dart에서는 멤버가 기본적으로 외부에 노출되어 public으로 간주되며, 이는 별도로 표시하지 않아도 됩니다. 반면, 멤버를 비공개(private)로 만들고 싶을 때는 이름 앞에 언더바(_)를 붙여서 표현합니다. protected와 같은 접근 제한자는 Dart에 직접적으로 존재하지 않지만, 패키지 레벨에서 비슷한 효과를 낼 수 있습니다.
아래 예시는 Dart에서 public과 private 멤버를 어떻게 정의하고 사용하는지 보여줍니다.
class BankAccount {
// public 멤버: 외부에서 접근 가능
String owner;
// private 멤버: 이 클래스 내부에서만 접근 가능
double _balance;
// 생성자
BankAccount(this.owner, this._balance);
// public 메소드
void deposit(double amount) {
_balance += amount;
print('$owner has deposited $amount');
}
// private 메소드
void _calculateInterest() {
// 이자 계산 로직
}
// 잔액 조회를 위한 public 메소드
double getBalance() {
return _balance;
}
}
void main() {
var account = BankAccount('전영주', 1000.0);
account.deposit(500.0); // 가능
print('Balance: ${account.getBalance()}');
// 아래의 코드는 에러를 발생시킴. _balance와 _calculateInterest는 private 멤버이기 때문에 외부에서 접근할 수 없음.
// print(account._balance);
// account._calculateInterest();
}