Interface와 Abstract
Interface
인터페이스란 클래스가 따라야 할 설계도와 같다.
따로 필드를 작성하지 않고 추상 메소드만 정의한다. 이때 실제 로직 또한 작성하지 않고 추후 구현하는 클래스가 작성하게 한다.
인터페이스는 interface 라는 키워드를 사용하고 구현 클래스는 implements 키워드를 사용한다.
이때 구현 클래스는 인터페이스 안 모든 추상 메소드를 구현해야한다.
💡 일반 class 구현과 Interface 클래스 구현의 차이
일반 클래스를 추후 자식 클래스가 상속 받아서 참조할 경우 일반 클래스에서 메소드를 구현해야한다. 하지만 자식 클래스에서 참조한 메소드는 객체마다 다르게 구현될 것이기 때문에 사실 일반 클래스에서 구현한 메소드가 사용되는 일이 많지 않다.
만약 Interface 클래스를 만든다면, 메소드를 구현하지 않고 선언만 해줄 수 있고 추후 상속 받은 클래스가 이를 참조해서 그에 맞는 메서드 구현을 할 수 있다. 이렇게 되면 좀 더 코드를 줄이고 단순하게 작성할 수 있다.
예시
interface Animal {
void makeSound();
}
class Dog implements Animal {
@Override
public void makeSound() {
System.out.println("왈왈왕ㄹ왈ㄹ!!!!");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound();
}
}
Abstract
인스턴스를 생성할 수 없는 클래스
하나 이상의 추상 메소드(abstract)를 포함하며 일반 메소드도 포함이 가능하다.
상속을 통해 자식 클래스가 완성해야 하는 설계 템플릿과 같은 개념이다.
일반 클래스와 추상 클래스와 인터페이스의 차이
| 일반 클래스 | 추상 클래스 | 인터페이스 | |
| 인스턴스 생성 | 가능 | 불가능 | 불가능 |
| abstract 메소드 | 선택적 포함 | 필수 X (1개 이상 포함) | 전부 abstract |
| 일반 메소드 | 가능 | 가능 | java 8 이후 default로 가능 |
| 상속 키워드 | extends | extends | implements |
예시
abstract class Animal {
abstract void makeSound();
public void sleep() {
System.out.println("ZZZ .... 자는 중.....");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("왈왈왕ㄹ왕ㄹ왈!!");
}
}
public class Abstract {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound();
dog.sleep();
}
}
Animal 이라는 추상 클래스를 만들어서 makeSound() 라는 추상 메소드와 sleep() 이라는 일반 메소드를 구현했다. 여기서 인터페이스와의 차이점이 인터페이스는 일반 메소드를 사용하지 못한다!
Dog 클래스가 추상 클래스를 상솓 받아서 makeSound() 메소드를 구현하고 Main 클래스에서 활용하는 것을 볼 수 있다.
🤔 추상 클래스가 추상 메소드와 일반 메소드를 모두 사용할 수 있는데 왜 굳이 인터페이스를 사용할까?
사용하는 목적에 따라 다른 것 같다. 이해를 위해 그림을 그려봤다..!

Animal 이라는 추상 클래스에서 Dog , Cat 과 같은 구현 클래스를 작성할 경우에는 구현 클래스 안에서도 공통된 기능들이 존재할 경우 추상 클래스에서 일반 메소드를 작성하면 구현 클래스에서 구현하지 않아도 사용할 수 있다.
인터페이스의 경우 기능과 같은 것들을 모아둘 경우 사용하는 것 같다. 예를 들어 동물들중에서도 수영을 할 수 있는 동물들이 있을 수 있고 날아다닐 수 있는 동물들이 있는데, 해당 기능들을 따로 인터페이스로 분리시켜서 필요한 기능들을 구현 클래스가 적용하고 싶을 때 사용한다.
'Programming > Java' 카테고리의 다른 글
| JVM이 무엇이고 구조에 대해 알아보자 (0) | 2025.05.10 |
|---|---|
| 원시타입과 참조 타입 (2) | 2025.05.04 |
| 의존성에 대해서 (2) | 2025.03.20 |
| BufferedReader와 BufferedWriter (2) | 2025.02.15 |
| 객체지향에게 역할과 책임이란 (1) | 2025.02.11 |