- 이번 프리코스에서 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()메소드를 가져야한다는 것을 알려주고 있고 구현 받은 클래스에서는 이 두 개의 메소드를 오버라이딩하여 사용하고 있습니다.
정리
- 이와 같이 공통적인 기능이나 속성이 있을 때 추상클래스와 인터페이스를 활용하면 더 객체 지향적이고 유지보수가 용이한 프로그램을 만들 수 있습니다!
- 이들을 더 잘 활용할 방법들에 대해서도 모색해봐야할 것 같습니다!