학습
Java 인터페이스와 추상 클래스
Java 인터페이스와 추상 클래스 — 중급
인터페이스와 추상 클래스
1. 도입 (왜 배워야 하는가)
Java에서 인터페이스와 추상 클래스는 객체 지향 프로그래밍의 핵심 개념으로, 코드의 재사용성과 유연성을 높이는 데 중요한 역할을 합니다. 실무에서는 다양한 객체들이 동일한 행동을 수행할 수 있도록 약속을 정의하는 데 사용됩니다. 예를 들어, 쇼핑몰에서 다양한 결제 방식을 구현할 때, 모든 결제 수단이 공통의 메서드를 가지고 있어야 하므로 인터페이스를 사용합니다.
이 개념을 모르면:
- 코드 중복이 발생하여 유지보수가 어려워집니다.
- 다양한 객체들이 동일한 인터페이스를 구현하지 않아, 코드의 일관성이 떨어집니다.
- 확장 가능성이 줄어들어 새로운 요구사항에 쉽게 대응하기 어렵습니다.
2. 핵심 개념 설명
인터페이스
인터페이스는 메서드의 선언만을 포함하고, 해당 메서드를 구현하는 것은 클래스에서 수행합니다. 인터페이스는 클래스가 특정 행동을 하도록 강제하는 규약과 같습니다.
비유: 인터페이스는 요리법과 같습니다. 요리법에는 재료와 조리 방법이 있지만, 실제 요리는 요리사가 수행합니다.
추상 클래스
추상 클래스는 일부 메서드의 구현을 제공할 수 있는 클래스입니다. 즉, 완전한 클래스가 아니며, 다른 클래스에서 상속받아 사용합니다.
비유: 추상 클래스는 '자동차'라는 개념입니다. '자동차'는 구체적인 모델이 아니지만, 모든 자동차가 가져야 할 기본적인 특성과 기능을 정의합니다.
| 용어 | 설명 |
|---|---|
| 인터페이스 | 메서드의 선언만 포함, 다중 상속 가능 |
| 추상 클래스 | 메서드의 부분 구현이 가능, 단일 상속만 가능 |
3. 기본 코드 예제
인터페이스 예제
interface Payment {
void pay(double amount);
}
class CreditCardPayment implements Payment {
public void pay(double amount) {
System.out.println(amount + "원이 신용카드로 결제되었습니다.");
}
}
실행 결과:
10000원이 신용카드로 결제되었습니다.
동작 설명:
Payment라는 인터페이스를 정의하고pay메서드를 선언합니다.CreditCardPayment클래스가Payment인터페이스를 구현합니다.pay메서드가 실제로 동작하여 결제 메시지를 출력합니다.Animal이라는 추상 클래스를 정의하고sound라는 추상 메서드를 선언합니다.Dog클래스가Animal추상 클래스를 상속받고sound메서드를 구현합니다.sound메서드가 호출되어 "멍멍!"을 출력합니다.- 인터페이스는 메서드의 선언만을 포함하고, 다중 상속이 가능합니다.
- 추상 클래스는 일부 메서드 구현이 가능하며, 단일 상속만 허용됩니다.
- 코드의 유연성과 재사용성을 높이기 위해 인터페이스와 추상 클래스를 활용할 수 있습니다.
- 다음에 학습하면 좋은 주제: 다형성, 구현 클래스의 관계, Java의 접근 제어자.
추상 클래스 예제
abstract class Animal {
abstract void sound();
}
class Dog extends Animal {
void sound() {
System.out.println("멍멍!");
}
}
실행 결과:
멍멍!
동작 설명:
4. 실전 활용 예제
예제 1: 쇼핑몰에서 결제 방식 구현
interface Payment {
void pay(double amount);
}
class CreditCardPayment implements Payment {
public void pay(double amount) {
System.out.println(amount + "원이 신용카드로 결제되었습니다.");
}
}
class PayPalPayment implements Payment {
public void pay(double amount) {
System.out.println(amount + "원이 페이팔로 결제되었습니다.");
}
}
상황 설명: 다양한 결제 수단을 지원하는 쇼핑몰에서, 각 결제 수단이 Payment 인터페이스를 구현하여 일관된 방식으로 결제를 처리합니다.
예제 2: 게임 캐릭터 구현
abstract class Character {
abstract void attack();
}
class Warrior extends Character {
void attack() {
System.out.println("전사가 공격합니다!");
}
}
class Mage extends Character {
void attack() {
System.out.println("마법사가 마법으로 공격합니다!");
}
}
상황 설명: 게임에서 다양한 캐릭터가 존재할 때, Character 추상 클래스를 통해 각 캐릭터가 공격하는 방식을 정의합니다.
5. 흔한 실수와 주의사항
실수 1: 인터페이스에서 필드 사용
interface Payment {
double amount; // 잘못된 사용
}
올바른 코드:
interface Payment {
void pay(double amount); // 메서드로만 정의
}
실수 2: 추상 클래스의 인스턴스 생성
Animal animal = new Animal(); // 컴파일 오류
올바른 코드:
Animal animal = new Dog(); // 구체 클래스의 인스턴스 생성