[Dart] 상속과 super

2025. 1. 8. 18:13·Flutter/Dart 언어
728x90

 

상속과 다형성이란?

 

상속은 부모 클래스의 속성과 메서드를 자식 클래스가 물려받는 기능

다형성은 자식 클래스 객체를 부모 클래스 타입으로 참조할 수 있는 능력을 의미

※ 추가설명
만약 BMW 클래스와 제네시스 클래스가 엔진클래스를 상속한다면 과연 그것은 정상적인 설계가 맞을까요??

다형성이 성립하지 않기 때문에 잘못된 상속이라고 할 수 있습니다!
즉, 다형성이란 BMW에게 너 엔진이야? 라고 물었을 때 
어 나 엔진이야 라고 답을 할 수 있어야 합니다. (즉, 잘못된 상속이다!)
부모클래스가 먼저 호출되고 자식클래스가 호출된다. 
예시 코드
class Burger {
  String? b_name;
  // 생성자
  Burger() {
    print('나는 버거');
  }
}

class CheeseBurger extends Burger {
  String? ch_name;
  CheeseBurger() {
    print('치즈 버거');
  }
}

void main() {
  CheeseBurger cb = CheeseBurger();
  cb.b_name; // 당연히 보임!
  cb.ch_name; // 이거도 보임!
  // 주요 핵심 개념
  // 치즈 버거는 다형성을 가집니다. 버거이기도 하고 치즈버거 이기도 합니다.
  // -----------------------------
  print('-----------------------------------');
  Burger b2 = CheeseBurger();
  b2.b_name; // 이거도 보임!
  // b2.ch_name;  이건 안보임!
  // b2.ch_name; 보이게 하고 싶다면 어떻게 코드를 작성해야하나요?

  Burger b3 = CheeseBurger();
  CheeseBurger b4 = b3 as CheeseBurger; // as 강제 형 변환
  print('버거 데이터 타입에서 ch_name을 호출하자 ${(b3 as CheeseBurger).ch_name}');
}

 

Dart에서 Super 란?

 

부모 클래스의 속성이나 메서드에 접근하거나 호출할 때 사용하는 키워드입니다.

class Burger {
  String? name;
  Burger() {
    print('버거 생성자 호출()');
  }
}

class CheeseBurger extends Burger {
  CheeseBurger(String name) {
    print('치즈버거 생성자 호출()');
    // this.name = name;
    super.name = name;
  }
}

void main() {
  CheeseBurger ch = CheeseBurger('불고기치즈버거');
  print(' name 호출 : ${ch.name}');
  // 문제 - 사용시점, 치즈버거 생성자 호출시에 인수로 전달 받은 문자열을
  // 부모 클래스인 Name이라는 변수에 저장하고 싶다면 어떻게 코드를 작성하지?
}

 

initialize 문법과 super 키워드
class Burger {
  String? name;

  // 기본 생성자 - 매개변수가 있다면 ...
  Burger(String? name) {
    print('버거 생성자 호출()');
    this.name = name;
  }
}

class CheeseBurger extends Burger {
  // 자식이 태어나기 전에 부모가 먼저 태어나야 자식이 존재할 수 있다.

  // Dart 에서 부모 생성자에 매개변수가 있다면
  // 이니셜라이즈 키워드와 super 키워드를 통해 값을 전달 한다.
  // 이니셜라이즈 키워드를 살펴 보자.
  CheeseBurger(String? name) : super(name) {
    print('치즈버거 생성자 호출()');
  }
}

void main() {
  CheeseBurger burger = CheeseBurger('불고기치즈버거');
  print(burger.name);
}

 

상속은 코드 재사용성과 계층적인 설계를 가능하게 하는 강력한 도구입니다.
하지만, 올바르게 사용하지 않으면 불필요한 의존성과 설계상의 문제가 생길 수 있습니다.
항상 
다형성이 성립하는지를 확인하고, 적합하지 않을 경우 컴포지션과 같은 다른 설계 패턴을 고려하는 것이 중요합니다.

'Flutter > Dart 언어' 카테고리의 다른 글

[Dart] dart의 추상 클래스  (0) 2025.01.08
[Dart]OOP 연관관계와 Mixin  (0) 2025.01.08
[Dart] Sound Null Safety  (0) 2025.01.08
[Dart] 클래스와 인스턴스  (0) 2025.01.04
[Dart] dart 기본 문법 익히기 (3) - 익명함수, 람다표현식  (0) 2025.01.03
'Flutter/Dart 언어' 카테고리의 다른 글
  • [Dart] dart의 추상 클래스
  • [Dart]OOP 연관관계와 Mixin
  • [Dart] Sound Null Safety
  • [Dart] 클래스와 인스턴스
공돌이 출신 개발자
공돌이 출신 개발자
공돌이 출신 개발자입니다
  • 공돌이 출신 개발자
    공돌이 출신 개발자
    공돌이 출신 개발자
  • 전체
    오늘
    어제
    • 분류 전체보기 (124)
      • Database (0)
        • SQL (0)
        • 1일 1쿼리 (9)
      • Flutter (40)
        • Dart 언어 (18)
        • App (22)
      • Git (0)
      • Http 기초 지식 (14)
      • HTML5 & CSS3 (0)
      • Java (33)
      • JSP (0)
      • JavaScript (0)
      • Linux (0)
      • MSA (0)
      • Project (0)
      • React (0)
      • Spring (19)
      • 설치 메뉴얼 (1)
      • [Flutter] 프로젝트 (눈길) (8)
        • 작업일지 (8)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    SQL
    클래스
    공부
    로그인
    코딩
    앱 개발
    HTTP
    SQLD
    회원가입
    객체
    메서드
    spring boot
    1일1쿼리
    데이터
    JAVA 기초
    android studio
    안드로이드 앱 개발
    프로그래밍
    jsp
    객체지향
    안드로이드
    Java
    Android
    flutter
    블로그 만들기
    프로젝트
    개발
    플러터
    dart
    앱개발
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
공돌이 출신 개발자
[Dart] 상속과 super
상단으로

티스토리툴바