class
카테고리: Dart
Dart에서 클래스는 객체 지향 프로그래밍의 핵심 개념으로, 데이터와 기능을 캡슐화하는 데 사용됩니다. 클래스는 객체를 생성하기 위한 템플릿을 정의하며, 객체는 이 클래스의 인스턴스입니다. Dart에서 클래스를 정의하고 사용하는 방법을 매우 상세하게 설명하겠습니다.
1. 클래스 정의
클래스를 정의하려면 class
키워드를 사용합니다. 클래스에는 데이터(변수)와 기능(메서드)을 포함할 수 있습니다.
class Person {
// 필드 (데이터)
String name;
int age;
// 생성자
Person(this.name, this.age);
// 메서드 (기능)
void greet() {
print('Hello, my name is $name and I am $age years old.');
}
}
2. 클래스의 주요 구성 요소
2.1. 필드 (Fields)
클래스의 데이터는 필드라고 합니다. 필드는 클래스의 상태를 나타내며, 변수처럼 다룰 수 있습니다.
class Person {
String name;
int age;
}
2.2. 생성자 (Constructors)
생성자는 클래스의 인스턴스를 생성할 때 호출되는 특별한 메서드입니다. 생성자는 필드를 초기화하는 데 사용됩니다.
-
기본 생성자: Dart는 기본 생성자를 자동으로 제공하지만, 사용자 정의 생성자를 작성할 수도 있습니다.
class Person { String name; int age; Person(String name, int age) { this.name = name; this.age = age; } }
-
축약형 생성자: 생성자의 매개변수를 필드와 동일한 이름으로 사용하는 축약형 생성자를 사용할 수 있습니다.
class Person { String name; int age; Person(this.name, this.age); }
-
명명된 생성자: 클래스에 여러 생성자를 정의하고 싶을 때 사용합니다. 생성자의 이름을 명명하여 사용할 수 있습니다.
class Person { String name; int age; Person(this.name, this.age); Person.withDefaultAge(this.name) : age = 30; }
2.3. 메서드 (Methods)
클래스는 데이터를 조작하고 행동을 정의하는 메서드를 가질 수 있습니다.
class Person {
String name;
int age;
Person(this.name, this.age);
void greet() {
print('Hello, my name is $name.');
}
int yearOfBirth() {
return DateTime.now().year - age;
}
}
2.4. 접근 제어 (Access Control)
-
public
: Dart에서는 모든 필드와 메서드가 기본적으로 공개입니다. 다만, 이름 앞에 언더스코어(_
)를 붙이면 비공개로 설정할 수 있습니다.class Person { String _name; // private 필드 int age; Person(this._name, this.age); void greet() { print('Hello, my name is $_name.'); } }
2.5. 상속 (Inheritance)
클래스는 다른 클래스를 상속받아 기능을 확장할 수 있습니다. 상속을 사용하면 기존 클래스의 필드와 메서드를 재사용할 수 있습니다.
class Employee extends Person {
String jobTitle;
Employee(String name, int age, this.jobTitle) : super(name, age);
@override
void greet() {
super.greet();
print('I am an $jobTitle.');
}
}
extends
:Person
클래스를 상속받아Employee
클래스를 생성합니다.super
: 부모 클래스의 생성자와 메서드를 호출합니다.@override
: 부모 클래스의 메서드를 재정의할 때 사용합니다.
2.6. 인터페이스 (Interfaces)
Dart에서는 인터페이스를 class
를 통해 구현합니다. Dart에서는 모든 클래스가 암묵적으로 인터페이스 역할을 합니다.
class Animal {
void makeSound();
}
class Dog implements Animal {
@override
void makeSound() {
print('Woof!');
}
}
implements
:Animal
인터페이스를 구현합니다. 인터페이스에 정의된 모든 메서드를 구현해야 합니다.
2.7. 믹스인 (Mixins)
믹스인은 여러 클래스에서 공통으로 사용하는 메서드와 필드를 재사용할 수 있도록 도와줍니다. 믹스인은 클래스와 with
키워드를 사용하여 결합할 수 있습니다.
mixin Swimmer {
void swim() {
print('I can swim!');
}
}
class Person {
String name;
Person(this.name);
}
class SwimmingPerson extends Person with Swimmer {
SwimmingPerson(String name) : super(name);
}
mixin
: 믹스인 정의with
: 믹스인을 클래스와 결합
3. 객체 생성 및 사용
클래스의 인스턴스를 생성하고 사용하려면 new
키워드를 사용하거나, Dart에서는 new
없이도 객체를 생성할 수 있습니다.
void main() {
// 객체 생성
Person person = Person('Alice', 30);
// 메서드 호출
person.greet();
// 필드 접근
print('Age: ${person.age}');
}
4. 정적 멤버 (Static Members)
클래스에 속하는 정적 필드와 메서드는 객체가 아닌 클래스 자체에 속합니다. static
키워드를 사용하여 정의합니다.
class MathUtil {
static const double pi = 3.141592653589793;
static double square(double number) {
return number * number;
}
}
static
: 클래스에 속하는 필드와 메서드를 정의할 때 사용합니다.
void main() {
print(MathUtil.pi); // 정적 필드 접근
print(MathUtil.square(5)); // 정적 메서드 호출
}
요약
- 클래스는 객체 지향 프로그래밍의 기본 단위로, 데이터와 기능을 캡슐화합니다.
- 필드와 메서드를 포함하며, 생성자를 사용하여 객체를 초기화합니다.
- 상속, 인터페이스, 믹스인을 통해 코드 재사용과 다형성을 구현합니다.
- 정적 멤버를 사용하여 클래스 레벨에서 데이터를 관리하고 메서드를 호출합니다.
클래스는 복잡한 데이터와 기능을 구조화하고 관리하는 데 필수적인 도구입니다. Dart에서 클래스를 잘 이해하고 활용하면 효율적이고 유지보수하기 쉬운 코드를 작성할 수 있습니다.
댓글 남기기