1. 추상클래스
추상클래스의 정의와 특징
- 추상 클래스는 하나 이상의 추상 메서드를 포함하는 클래스이다.
- 추상 메서드는 메서드 선언만 있고 구현이 없는 메서드이다.
- 추상 클래스는 직접적으로 인스턴스화할 수 없으며, 상속을 통해 사용된다.
- 추상 클래스는 추상 메서드 외에도 일반 메서드와 인스턴스 변수를 포함할 수 있다.
- 추상 클래스는
absract 키워드를 사용하여 정의된다.
추상 클래스의 목적과 활용 예시
- 추상 클래스의 주요 목적은 공통된 기능과 속성을 가진 클래스들을 모델링하고 코드 재사용성을 높이는 것이다.
- 추상 클래스는 다른 클래스들에게 공통된 메서드와 변수를 상속해주기 위해 사용된다.
- 예시로, 동물을 모델링하는 추상 클래스인
Animal 클래스를 생성할 수 있다. Animal 클래스는 공통된 특성과 동작(메서드)을 가지며, 실제 동물들의 구체적인 클래스(하위 클래스)가 이를 상속받아 구현할 수 있다.
추상 메서드와 일반 메서드의 차이 설명
- 추상 메서드는 메서드의 선언만 있고 구현이 없는 메서드이다.
- 일반 메서드는 메서드의 선언과 구현이 모두 포함되어 있다.
- 추상 클래스는 추상 메서드를 하나 이상 가지고 있어야 하지만, 일반 메서드도 포함할 수 있다.
- 추상 메서드는 하위 클래스에서 반드시 구현되어야 합니다. 반면, 일반 메서드는 이미 구현되어 있어 하위 클래스에서 추가 구현이 필요 없다.
- 추상 메서드는 하위 클래스에서 다양한 구현을 제공하고, 일반 메서드는 공통된 동작을 제공한다.
추상 클래스를 상속하는 방법과 규칙 설명
- 추상 클래스를 상속받기 위해서는 하위 클래스에서
extends 키워드를 사용하여 상속을 선언해야 한다.
- 자식 클래스는 추상 클래스의 모든 추상 메서드를 구현해야 한다. 그렇지 않으면 자식 클래스도 추상 클래스로 선언되어야 한다.
- 추상 클래스의 일반 메서드는 그대로 상속받아 사용할 수 있으며, 필요에 따라 자식 클래스에서 재정의할 수 있다.
- 하나의 클래스는 추상 클래스와 동시에 인터페이스를 상속받을 수 있다.
추상 클래스의 상속 관계 예시 코드
public abstract class Animal {
abstract void makeSound();
void eat() {
System.out.println("밥 먹기");
}
}
public class Dog extends Animal{
@Override
void makeSound() {
System.out.println("멍멍");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.eat();
dog.makeSound();
}
}
2. 인터페이스
인터페이스의 정의와 특징
- 인터페이스는 추상 메서드, 상수 및 디폴트 메서드로 이루어진 참조 타입이다.
- 추상 클래스와 달리, 추상 메서드만을 가지며 일반 메서드의 구현은 포함하지 않는다.
- 인터페이스는 클래스가 어떤 메서드를 제공하고 어떤 상수를 가지는지 정의하는 역할을 한다.
- 인터페이스는
interface 키워드를 사용하여 정의된다.
인터페이스의 목적과 장점
- 인터페이스의 주요 목적은 클래스 간의 명세를 정의하는 것이다. 이는 클래스가 특정한 메서드를 구현하도록 보장한다.
- 인터페이스는 코드의 유연성과 재사용성을 높여준다. 클래스가 여러 개의 인터페이스를 구현할 수 있으므로 다양한 기능을 가진 객체를 생성할 수 있다.
- 인터페이스는 클래스 간의 결합도를 낮추고, 코드의 의존성을 관리하기 쉽게 해준다.
- 인터페이스는 다른 개발자와의 협업 시 계약을 통해 메서드의 사용법과 의도를 명확히 정의할 수 있다.
다중 상속과 인터페이스의 관계 설명
- 자바에서는 클래스는 다중 상속을 지원하지 않지만, 인터페이스는 다중 상속이 가능하다.
- 클래스는 단일 클래스로부터 상속을 받을 수 있지만, 인터페이스는 여러 개의 인터페이스로부터 상속을 받을 수 있다.
- 이를 통해 클래스는 여러 개의 인터페이스에서 정의된 메서드를 구현하여 다양한 기능을 수행할 수 있다.
- 인터페이스 간의 다중 상속으로 인해 충돌하는 메서드 구현이 있을 경우, 해당 클래스에서 해당 메서드를 재정의해야 한다.
인터페이스를 구현하는 방법
- 인터페이스를 구현하기 위해서는 클래스에서
implements 키워드를 사용하여 구현을 선언해야 한다.
- 클래스에서는 인터페이스에서 정의한 모든 추상 메서드를 구현해야 한다.
- 인터페이스에서 선언된 모든 상수는 자동으로 구현 클래스로 상속된다.
- 인터페이스를 구현하는 클래스는 인터페이스의 메서드를 재정의하여 필요한 기능을 구현해야 한다.
- 하나의 클래스는 여러 개의 인터페이스를 구현할 수 있다.
인터페이스의 구현 예시 코드
public interface Shape {
double calculateArea();
}
public class Circle implements Shape{
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
}
public class Main {
public static void main(String[] args) {
Shape circle = new Circle(5);
System.out.println(circle.calculateArea());
}
}
추상 클래스와 인터페이스의 공통점과 차이점
공통점:
- 추상 클래스와 인터페이스 모두 추상 메서드를 포함할 수 있다.
- 둘 다 상속을 통해 기능을 확장하고, 다형성을 지원한다.
- 클래스들 간의 관련성을 나타내는 용도로 사용될 수 있다.
차이점:
- 추상 클래스는 추상 메서드 외에도 일반 메서드와 인스턴스 변수를 포함할 수 있다. 반면, 인터페이스는 추상 메서드, 디폴트 메서드, 정적 메서드, 상수만을 가질 수 있다.
- 클래스는 단일 상속만 가능하지만, 인터페이스는 다중 상속을 지원한다.
- 추상 클래스는
extends 키워드를 사용하여 상속을 선언하고, 인터페이스는 implements 키워드를 사용하여 구현을 선언한다.
- 클래스가 추상 클래스를 상속받을 때는
is-a 관계를 갖는다. 반면, 인터페이스를 구현할 때는 has-a 관계를 갖는다.
IS-A
notebook is a computer (o)
laptop is a desktop (X)
computer 라는 공통 속성이 있고 (부모클래스) laptop, notebook 는 공통 속성을 각각 상속받는다.
Has-A
HAS-A 는 특정기능을 사용하고 싶을때 자주 사용한다.
차로 예를 들자면 차는 엔진과 ,어떤 것들… 을 가지고 있다. 즉 기능을 포함시키고 싶을때 사용 하는 것이 HAS-A 이다.
상황에 따른 추상 클래스와 인터페이스의 선택 기준
- 추상 클래스: 클래스들 간에 공통된 구현을 가지는 경우, 기본적인 구현을 제공하고 하위 클래스들이 이를 상속받아 확장해야 하는 경우에 사용한다. 또한, 추상 클래스는 단일 상속을 지원하므로 클래스의 계층 구조가 필요한 경우에 적합하다.
- 인터페이스: 다양한 클래스들 간에 공통된 동작을 정의하고, 다중 상속이 필요한 경우에 사용한다. 또한, 클래스들 간의 관계를 약결합하고 유연성을 갖추어야 하는 경우에 적합하다.