추상 메서드(Abstract Method)란?
1. 개념 정의
추상 메서드(Abstract Method)는 객체지향 프로그래밍에서 하위 클래스가 반드시 구현해야 하는 메서드를 정의하는 방법이다. 이는 보통 추상 클래스(Abstract Class)나 인터페이스(Interface) 내에서 선언되며, 메서드의 선언만 존재하고 구현(implementation)은 포함되지 않는다. 즉, 추상 메서드는 구체적인 실행 코드 없이 이름과 매개변수만 정의된 메서드이다.
2. 추상 메서드의 특징
- 선언만 존재하고 구현이 없음: 본문(body)이 없는 메서드이며, 실제 동작을 수행하지 않는다.
- 추상 클래스 또는 인터페이스에서 사용: 반드시 추상 클래스나 인터페이스 내에서 선언되어야 한다.
- 하위 클래스에서 구현 필수: 추상 클래스를 상속받은 하위 클래스는 반드시 추상 메서드를 오버라이딩하여 구체적인 구현을 제공해야 한다.
- 객체 생성 불가: 추상 메서드를 포함하는 클래스는 인스턴스화할 수 없다. 즉, 직접 객체를 생성할 수 없으며, 반드시 하위 클래스를 통해 사용해야 한다.
3. 추상 메서드의 사용 목적
추상 메서드는 상속을 강제하고 코드의 일관성을 유지하기 위해 사용된다. 이를 통해 객체지향 프로그래밍(OOP)의 중요한 개념인 다형성(polymorphism)을 효과적으로 구현할 수 있다.
(1) 코드의 일관성 유지
추상 메서드는 부모 클래스에서 공통적인 메서드 이름과 인터페이스를 정의하지만, 실제 구현은 각 자식 클래스에 위임한다.
예를 들어, 다양한 동물(개, 고양이, 새 등)이 있지만, 모든 동물은 ‘소리를 낸다’는 공통적인 행동을 가진다고 가정하자.
// 추상 클래스 Animal 정의
abstract class Animal {
// 추상 메서드 (구현이 없음)
abstract void makeSound();
}
// 하위 클래스에서 구현
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("멍멍!");
}
}
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("야옹!");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
dog.makeSound(); // 출력: 멍멍!
cat.makeSound(); // 출력: 야옹!
}
}
결과
멍멍!
야옹!
위 코드에서 Animal 클래스는 makeSound()라는 메서드를 추상 메서드로 선언하여, 모든 동물은 소리를 낼 수 있어야 한다는 규칙을 정의하였다. 하지만, 각각의 동물(개와 고양이)은 자신만의 방식으로 소리를 내도록 구현하였다.
(2) 강제적인 오버라이딩
추상 메서드를 선언하면, 하위 클래스에서 반드시 구현해야 한다. 즉, 부모 클래스에서 정의한 인터페이스(메서드)를 자식 클래스가 반드시 따르도록 강제할 수 있다.
이를 통해 코드의 일관성과 확장성을 보장할 수 있다.
(3) 다형성 구현
추상 메서드는 다형성을 지원하는 중요한 개념 중 하나이다. 다형성(polymorphism)이란 같은 인터페이스를 공유하는 객체가 서로 다른 동작을 수행할 수 있도록 하는 객체지향 프로그래밍의 특징이다.
위 예제에서 Animal 타입의 객체를 통해 Dog와 Cat의 메서드를 호출할 수 있는 것이 다형성의 예시이다.
4. 추상 클래스와 추상 메서드의 차이점
항목 추상 클래스 (Abstract Class) 추상 메서드 (Abstract Method)
정의 | 추상 메서드를 포함할 수 있는 클래스 | 본문이 없는 메서드로, 하위 클래스에서 반드시 구현해야 함 |
구현 가능 여부 | 일부 구현을 가질 수 있음 | 자체적으로 구현 불가 |
객체 생성 | 직접 객체 생성 불가 | N/A |
포함 가능 요소 | 필드, 생성자, 일반 메서드, 추상 메서드 포함 가능 | 클래스 내에서 선언만 가능, 본문 없음 |
사용 목적 | 공통적인 기능을 정의하고 하위 클래스가 이를 확장하도록 강제 | 특정 메서드를 하위 클래스에서 반드시 구현하도록 강제 |
5. 인터페이스와의 비교
추상 클래스와 인터페이스는 모두 추상 메서드를 정의할 수 있지만, 그 방식과 목적이 다르다.
비교 항목 추상 클래스 인터페이스
메서드 구현 | 일부 메서드 구현 가능 | 모든 메서드는 기본적으로 구현이 없음 (Java 8부터 default 메서드 지원) |
다중 상속 | 단일 상속만 가능 | 다중 구현 가능 |
필드(변수) | 인스턴스 변수 사용 가능 | 모든 변수는 public static final (상수) |
생성자 | 생성자 존재 가능 | 생성자 없음 |
사용 목적 | 기본적인 기능을 제공하며 일부 구현 가능 | 순수한 설계(구현 강제) |
예제: 인터페이스와 추상 클래스 비교
// 추상 클래스
abstract class Vehicle {
abstract void startEngine();
void stopEngine() {
System.out.println("엔진 정지");
}
}
// 인터페이스
interface Movable {
void move();
}
// 추상 클래스 상속 + 인터페이스 구현
class Car extends Vehicle implements Movable {
@Override
void startEngine() {
System.out.println("자동차 엔진 시동");
}
@Override
public void move() {
System.out.println("자동차가 이동합니다");
}
}
public class Main {
public static void main(String[] args) {
Car car = new Car();
car.startEngine(); // 출력: 자동차 엔진 시동
car.move(); // 출력: 자동차가 이동합니다
car.stopEngine(); // 출력: 엔진 정지
}
}
이처럼 추상 클래스는 일부 구현이 가능하며, 인터페이스는 순수한 추상화만 제공한다.
6. 추상 메서드 사용 시 주의할 점
- 추상 메서드는 반드시 하위 클래스에서 구현해야 한다.
- 추상 클래스를 직접 객체화할 수 없다.
- 추상 메서드는 생성자에서 호출할 수 없다.
- 추상 클래스 내에 일반 메서드를 포함할 수 있으며, 필요에 따라 구현할 수도 있다.
- Java에서는 인터페이스의 기본 메서드(default method)를 활용하면 일부 구현을 가질 수 있다.
7. 결론
추상 메서드는 객체지향 프로그래밍에서 강제적인 메서드 구현을 요구하여 일관성을 유지하고, 다형성을 활용할 수 있도록 도와주는 중요한 개념이다.
이를 통해 확장성 있고 유지보수가 쉬운 코드를 작성할 수 있으며, 다양한 설계 패턴에서도 자주 활용된다.
실무에서 추상 클래스를 활용하면 중복 코드 제거, 설계의 명확성, 코드 재사용성 향상과 같은 이점을 얻을 수 있다.
'게으른 개발자의 끄적거림' 카테고리의 다른 글
구글 시크릿모드란? (특징, 사용법 등) (0) | 2025.02.24 |
---|---|
애자일 스크럼(Scrum) 기법이란? (0) | 2025.02.17 |
엑셀 꿀 단축키 모음(feat.단축키 한방 정리) (0) | 2025.02.11 |
Java extends implement 차이 (0) | 2025.02.11 |
HTML header 구조 및 예시 간단 설명 (1) | 2025.02.04 |