추상화란?
- 복잡한 시스템의 세부 사항을 숨기고
- 사용자에게 중요한 기능만을 노출
추상 클래스 (Abstract Class):
- 추상 클래스는 일반 클래스와 유사하지만, 인스턴스화할 수 없다.
- 하나 이상의 추상 메소드를 포함할 수 있다. 추상 메소드는 메소드 선언만 있고, 구현은 없다. 이를 상속받는 클래스에서 구체적으로 구현해야함
- 추상 클래스는 공통의 기능을 여러 클래스에 공유하도록 하면서도, 일부 메소드만 각 클래스에서 구체적으로 정의할 수 있도록 한다.
abstract class Animal {
// 일반 메소드
void eat() {
System.out.println("This animal is eating");
}
// 추상 메소드
abstract void sound();
}
class Dog extends Animal {
// 추상 메소드 구현
void sound() {
System.out.println("Woof");
}
}
class Cat extends Animal {
// 추상 메소드 구현
void sound() {
System.out.println("Meow");
}
}
Animal은 추상 클래스이고, sound는 추상 메소드입니다. Dog와 Cat 클래스는 Animal을 상속받고, 각각의 방식으로 sound 메소드를 구현
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
dog.eat();
dog.sound();
cat.eat();
cat.sound();
}
}
실행결과
This animal is eating
Woof
This animal is eating
Meow
인터페이스 (Interface)란?
- 인터페이스는 모든 메소드가 추상 메소드인 클래스의 일종으로 자바 8 이후부터는 기본 메소드와 정적 메소드를 인터페이스에 포함할 수 있지만, 기본적으로 인터페이스의 메소드는 구현이 없다.
- 여러 클래스가 인터페이스를 구현할 수 있으며, 이를 통해 서로 다른 클래스들 간에 공통의 행동을 강제할 수 있다.
- 자바는 다중 상속을 지원하지 않지만, 한 클래스가 여러 인터페이스를 구현할 수 있다.
interface Animal {
void sound();
}
class Dog implements Animal {
public void sound() {
System.out.println("Woof");
}
}
class Cat implements Animal {
public void sound() {
System.out.println("Meow");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
dog.sound();
cat.sound();
}
}
실행결과
Woof
Meow
Animal은 인터페이스이고, Dog와 Cat 클래스는 이 인터페이스를 구현하여 sound 메소드를 정의
실행결과로 보는 둘의 차이
- 추상 클래스 예제에서는 공통의 기능인 eat()을 포함하고 있으므로, 이 메소드도 함께 실행
- 인터페이스 예제에서는 오직 인터페이스에 정의된 sound() 메소드만 구현되므로, eat()과 같은 공통 기능이 없다.
따라서 추상 클래스는 일부 구현된 메소드를 상속받아 사용할 수 있지만, 인터페이스는 오직 메소드의 시그니처(형태)만 정의하며, 구현은 이를 상속받는 클래스가 모두 해야 합니다.
추상화의 장점
- 복잡성 감소: 복잡한 시스템의 구현 세부 사항을 숨김으로써, 사용자는 중요한 기능에만 집중
- 코드 재사용성: 추상화된 클래스나 인터페이스를 통해 다양한 클래스에서 공통된 기능을 정의하고 사용
- 유지보수 용이성: 코드 수정 시, 추상화된 부분만 수정하면 되므로 유지보수가 쉽다.
반응형