
클래스는 객체를 생성하기 위한 설계도입니다. 이는 속성(필드)과 동작(메서드)를 포함하고 있으며 객체 지향 프로그래밍의 기본 단위입니다. 다음 예시와 같이 사용할 수 있습니다.
abstract class Animal {
String name;
Animal(String name) {
this.name = name;
}
// 공통 기능 제공
void sleep() {
System.out.println(name + " is sleeping...");
}
// 하위 클래스 구현 강제
abstract void makeSound();
}
class Dog extends Animal {
Dog(String name) {
super(name);
}
@Override
void makeSound() {
System.out.println(name + " says: 멍");
}
}
추상 클래스는 공통 기능을 포함하면서도 일부 메서드를 구현하지 않은 클래스입니다. 직접 인스턴스를 생성할 수 없으며, 하위 클래스에서 구현을 강제할 수 있습니다. 다음 예시와 같이 사용할 수 있습니다.
abstract class Animal {
String name;
// 추상 메서드
abstract void makeSound();
// 일반 메서드 (공통 기능 정의)
void sleep() {
System.out.println("Zzzzzzz...");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("멍멍");
}
}
인터페이스는 클래스가 구현해야 하는 메서드의 집합을 정의한 것 입니다. 다중 구현이 가능하며, 코드이 결합도를 낮출 수 있습니다. 다음 예시와 같이 사용할 수 있습니다.
interface Flyable {
void fly();
}
interface Swimable {
void swim();
}
class Bird implements Flyable {
@Override
public void fly() {
System.out.println("Bird is flying!");
}
}
class Duck implements Flyable, Swimable {
@Override
public void fly() {
System.out.println("Duck is flying!");
}
@Override
public void swim() {
System.out.println("Duck");
}
클래스, 추상 클래스, 인터페이스의 공통점과 차이점은 다음과 같습니다.
| 구분 | 클래스 | 추상 클래스 | 인터페이스 |
|---|---|---|---|
| 인스턴스 생성 | O | X | X |
| 생성자 포함 | O | O | X |
| 필드 선언 | O | O | X (public static final만 가능) |
| 메서드 구현 | O | O | X (default, static 제외) |
| 다중 상속 | X | X | O |
클래스, 추상 클래스, 인터페이스가 필요한 상황은 다음과 같습니다.
클래스는 객체에 대한 필드와 메서드를 정의한 설계도로, 객체지향 프로그래밍의 기본 단위입니다.
추상 클래스는 abstract키워드를 사용하는 클래스로서 일부 메서드는 구현하고 일부는 추상 메서드로 선언할 수 있는 클래스입니다. 또한, 직접 인스턴스를 생성할 수 없으며 반드시 자식 클래스에 의해 상속받아 사용합니다.
인터페이스는 클래스와 달리 다중 구현이 가능하며, 클래스가 구현해야 하는 메서드의 집합을 정의한 것 입니다.
일반적인 객체를 정의할 땐 클래스, 공통 속성 및 메서드 제공 및 일부 기능만 구현을 강제할 땐 추상 클래스, 다중 구현과 특정 기능에 대한 구현 강제가 필요할 땐 인터페이스를 사용합니다.
is-a 관계 정의can-do 관계 정의