Dart에서 클래스 오버라이딩 이해하기: 초보자를 위한 가이드

2024. 6. 23. 01:23Flutter/Dart Language

반응형

 

객체 지향 프로그래밍 (OOP)의 핵심 개념 중 하나인 오버라이딩은 기존 클래스의 기능을 자식 클래스에서 재정의하여 더욱 특화된 기능을 구현하는 데 유용한 도구입니다.

Dart에서 오버라이딩을 활용하면 코드 재사용성을 높이고, 코드 유지 관리를 용이하게 하며, 코드의 유연성을 향상시킬 수 있습니다.

이 블로그 게시글에서는 Dart에서 오버라이딩의 기본 개념과 실제 활용 방법을 초보자도 쉽게 이해할 수 있도록 자세히 살펴보겠습니다.

1. 오버라이딩이란 무엇일까요?

오버라이딩은 마치 부모의 말을 자식이 자신의 방식대로 해석하는 것처럼, 자식 클래스가 부모 클래스에서 정의된 메서드를 재정의하여 자체적인 기능을 구현하는 개념입니다.

이렇게 하면 부모 클래스의 기본적인 기능을 유지하면서, 자식 클래스의 특성에 맞는 더욱 특화된 기능을 추가할 수 있습니다.

2. 오버라이딩을 사용하는 방법

Dart에서 오버라이딩을 사용하려면 다음과 같은 단계를 따릅니다.

  1. 부모 클래스에서 메서드를 정의합니다.
  2. 자식 클래스에서 동일한 이름과 매개변수를 가진 메서드를 정의합니다.
  3. @override 어노테이션을 사용하여 자식 클래스 메서드가 부모 클래스 메서드를 오버라이딩한다는 것을 명시합니다.

예시

class Animal {
  void makeSound() {
    print("Animal is making a sound.");
  }
}

class Dog extends Animal {
  @override
  void makeSound() {
    print("Woof! Woof!");
  }
}

void main() {
  Animal animal = Dog();
  animal.makeSound(); // Woof! Woof!
}
 

설명

  • Animal 클래스는 makeSound 메서드를 정의합니다.
  • Dog 클래스는 Animal 클래스를 상속받고, makeSound 메서드를 재정의하여 "Woof! Woof!"라는 소리를 출력하도록 합니다.
  • main 함수에서는 Dog 객체를 Animal 변수에 할당하고, makeSound 메서드를 호출합니다.
  • 이때, Dog 객체의 makeSound 메서드가 호출되어 "Woof! Woof!"라는 소리가 출력됩니다.

3. 오버라이딩의 장점

  • 코드 재사용성 향상: 부모 클래스에서 정의된 기본적인 기능을 그대로 사용하고, 자식 클래스에서 필요한 부분만 재정의함으로써 코드 중복을 줄일 수 있습니다.
  • 코드 유지 관리 용이: 부모 클래스의 기능을 변경해도, 자식 클래스의 오버라이딩된 메서드는 영향을 받지 않기 때문에 코드 유지 관리가 용이해집니다.
  • 코드 유연성 향상: 오버라이딩을 통해 자식 클래스에서 부모 클래스의 기능을 자유롭게 확장하거나 변경할 수 있기 때문에 코드의 유연성이 높아집니다.

4. 오버라이딩 활용 사례

  • UI 위젯 계층 구조: Widget 클래스를 기반으로 Button, TextField, Image 등 다양한 UI 위젯 클래스를 만들고, 각 위젯 클래스에서 build 메서드를 오버라이딩하여 자체적인 UI를 구현합니다.
  • 네트워크 통신 계층 구조: NetworkRequest 클래스를 기반으로 GETRequest, POSTRequest, PUTRequest 등 다양한 네트워크 요청 클래스를 만들고, 각 요청 클래스에서 sendRequest 메서드를 오버라이딩하여 요청 방식에 맞는 로직을 구현합니다.
  • 에러 처리 계층 구조: Exception 클래스를 기반으로 FormatException, IOException, SocketException 등 다양한 에러 클래스를 만들고, 각 에러 클래스에서 getMessage 메서드를 오버라이딩하여 에러 메시지를 정의합니다.

5. 주의 사항

  • 오버라이딩을 사용할 때는 메서드 이름, 반환 유형, 매개변수 목록정확하게 일치해야 합니다. 만약 일치하지 않으면 컴파일 에러가 발생합니다.
  • 오버라이딩된 메서드의 접근성 수준부모 클래스 메서드의 접근성 수준보다 같거나 더 높아야 합니다. 예를 들어, protected 메서드를 public 메서드로 오버라이딩할 수는 있지만, public 메서드를 private 메서드로 오버라이딩할 수는 없습니다.
  • 오버라이딩된 메서드를 추상 메서드로 변경하거나, 매개변수의 기본값을 변경하는 것은 허용되지 않습니다.

6. 실습 문제

