추상 클래스와 인터페이스

Y3SUNG·2022년 11월 16일
0

추상 클래스, 인터페이스...
이름만 들어도 어려워 보이는 두 개념과 차이점을 살펴보자

아래에 나오는 코드는 예시일뿐 정해진 방법이 아닙니다.

예시를 들어보자!

자전거를 좋아하는 사람들은 핸들이나 바퀴를 자신에게 맞는, 좋아하는, 멋있는 부품으로 교체하곤 한다.
그 중 바퀴는 산악용이나 얇은 바퀴 등등 여러 바퀴들이 있는데
한 종류에 바퀴만 자전거에 사용할 수 있다면 어떻게 될까?

당연히 상황에 맞는 바퀴를 사용하지 못해서
효율적으로 자전거를 타지 못할 것이다.

기타 부품들은 동일하다고 가정하고
바퀴만 자유롭게 바꿀 수 있는 자전거를
추상 클래스와 인터페이스를 활용하여 만들어보자!

추상 클래스의 차이점은

  • class를 선언할 때 abstract가 붙고
  • 메소드 앞에 abstract가 붙을 수도 있고(추상 메소드 > 자식 클래스에서 무조건 구현해줘야함)
  • 객체 생성이 불가능합니다.
abstract class Bicycle {
    private String frame = "삼천리";
    private String handle = "일자 핸들";
    private Wheel wheel;

    void setWheel(Wheel wheel) {
        this.wheel = wheel;
    }

    Wheel getWheel() {
        return wheel;
    }

    void introduce_wheel() {
        System.out.println("일반 바퀴입니다.");
    }
}

frame과 handle을 삼천리, 일자핸들로 정해두었고
wheel은 Wheel이라는 인터페이스를 만들었다.

interface Wheel {
    void introduce_wheel();
}

인터페이스란 동일한 목적 하에 동일한 역할을 수행하도록 강제하는 것이다.
Wheel 인터페이스는 introduce_wheel이라는 함수를 꼭 구현해줘야된다 라고 정해놓는 것이다.

예시 코드라서 wheel의 종류를 설명하는 introduce_wheel이라는 메소드를 만든 것 이다..
실제 코드였다면 wheel의 크기나 무게, 재질 등등을 변경하는 등의 행동을 하는 메소드를 만들었을 것 같다...

추상 클래스이기 때문에 객체를 만드려면 자식클래스를 만들어서 객체를 만들어야한다.
만들어보자!

class BasicBicycle extends Bicycle {

}

public class Abstract_Bicycle {
    public static void main(String[] args) {
        Bicycle basicBicycle = new BasicBicycle();

        basicBicycle.introduce_wheel();
    }
}

이제 코드를 실행시켜보면

일반 바퀴입니다.

라고 프린트 될 것이다.

하지만 내 자전거는 일반 바퀴가 아닌 산악용 바퀴로 하고 싶다면?

class MountainBicycle extends Bicycle {

    @Override
    void introduce_wheel() {
        getWheel().introduce_wheel();
    }
}

class MountainWheel implements Wheel {
    @Override
    public void introduce_wheel() {
        System.out.println("삼악용 바퀴입니다.");
    }
}

위 코드들을 추가하고 main 메소드 안에

Bicycle myBicycle = new MountainBicycle();
Wheel myWheel = new MountainWheel();

myBicycle.setWheel(myWheel);

myBicycle.introduce_wheel();

위 코드를 추가해줬다.

myWheel 클래스를 만들어 implements로 Wheel 인터페이스를 구현하였고
MountainBicycle 클래스로 Bicycle 추상 클래스를 상속 받고
introduce_wheel() 메소드를 오버라이딩하여
getWheel().introduce_wheel(); 즉 받아온 Wheel의 introduce_wheel() 메소드를 실행시키도록 바꾸었다.

myBicycle 객체과 myWheel 객체를 만들고
myBicycle.setWheel(myWheel); 을 해주면서
MountainWheel 클래스로 만든 객체인 myWheel을 setWheel을 사용하여 myBicycle의 Wheel을 MountainWheel로 set 해주었고
introduce_wheel 메소드를 실행시키면
Mountain에 있는 introduce_wheel이 실행되면서

산악용 바퀴입니다.

라고 프린트가 된다.

정리

추상클래스는 클래스와 비슷하지만
말그래로 추상적인 클래스로
class를 선언할 때 abstract가 붙고
메소드 앞에 abstract가 붙을 수도 있고(추상 메소드 > 자식 클래스에서 무조건 구현해줘야함)
객체 생성이 불가능한 특징이 있다. (더 있겠지...?)

인터페이스는 동일한 목적 하에 동일한 역할을 수행하도록 강제하는 것이라고 정리할 수 있고
implements를 사용하여 정해놓은 역할을 구현할 수 있다.

느낀점

코드를 글로 설명하기가 좀 어려웠고
정리가 잘 안되어 있는 것 같아서 아쉽다.

추상클래스와 인터페이스를 모르는 사람이 처음 봤을 때
어느정도 "아 이런거구나~" 할 수 있는 것을 목표로 글을 작성해보았는데
절반은 만족스럽고 절반은 오히려 이해를 잘못시킬 수도 있지 않을까라는 걱정이 된다.
더 좋은 예제나 예시가 있으면 중간중간에 글을 수정하도록 해야겠다.

참고
https://www.youtube.com/watch?v=yQ_WvWm3oKs

profile
자바칩 프라푸치노

0개의 댓글