집 짓는 개발블로그
(Java) 추상메서드와 인터페이스 본문
자바 기술질문 중에 가장 흔한 추상메서드와 인터페이스의 차이에 대해 알아본다.
면접 앞두고는 3번만 보면 될 거 같음
1. 추상 클래스 (Abstract Class)
• 정의: 추상 클래스는 abstract 키워드로 선언되며, 일부 메서드는 구현되고 일부는 구현되지 않을 수 있습니다.
• 용도: 클래스 간의 공통 기능을 정의하고, 이를 상속받는 하위 클래스가 세부 구현을 완성하도록 강제합니다.
• 특징:
• 일반 메서드와 추상 메서드를 모두 가질 수 있음.
• 상태(멤버 변수)를 가질 수 있음.
• extends를 통해 한 클래스만 상속 가능.
• 생성자를 가질 수 있음.
예시 코드:
abstract class Animal {
String name;
Animal(String name) {
this.name = name;
}
// 추상 메서드 (구현 강제)
abstract void sound();
// 일반 메서드
void eat() {
System.out.println(name + " is eating.");
}
}
class Dog extends Animal {
Dog(String name) {
super(name);
}
@Override
void sound() {
System.out.println(name + " says Woof!");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog("Buddy");
dog.sound(); // Buddy says Woof!
dog.eat(); // Buddy is eating.
}
}
2. 인터페이스 (Interface)
• 정의: 인터페이스는 interface 키워드로 선언되며, 구현만을 정의하는 메서드 집합입니다.
• 용도: 클래스가 특정 동작을 구현하도록 강제하거나, 여러 클래스 간 공통된 행동을 정의합니다.
• 특징:
• 모든 메서드는 기본적으로 public abstract (Java 8 이후 default와 static 메서드 허용).
• 멤버 변수는 기본적으로 public static final (상수만 가능).
• 다중 구현 가능 (implements로 여러 인터페이스를 구현).
• 상태(멤버 변수)를 가질 수 없음.
예시 코드:
interface AnimalBehavior {
void sound(); // 추상 메서드
void eat(); // 추상 메서드
}
class Cat implements AnimalBehavior {
@Override
public void sound() {
System.out.println("Cat says Meow!");
}
@Override
public void eat() {
System.out.println("Cat is eating.");
}
}
public class Main {
public static void main(String[] args) {
AnimalBehavior cat = new Cat();
cat.sound(); // Cat says Meow!
cat.eat(); // Cat is eating.
}
}
3. 주요 차이점
기준 | 추상클래스 | 인터페이스 |
선언 키워드 | abstract class | interface |
상속 및 구현 | 한 클래스만 상속 가능(extends) | 다중 구현 가능(implements) |
메서드 타입 | 일반 메서드+추상 메서드 가능 | 기본적으로 추상 메서드만 가능 (Java 8 이후 default메서드 추가) |
멤버 변수 | 인스턴스 변수+상수 가능 | 상수만 가능(public static final) |
생성자 | 생성자 허용 | 생성자 불가 |
4. 언제 사용해야 할까?
• 추상 클래스: 클래스 간의 “is-a” 관계가 있고, 공통 속성과 메서드가 있는 경우.
예: Animal 클래스 → Dog, Cat
• 인터페이스: 클래스 간의 “can-do” 관계를 나타내야 할 때, 혹은 다중 상속이 필요한 경우.
예: AnimalBehavior 인터페이스 → Flyable, Swimmable
'Java' 카테고리의 다른 글
(Java) 순열, 중복순열 만들기 (1) | 2024.11.20 |
---|---|
(Java, Python) 지역변수와 전역변수 (2) | 2024.11.17 |
Java로 순열, 조합 만들기 (0) | 2024.11.16 |
하루만에 코딩테스트 언어 갈아타기(Python → Java)(6 진법변환, 포매팅, Math, min/max) (5) | 2024.11.15 |
하루만에 코딩테스트 언어 갈아타기(Python → Java)(5 문자열처리) (0) | 2024.11.15 |