지난번 포스팅에서 OOP와 OOP의 5대 원칙에 대해 알아보았습니다.
그 과정에서 인터페이스라는 개념이 등장하였는데요.
이 인터페이스라는 개념이 등장 할 때 따라오는 개념이 추상 클래스입니다.
둘은 무슨 관계이길래 같이 언급되는 걸까요?
추상 메서드: 인터페이스와 추상 클래스 모두 하나 이상의 추상 메서드를 포함할 수 있으며, 이는 하위 클래스에서 반드시 구현해야 합니다.
abstract class 클래스명{
//어떤 기능을 수행할지 설명 기입
abstract void 메서드명();
}
인스턴스화 금지: 직접적으로 인스턴스를 생성할 수 없으며(new 생성자 X), 반드시 구현체나 하위 클래스를 통해 인스턴스를 생성해야 합니다.
다형성의 기반: 둘 다 다형성을 제공하는 기반이 됩니다.
인터페이스나 추상 클래스 타입의 참조 변수를 사용하여 다양한 구현체나 하위 클래스의 인스턴스를 참조할 수 있습니다.
implements
키워드를 사용하여 구현되며, 하나의 클래스가 여러 인터페이스를 구현할 수 있습니다. 추상 클래스는 extends
키워드를 사용하여 상속되며, 자바에서는 단일 상속만을 지원합니다.인터페이스
public string str implements strInterface () {} ...
추상클래스
public string str extends strAbstractClass () {} ...
interface Printable {
// 추상 메서드
void print();
// 기본 메서드
default void printTwice() {
print();
print();
}
// 정적 메서드
static void printStatic() {
System.out.println("Printing from Static Method.");
}
}
class TextPrintable implements Printable {
public void print() {
System.out.println("Hello, World!");
}
}
public class Main {
public static void main(String[] args) {
TextPrintable text = new TextPrintable();
text.print(); // 출력: Hello, World!
text.printTwice(); // 출력: Hello, World! Hello, World!
Printable.printStatic(); // 출력: Printing from Static Method.
}
}
abstract class Vehicle {
protected int speed; // 상태 저장
Vehicle(int speed) {
this.speed = speed;
}
// 추상 메서드
abstract void accelerate();
// 구현된 메서드
void currentSpeed() {
System.out.println("Current speed: " + speed + " km/h");
}
}
class Car extends Vehicle {
Car(int speed) {
super(speed);
}
void accelerate() {
speed += 10;
System.out.println("Accelerating car...");
}
}
public class Main {
public static void main(String[] args) {
Car myCar = new Car(50);
myCar.currentSpeed(); // 출력: Current speed: 50 km/h
myCar.accelerate(); // 출력: Accelerating car...
myCar.currentSpeed(); // 출력: Current speed: 60 km/h
}
}
인터페이스와 추상 클래스의 선택은 특정 상황과 설계 목표에 따라 달라집니다. 인터페이스는 다중 구현을 지원하고, 유연성이 더 필요한 경우에 적합합니다. 반면, 추상 클래스는 공통된 코드를 재사용하고 상태를 공유해야 할 때 유용합니다. 두 방식은 서로 배타적이지 않으며, 실제 프로젝트에서는 상황에 맞게 혼합하여 사용될 수 있습니다. 객체 지향 설계 원칙과 프로젝트의 요구 사항을 고려하여, 둘 중 하나 혹은 둘 다를 적절히 활용하여 설계의 유연성을 높이고, 코드의 재사용성을 증가시키는 것이 중요합니다.
###출처 : https://brunch.co.kr/@kd4/6
https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-vs-%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EC%99%84%EB%B2%BD-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
https://wildeveloperetrain.tistory.com/112
https://myjamong.tistory.com/150