<궁금한내용>
49일차 수업 도중 궁금한 내용..
https://dev-with-gpt.tistory.com/179
자바에서 다중상속 개념을 배우면서 추상 클래스와 인터페이스에 대해 배웠다.
그런데 추상 클래스와 인터페이스의 차이에 대해 궁금해졌다.
그래서 그 차이가 무엇인지 궁금해서 알아보았다.
<자바에서 추상 클래스와 인터페이스 차이>
자바에서 추상 클래스와 인터페이스는 모두 추상화를 위한 도구로 사용됩니다.
하지만 추상 클래스와 인터페이스 간에는 몇 가지 중요한 차이점이 있습니다. 주요한 차이점은 다음과 같습니다:
# 1. 정의 방식:
- 추상 클래스(Abstract Class):
추상 클래스는 `abstract` 키워드를 사용하여 정의되며,
일반적인 클래스와 마찬가지로 필드, 메서드, 생성자 등을 포함할 수 있습니다.
추상 클래스는 추상 메서드를 가질 수도 있고, 가지지 않을 수도 있습니다.
- 인터페이스(Interface):
인터페이스는 `interface` 키워드를 사용하여 정의되며,
메서드의 선언만을 포함할 수 있습니다. 필드를 가질 수 없고, 메서드는 추상 메서드로 선언되며
기본적으로 `public`으로 간주됩니다.
# 2. 다중 상속:
- 추상 클래스:
자바에서는 단일 상속만을 지원하므로 추상 클래스는 다른 클래스를 상속받을 때,
해당 클래스 이외에는 다른 상속을 받을 수 없습니다.
- 인터페이스:
인터페이스는 다중 상속을 지원합니다. 클래스는 여러 개의 인터페이스를 구현할 수 있으며,
이를 통해 다중 상속과 유사한 효과를 얻을 수 있습니다.
# 3. 구현:
- 추상 클래스:
추상 클래스는 일반 메서드를 구현할 수 있습니다.
추상 클래스를 상속받은 하위 클래스는 추상 메서드 외에도 일반 메서드를 가질 수 있으며,
추상 클래스의 메서드를 재정의하거나 추가적인 메서드를 정의할 수 있습니다.
- 인터페이스:
인터페이스는 추상 메서드의 선언만을 포함하므로, 인터페이스를 구현하는 클래스는 모든 메서드를 구현해야 합니다.
따라서 인터페이스는 클래스 간의 일관된 동작을 보장하고, 다형성을 지원하는 역할을 합니다.
# 4. 목적:
- 추상 클래스: 추상 클래스는 클래스들 사이의 공통된 특성을 추출하고 코드를 재사용하기 위해 사용됩니다.
하위 클래스들 간의 관계를 형성하고, 공통된 메서드 및 필드를 정의하여 코드의 일관성을 유지합니다.
- 인터페이스: 인터페이스는 클래스들이 어떤 동작을 수행하는지를 정의하기 위해 사용됩니다.
클래스들이 인터페이스를 구현함으로써 특정한 동작을 보장하고,
다른 클래스와의 상호작용을 가능하게 합니다.
따라서, 추상 클래스와 인터페이스는 각각 다른 용도와 사용범위를 가지고 있으며, 상황에 맞게 적절히 선택하여 사용해야 합니다. 추상 클래스는 공통된 특성과 구현을 갖는 클래스들을 그룹화하고 확장하기 위해 사용되며, 인터페이스는 클래스들이 특정한 동작을 수행하고 상호작용하기 위한 계약을 정의하기 위해 사용됩니다.
**추상 클래스 예제:**
// 추상 클래스 정의
abstract class Animal {
String name;
public Animal(String name) {
this.name = name;
}
// 추상 메서드 선언
abstract void makeSound();
// 일반 메서드 정의
public void sleep() {
System.out.println(name + " is sleeping.");
}
}
// 추상 클래스를 상속받은 구체적인 클래스
class Dog extends Animal {
public Dog(String name) {
super(name);
}
// 추상 메서드 재정의
void makeSound() {
System.out.println(name + " is barking.");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog("Bobby");
animal.makeSound(); // "Bobby is barking."
animal.sleep(); // "Bobby is sleeping."
}
}
추상 클래스 `Animal`은 `makeSound`라는 추상 메서드와 `sleep`라는 일반 메서드를 정의합니다. `Dog` 클래스는 `Animal` 클래스를 상속받고, `makeSound` 메서드를 재정의합니다. `Main` 클래스에서는 `Dog` 객체를 생성하고, 다형성을 이용하여 `makeSound`와 `sleep` 메서드를 호출합니다.
**인터페이스 예제:**
// 인터페이스 정의
interface Shape {
void draw();
}
// 인터페이스를 구현한 클래스
class Circle implements Shape {
public void draw() {
System.out.println("Drawing a circle");
}
}
class Rectangle implements Shape {
public void draw() {
System.out.println("Drawing a rectangle");
}
}
public class Main {
public static void main(String[] args) {
Shape circle = new Circle();
circle.draw(); // "Drawing a circle"
Shape rectangle = new Rectangle();
rectangle.draw(); // "Drawing a rectangle"
}
}
인터페이스 `Shape`는 `draw`라는 추상 메서드를 선언합니다. `Circle` 클래스와 `Rectangle` 클래스는 `Shape` 인터페이스를 구현하고, `draw` 메서드를 구체적으로 정의합니다. `Main` 클래스에서는 다형성을 이용하여 `Circle` 객체와 `Rectangle` 객체를 생성하고, `draw` 메서드를 호출합니다.