Dart 클래스 구조 비교: 중첩 클래스, 상속 클래스, 중복 클래스

하요·2024년 7월 1일
0
post-thumbnail

Dart 클래스 구조 비교: 중첩 클래스, 상속 클래스, 중복 클래스

Dart에서는 코드 재사용성과 유지 보수를 용이하게 하기 위해 다양한 클래스 구조를 사용할 수 있음. 여기서는 중첩 클래스, 상속 클래스, 중복 클래스의 개념과 사용 사례를 비교해보겠음.

1. 중첩 클래스 (Nested Class)

개념

중첩 클래스는 다른 클래스 내부에 정의된 클래스로, 외부 클래스와 밀접한 관계가 있음.

사용 상황

  • 논리적 그룹화: 특정 클래스와 밀접하게 관련된 클래스들을 그룹화할 때 유용함.
  • 외부 클래스와의 강한 연관성: 내부 클래스가 외부 클래스의 데이터를 직접 사용하거나 조작할 필요가 있을 때 사용함.

장점

  • 캡슐화: 중첩 클래스는 외부 클래스의 일부로서 관련된 데이터를 더욱 잘 캡슐화할 수 있음.
  • 논리적 그룹화: 관련 있는 클래스들을 한 곳에 그룹화하여 코드 가독성을 높일 수 있음.
  • 외부 클래스와의 접근성: 중첩 클래스는 외부 클래스의 비공개 멤버에 접근할 수 있음.

단점

  • 복잡성 증가: 중첩 클래스가 많아지면 코드 구조가 복잡해질 수 있음.
  • 재사용성 감소: 중첩 클래스는 외부 클래스에 의존적이므로 다른 곳에서 재사용하기 어려움.

예제

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();
}

2. 상속 클래스 (Inheritance)

개념

상속은 하나의 클래스가 다른 클래스의 속성과 메서드를 물려받아 사용할 수 있게 하는 개념임.

사용 상황

  • 공통 기능 공유: 여러 클래스가 공통된 기능을 공유해야 할 때 유용함.
  • 다형성 구현: 부모 클래스를 통해 여러 자식 클래스를 동일한 인터페이스로 다뤄야 할 때 사용함.

장점

  • 코드 재사용성: 부모 클래스의 기능을 재사용할 수 있음.
  • 유지 보수 용이성: 공통 기능을 부모 클래스에 정의하면 한 곳에서 수정할 수 있음.
  • 다형성: 상속을 통해 다형성을 구현할 수 있어 다양한 객체를 동일한 방식으로 다룰 수 있음.

단점

  • 강한 결합: 상속 구조가 깊어질수록 클래스 간의 결합이 강해져서 변경이 어려워질 수 있음.
  • 오버라이딩 복잡성: 자식 클래스에서 부모 클래스의 메서드를 오버라이딩할 때 복잡성이 증가할 수 있음.

예제

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
}

3. 중복 클래스 (Composition)

개념

중복 클래스는 상속 대신 클래스 간의 관계를 설정하여 코드 재사용성을 높이는 방법임. 이는 "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)
코드 재사용성주로 외부 클래스 내에서 사용부모 클래스의 기능을 재사용포함된 클래스의 기능을 재사용
캡슐화관련된 데이터를 외부 클래스 내에 캡슐화공통 기능을 부모 클래스에 정의구성 요소별로 캡슐화
결합도외부 클래스와 강한 결합부모 클래스와 자식 클래스 간의 강한 결합약한 결합
유연성외부 클래스 내에서만 사용 가능다양한 자식 클래스에서 부모 클래스 기능 사용더 유연하게 클래스 구조 변경 가능
가독성관련된 클래스들을 그룹화하여 가독성 높임클래스 구조를 단순하게 유지클래스 구성과 설정 과정 복잡할 수 있음
재사용성외부 클래스 외부에서 재사용하기 어려움자식 클래스에서 부모 클래스 기능 재사용다른 클래스에서 쉽게 재사용 가능

요약

각 접근 방식은 상황에 따라 적절하게 사용되어야 함. 중첩 클래스는 외부 클래스와 논리적으로 그룹화되어야 할 때, 상속 클래스는 공통 기능을 공유하고 재사용할 때, 중복 클래스는 더 유연하고 독립적인 구성 요소가 필요할 때 유용함. 이러한 개념들을 이해하고 상황에 맞게 적용하는 것이 중요함.

profile
flutter 개발자(진)

0개의 댓글