반응형
SMALL
자바에서 추상 클래스와 인터페이스는 둘 다 클래스가 특정 기능을 수행하도록 강제하는 용도로 사용되지만, 그 사용 방식과 역할이 다르다.
추상 클래스
추상 클래스는 다른 클래스가 상속받아 사용할 수 있도록 공통된 속성과 메서드를 정의한 클래스다. 모든 메서드가 추상 메서드일 필요는 없으며, 일부는 구현할 수 있다. 추상 클래스는 하위 클래스에서 구체적으로 구현해야 할 메서드를 정의함으로써 부분적으로 공통된 기능을 상속하고, 일부 기능은 강제로 구현하게 할 때 유용하다.
특징
- abstract 키워드를 사용하여 선언한다.
- 일반 메서드와 추상 메서드를 모두 포함할 수 있다.
- 객체로 인스턴스화할 수 없으며, 반드시 하위 클래스에서 상속받아 사용해야 한다.
- 필드(변수)를 가질 수 있어 상태 정보를 저장할 수 있다.
- 단일 상속만 지원한다.
// 추상 클래스 선언
abstract class Animal {
// 일반 메서드 (구현된 메서드)
public void eat() {
System.out.println("먹고 있다.");
}
// 추상 메서드 (하위 클래스에서 구현해야 함)
public abstract void sound();
}
// 추상 클래스를 상속받는 Dog 클래스
class Dog extends Animal {
@Override
public void sound() {
System.out.println("멍멍");
}
}
// 추상 클래스를 상속받는 Cat 클래스
class Cat extends Animal {
@Override
public void sound() {
System.out.println("야옹");
}
}
// 테스트 코드
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(); // 출력: 야옹
}
}
인터페이스
인터페이스는 클래스가 구현해야 할 동작을 정의하는 틀이다. 인터페이스는 클래스가 특정 기능을 구현하도록 도와주, 클래스가 여러 개의 인터페이스를 구현할 수 있는 다중 구현이 가능하다. 인터페이스에 선언된 메서드는 모두 추상 메서드이므로 구현 코드가 없다.
특징
- interface 키워드를 사용하여 선언한다.
- 모든 메서드는 구현 없이 시그니처만 선언된다.
- 다중 구현이 가능하여 여러 인터페이스를 동시에 구현할 수 있다.
- 필드는 public static final 상수만 가질 수 있다.
- Java 8 이후부터 default 및 static 메서드 구현이 가능하여 일부 구현을 포함할 수 있다.
// Flyable 인터페이스 선언
interface Flyable {
// 추상 메서드 (fly 기능을 강제)
void fly();
}
// Swimmable 인터페이스 선언
interface Swimmable {
// 추상 메서드 (swim 기능을 강제)
void swim();
}
// 인터페이스를 구현하는 Duck 클래스
class Duck implements Flyable, Swimmable {
@Override
public void fly() {
System.out.println("오리가 날고 있다.");
}
@Override
public void swim() {
System.out.println("오리가 수영하고 있다.");
}
}
// 테스트 코드
public class Main {
public static void main(String[] args) {
Duck duck = new Duck();
duck.fly(); // 출력: 오리가 날고 있다.
duck.swim(); // 출력: 오리가 수영하고 있다.
}
}
장단점
추상 클래스 장점
- 상태와 행동을 모두 가질 수 있어 유연성이 높다.
- 공통 기능을 미리 구현하여 코드 재사용성을 높일 수 있다.
추상 클래스 단점
- 단일 상속만 지원하므로, 다중 상속이 필요한 경우 제한적이다.
- 필드(상태 정보)를 포함하고 있어 인터페이스보다 구조적으로 덜 유연하다.
인터페이스 장점
- 다중 구현이 가능하여, 하나의 클래스가 여러 기능을 수행하도록 만들 수 있다.
- 동작을 규격화하여 일관된 사용 방식을 강제할 수 있다.
인터페이스 단점
- 상수 외의 필드 사용이 불가하여 상태를 유지할 수 없다.
- 모든 메서드를 구현해야 하므로, 구현해야 할 내용이 많아질 수 있다.
구분 | 추상 클래스 (Abstract Class) | 인터페이스 (Interface) |
선언 방식 | abstract 키워드를 사용 | interface 키워드를 사용 |
메서드 구성 | 일반 메서드와 추상 메서드 모두 가능 | 모든 메서드는 추상 메서드로, Java 8 이후 default 메서드 가능 |
필드 사용 | 일반 필드와 상수 모두 사용 가능 | public static final 상수만 가능 |
상속 및 구현 | 단일 상속만 가능 | 다중 구현 가능 |
사용 목적 | 공통 기능의 구현과 일부 메서드 구현을 도 | 클래스에 특정 동작을 도와주며 일관성 유지 |
상태 유지 여부 | 필드 사용이 가능하여 상태 유지 가능 | 필드를 가질 수 없어 상태를 유지할 수 없음 |
기본 메서드 | default 메서드 불가 | Java 8 이후 default와 static 메서드로 일부 구현 가능 |
주요 사용 사례 | 공통된 속성을 가진 계층 구조에서 상위 클래스 역할 | 동작 규격화 및 다중 동작 구현이 필요한 경우 |
객체 생성 | 직접 생성 불가 (하위 클래스 통해 생성 가능) | 직접 생성 불가 (구현 클래스를 통해 생성 가능 |
반응형
LIST
'cs정리' 카테고리의 다른 글
스프링 빈 주입시 생기는 문제들 (0) | 2024.11.09 |
---|---|
SPRING BEAN이란 (0) | 2024.11.09 |
ORM 구현체- HIBERNATE, MYBATIS (2) | 2024.10.30 |
SPRING BOOT ORM이란? (0) | 2024.10.30 |
SPRING BOOT JPA란? (0) | 2024.10.30 |