추상화(feat.추상 클래스와 인터페이스)🙆‍♂️

김민제·2023년 11월 1일
0
post-thumbnail
  • 이번 프리코스에서 SOLID의 5원칙 중 OOP(개방 폐쇄 원칙)에 대해 공부를 하다가 추상화라는 개념이 나와 이를 다시 정리해보고 가려합니다!

추상화

  • 추상화란 클래스들의 공통적인 요소를 뽑아서 상위 클래스를 만들어내는 것을 말합니다.
  • 추상화는 이와 같이 공통적인 속성과 기능을 정의한 상위 클래스를 만듦으로써 코드의 중복을 줄이고 클래스 간의 관계를 효과적으로 설정하며 유지 보수를 용이하게 만든다는 장점들이 있습니다.
  • 자바에서는 추상 클래스(abstract class)와 인터페이스(interface)를 통해 추상화를 구현합니다.

추상 클래스(abstract class)

  • 추상 클래스는 인스턴스가 될 수 없는 클래스이며 abstract 키워드를 사용하여 클래스를 정의합니다.
  • 추상 클래스는 보통 1개 이상의 추상 메소드를 가지며(없어도 무관) 추상 클래스를 상속한 클래스들은 내부의 추상메소드를 구현하여 완성해주어야 합니다.
  • 추상 클래스는 새로운 클래스를 작성할 때 유용한 미완성 설계도라고 볼 수도 있습니다.
  • 추상 클래스는 생성자, 필드, 일반 매소드도 포함할 수 있습니다.
  • 추상 메소드
    • 추상 메소드는 선언만 되어있는 미완성인 메소드입니다.
    • 하위 클래스에서 오버라이딩을 통해 메소드를 구현하여 사용합니다.
  • 즉, 추상클래스는 상속된 클래스에게 “이런 행동을 해!”라고 강제하는 클래스라고 볼 수도 있겠네요!
  • 예시를 통해 알아봅시다.
abstract class Car {
    String name;
    Car(String name){
        this.name = name;
    }
    void print(){
        System.out.println("This car is " + name);
    }
    abstract void car_type();
}
class hyundai extends Car{
    hyundai(String name) {
        super(name);
    }
    @Override
    void car_type() {
        System.out.println("sonata");
    }
}
class kia extends Car{

    kia(String name) {
        super(name);
    }

    @Override
    void car_type() {
        System.out.println("k5");
    }
}
class Test{
    public static void main(String[] args) {
        hyundai car1 = new hyundai("현대");
        kia car2 = new kia("기아");

        car1.print();
        car2.print();

        car1.car_type();
        car2.car_type();
    }
}
  • 결과
This car is 현대
This car is 기아
sonata
k5

인터페이스(interface)

  • 인터페이스 또한 일종의 추상 클래스입니다. 차이점은 내용이 있는 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다는 점이 있습니다.
  • 즉, 인터페이스는 오로지 추상 메소드와 상수만을 포함할 수 있습니다.
  • 그러면 왜 인터페이스를 사용할까요?
    • 추상클래스를 통한 상속은 한 개만 가능하지만 인터페이스를 통한 상속(구현)은 다중으로 가능합니다!
  • 예제
interface Car {
    void print();
    void car_type();
}
class hyundai implements Car{
    public void print(){
        System.out.print("this car is ");
    }
    @Override
    public void car_type() {
        System.out.println("sonata");
    }
}
class kia implements Car{

    public void print(){
        System.out.print("this car is ");
    }
    @Override
    public void car_type() {
        System.out.println("k5");
    }
}
class Test{
    public static void main(String[] args) {
        hyundai car1 = new hyundai();
        kia car2 = new kia();

        car1.print();
        car1.car_type();

        car2.print();
        car2.car_type();
    }
}
  • 결과
this car is sonata
this car is k5
  • Car 인터페이스를 구현하는 클래스는 print(), car_type()메소드를 가져야한다는 것을 알려주고 있고 구현 받은 클래스에서는 이 두 개의 메소드를 오버라이딩하여 사용하고 있습니다.

정리

  • 이와 같이 공통적인 기능이나 속성이 있을 때 추상클래스와 인터페이스를 활용하면 더 객체 지향적이고 유지보수가 용이한 프로그램을 만들 수 있습니다!
  • 이들을 더 잘 활용할 방법들에 대해서도 모색해봐야할 것 같습니다!
profile
블로그 이전했습니다!! 👉 https://alswp006.github.io/

0개의 댓글