다음 문제를 해결해 봅시다.

 

문제

다음 상황을 모델링하기 위해 클래스를 설계하세요.

  • 사각형을 나타내는 클래스를 만드세요.
  • 각 사각형에는 변의 길이 속성이 있어야 합니다.
  • 사각형의 넓이를 계산하는 메서드를 작성하세요.
  • 상속을 사용하여 정사각형과 직사각형 클래스를 만드세요.
  • 정사각형은 모든 변의 길이가 동일해야 하며, 넓이를 계산하는 메서드를 재정의해야 합니다.
  • 직사각형은 두 변의 길이가 서로 다르고, 둘레를 계산하는 메서드를 추가해야 합니다.

해결 팁

  • Shape 클래스를 만들어 사각형의 공통 속성과 메서드를 정의합니다.
  • Rectangle 클래스를 만들어 Shape 클래스를 상속받고, 변의 길이 속성을 추가합니다.
  • Square 클래스를 만들어 Rectangle 클래스를 상속받고, 모든 변의 길이가 동일하도록 제약조건을 추가합니다.
  • Rectangle 클래스의 calculateArea 메서드를 재정의하여 정사각형의 넓이를 계산합니다.
  • Rectangle 클래스에 calculatePerimeter 메서드를 추가하여 직사각형의 둘레를 계산합니다.

이 문제를 통해 오버라이딩 개념을 실제 문제에 적용하는 방법을 연습할 수 있습니다.

 

정답

 

다음은 주어진 상황을 모델링하기 위한 클래스 설계입니다.

Dart
abstract class Shape {
  double width;
  double height;

  Shape(this.width, this.height);

  double calculateArea() {
    return width * height;
  }
}

class Rectangle extends Shape {
  Rectangle(double width, double height) : super(width, height);

  @override
  double calculateArea() {
    return width * height;
  }
}

class Square extends Rectangle {
  Square(double side) : super(side, side);

  @override
  double calculateArea() {
    return side * side;
  }
}
 

설명

  • Shape 클래스
    • 추상 클래스로 정의되어 width와 height 속성, calculateArea 메서드를 가지고 있습니다.
    • calculateArea 메서드는 사각형의 넓이를 계산합니다.
  • Rectangle 클래스
    • Shape 클래스를 상속받고, width와 height 속성을 사용하여 직사각형을 나타냅니다.
    • calculateArea 메서드는 상속받은 메서드를 그대로 사용합니다.
  • Square 클래스
    • Rectangle 클래스를 상속받고, side 속성을 사용하여 정사각형을 나타냅니다.
    • calculateArea 메서드를 재정의하여 정사각형의 넓이를 계산합니다.

사용 예시

void main() {
  Rectangle rectangle = Rectangle(5.0, 3.0);
  print("Rectangle area: ${rectangle.calculateArea()}"); // 15.0

  Square square = Square(4.0);
  print("Square area: ${square.calculateArea()}"); // 16.0
}
 

주의 사항

  • Shape 클래스는 추상 클래스이기 때문에 직접 인스턴스화할 수 없습니다.
  • Square 클래스는 side 속성을 사용하여 정사각형을 나타내지만, 실제로는 width와 height 속성도 가지고 있습니다. 이는 Rectangle 클래스에서 상속받은 속성이기 때문입니다.
  • calculateArea 메서드는 Shape 클래스에서 정의된 메서드를 Rectangle 클래스에서 그대로 사용하고, Square 클래스에서 재정의하여 정사각형의 넓이를 계산하도록 합니다.

추가 기능

  • Shape 클래스에 getPerimeter() 메서드를 추가하여 사각형의 둘레를 계산할 수 있습니다.
  • Rectangle 클래스에서 getPerimeter() 메서드를 재정의하여 직사각형의 둘레를 계산할 수 있습니다.

이 코드를 활용하여 다양한 사각형 관련 기능을 구현할 수 있습니다.

7. 마무리

이 블로그 게시글에서는 Dart에서 오버라이딩의 기본 개념과 실제 활용 방법을 초보자도 쉽게 이해할 수 있도록 자세히 살펴보았습니다.

오버라이딩을 활용하여 코드를 재사용하고 효율적으로 구성함으로써 더욱 훌륭한 Dart 프로그래머가 되어나가시길 바랍니다.

더 궁금한 점이나 개선할 부분이 있다면 언제든지 코멘트를 남겨주세요.

 

 

수발가족을 위한 일기장 “나비일기장”

 

https://play.google.com/store/apps/details?id=com.maccrey.navi_diary_release

 

구글플레이 앱 배포의 시작! 비공개테스트 20명의 테스터모집을 위한 앱 "테스터 쉐어"

 

https://play.google.com/store/apps/details?id=com.maccrey.tester_share_release

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

카카오톡 오픈 채팅방

https://open.kakao.com/o/gsS8Jbzg

반응형