[Dart] Object Oriented Programming - 추상화

yeahsilver·2023년 6월 20일
0
post-thumbnail

추상화란 무엇인가?

  • 객체 지향 관점에서 클래스를 정의하는 것
  • 중요한 정보만 표현함으로써 공통의 속성과 기능을 묶어 이름을 붙히는 행위

예시

  • 자동차와 버스는 무엇인가요?
    - 정답: 교통수단
  • 자동차와 버스는 운전할 수 있지만, 교통수단은 실제 존재하는 객체가 아니기 때문에 운전한다는 "교통수단을 운전한다"라는 표현은 적절하지 않음
  • 교통수단의 경우 바퀴, 문, 엔진 등 여러가지의 공통 속성을 가지고 있음
  • 만약 버스, 자동차에 대한 모델을 생성할 때, 교통수단의 공통적인 특징을 각각 작성하게 되면 중복 코드를 작성하게 됨.
  • 반복 코드를 방지하기 위해 (재사용성을 위해), 교통수단이 가지는 공통 속성을 추상화하여 다른 교통수단 객체를 생성할 시 사용할 수 있도록 처리
abstract class Vehicle {
  int? doors;
  int? wheels;

  void hornSound();
}

class Car extends Vehicle {
  
  int? doors = 2;

  
  int? wheels = 4;

  
  void hornSound() {
    print('Beeeeeep');
  }
}

class Bus extends Vehicle {
  
  int? doors = 2;

  
  int? wheels = 4;

  
  void hornSound() {
    print('Hooooonkk');
  }
}

추상화 클래스와 추상화 메소드

  • 추상화 메소드를 사용하기 위해서는 abstract 키워드 사용

    abstract class Pen{}
  • abstract 키워드를 사용한 클래스는 추상화 메소드를 가질 수 있음. (일반 메소드도 동일하게 가질 수 있음)

  • 추상화 메소드는 구현부가 없는 메소드를 말함

    abstract class Pen {
     int? rateOfInkFlow;
    
     void write(); // 추상화 메소드
    }
    

추상화 규칙

  1. 추상화 클래스는 인스턴스화 할 수 없음

    void main() {
    	final pen = Pen() // 에러 발생
    }
    • 추상화 클래스의 경우 구조를 제공하는 역할만 진행하기에, 인스턴스로 생성할 수 없음
  2. 부모 클래스의 모든 추상화 메소드는 자식 클래스에서 구현되어야 함

  3. 추상화 클래스는 구현되어있는 메소드를 가지고 있을 수 있음

    abstract class Pen {
     int? rateOfInkFlow;
    
     void write() {
       print('Writing...');
     }
    }
    
    class BallPoint extends Pen {}
    
    void main() {
     final ballPoint = BallPoint();
     ballPoint.write();
    }
  4. 추상화 클래스는 생성자를 가질 수 있음

  • 추상화 클래스는 작접적으로 인스턴스를 생성할 수는 없지만, 서브클래스를 통해서 생성자를 호출 할 수 있음.

    abstract class Pen {
     int rateOfInkFlow;
    
     Pen({
       required this.rateOfInkFlow,
     });
    
     void write();
    }
    
     class BallPoint extends Pen {
       BallPoint() : super(rateOfInkFlow: 1);
       
       void write() {
         print('Writing with BallPoint');
       }
     }
    

추상화를 사용하는 경우

  • 재사용할 것 같은 클래스가 존재하는 경우
  • 여러 클래스의 기반이 되는 클래스가 존재하는 경우
  • default 행위를 지정하고 싶을 경우

Reference

profile
Hello yeahsilver's world!

0개의 댓글