Dart에서는 코드 재사용성과 유지 보수를 용이하게 하기 위해 다양한 클래스 구조를 사용할 수 있음. 여기서는 중첩 클래스, 상속 클래스, 중복 클래스의 개념과 사용 사례를 비교해보겠음.
중첩 클래스는 다른 클래스 내부에 정의된 클래스로, 외부 클래스와 밀접한 관계가 있음.
class Outer {
int outerField = 10;
void outerMethod() {
print('Outer method');
}
class Inner {
void innerMethod() {
print('Inner method, accessing outerField: ${Outer().outerField}');
Outer().outerMethod();
}
}
}
void main() {
Outer.Inner inner = Outer.Inner();
inner.innerMethod();
}
상속은 하나의 클래스가 다른 클래스의 속성과 메서드를 물려받아 사용할 수 있게 하는 개념임.
class Animal {
void makeSound() {
print('Some generic animal sound');
}
}
class Dog extends Animal {
void makeSound() {
print('Bark');
}
}
void main() {
Dog dog = Dog();
dog.makeSound(); // 출력: Bark
}
중복 클래스는 상속 대신 클래스 간의 관계를 설정하여 코드 재사용성을 높이는 방법임. 이는 "has-a" 관계를 사용하여 다른 클래스의 인스턴스를 포함하는 방식임.
class Engine {
void start() {
print('Engine started');
}
}
class Car {
final Engine engine;
Car(this.engine);
void startCar() {
engine.start();
print('Car started');
}
}
void main() {
Engine engine = Engine();
Car car = Car(engine);
car.startCar(); // 출력: Engine started\\nCar started
}
특성 | 중첩 클래스 (Nested Class) | 상속 클래스 (Inheritance) | 중복 클래스 (Composition) |
---|---|---|---|
관계 유형 | 외부 클래스와 내부 클래스의 관계 | 부모 클래스와 자식 클래스의 관계 | 포함 관계 (has-a) |
코드 재사용성 | 주로 외부 클래스 내에서 사용 | 부모 클래스의 기능을 재사용 | 포함된 클래스의 기능을 재사용 |
캡슐화 | 관련된 데이터를 외부 클래스 내에 캡슐화 | 공통 기능을 부모 클래스에 정의 | 구성 요소별로 캡슐화 |
결합도 | 외부 클래스와 강한 결합 | 부모 클래스와 자식 클래스 간의 강한 결합 | 약한 결합 |
유연성 | 외부 클래스 내에서만 사용 가능 | 다양한 자식 클래스에서 부모 클래스 기능 사용 | 더 유연하게 클래스 구조 변경 가능 |
가독성 | 관련된 클래스들을 그룹화하여 가독성 높임 | 클래스 구조를 단순하게 유지 | 클래스 구성과 설정 과정 복잡할 수 있음 |
재사용성 | 외부 클래스 외부에서 재사용하기 어려움 | 자식 클래스에서 부모 클래스 기능 재사용 | 다른 클래스에서 쉽게 재사용 가능 |
각 접근 방식은 상황에 따라 적절하게 사용되어야 함. 중첩 클래스는 외부 클래스와 논리적으로 그룹화되어야 할 때, 상속 클래스는 공통 기능을 공유하고 재사용할 때, 중복 클래스는 더 유연하고 독립적인 구성 요소가 필요할 때 유용함. 이러한 개념들을 이해하고 상황에 맞게 적용하는 것이 중요함.