추상 클래스, 인터페이스...
이름만 들어도 어려워 보이는 두 개념과 차이점을 살펴보자
아래에 나오는 코드는 예시일뿐 정해진 방법이 아닙니다.
자전거를 좋아하는 사람들은 핸들이나 바퀴를 자신에게 맞는, 좋아하는, 멋있는 부품으로 교체하곤 한다.
그 중 바퀴는 산악용이나 얇은 바퀴 등등 여러 바퀴들이 있는데
한 종류에 바퀴만 자전거에 사용할 수 있다면 어떻게 될까?
당연히 상황에 맞는 바퀴를 사용하지 못해서
효율적으로 자전거를 타지 못할 것이다.
기타 부품들은 동일하다고 가정하고
바퀴만 자유롭게 바꿀 수 있는 자전거를
추상 클래스와 인터페이스를 활용하여 만들어보자!
추상 클래스의 차이점은
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를 사용하여 정해놓은 역할을 구현할 수 있다.
코드를 글로 설명하기가 좀 어려웠고
정리가 잘 안되어 있는 것 같아서 아쉽다.
추상클래스와 인터페이스를 모르는 사람이 처음 봤을 때
어느정도 "아 이런거구나~" 할 수 있는 것을 목표로 글을 작성해보았는데
절반은 만족스럽고 절반은 오히려 이해를 잘못시킬 수도 있지 않을까라는 걱정이 된다.
더 좋은 예제나 예시가 있으면 중간중간에 글을 수정하도록 해야겠다.