1. 추상화란?
- "추상"의 사전적 정의는 사물이나 개념의 공통적인 본질을 추출하여 단순화하는 것이며, 자바에서의 추상화는 객체들의 공통적인 속성과 기능을 뽑아 상위 클래스로 정의하는 작업이다. 추상화를 통해 현실 세계의 복잡한 개념을 단순하고 명확하게 모델링할 수 있다.
(예 : 자동차와 오토바이의 공통 기능(전진, 후진, 정지)을 추출해 Vehicle이라는 상위 클래스를 만들 수 있다.)
1 - 2. 추상화의 필요성
- 복잡한 시스템을 단순하게 표현할 수 있다.
- 핵심 요소만 모델링하여 시스템의 이해도를 높인다.
- 공통점을 기준으로 설계하면 코드 재사용성이 높아진다.
- 중복 코드 제거, 유지보수 비용 절감
- 유연한 구조 설계가 가능하다.
- 구체 구현에 의존하지 않고 인터페이스 기반 설계 가능
- 기능 확장과 교체가 용이하다.
- 새로운 클래스가 기존 구조를 따르기만 하면 호환 가능
1 - 3. 추상화를 구현하는 방법
- 자바에서는 추상 클래스와 인터페이스를 통해 추상화를 구현한다.
- 추상 클래스(abstract class) : 공통 속성과 일부 구현 메서드를 포함할 수 있다.
- 인터페이스(interface) : 공통 행위만 정의한다. (자바 8 이후 default 메서드의 추가가 가능해졌다.)
1 - 4. 추상화 유형
1 - 4 - 1. 행위 중심 추상화
- 객체가 수행해야 할 "기능"에 초점을 맞춘 추상화
- 예) 자동차와 전자기기에서의 "전원켜기", "작동하기" 등의 메서드 정의
1 - 4 -2. 데이터 중심 추상화
- 객체가 가져야할 "데이터"에 초점을 맞춘 추상화
- 예) DTO, VO 객체에서 이름, 나이, 성별 등의 필드 정의
1 - 5. 추상화 정리
- 상속이 하위 클래스를 정의하는데 상위 클래스를 사용하는 것이라고 한다면 추상화는 반대로 기존 클래스들의 공통적인 요소들을 뽑아서 상위 클래스를 만들어 내는 것이라고 할 수 있다. 사실 방법에 있어서는 상향식과 하향식 설계 모두 크게 상관이 없다. 즉, 공통적인 속성과 기능을 저으이하고 하위 클래스들을 생성할 수도 있고, 반대로 하위 클래스들의 공통성을 모아 상위 클래스를 정의할 수 있는 것이다. 이렇게
공통적인 속성과 기능을 모아서 정의해 주면 코드의 중복을 줄일 수 있고, 보다 효과적으로 클래스 간의 관계를 설정할 수 있으며, 유지/보수가 용이해 진다. 자바에서는 주로 추상 클래스와 인터페이스라는 문법 요소를 사용해서 추상화를 구현한다.
- 추상화는 객체 지향 설계에서 핵심적인 개념으로, 공통성과 본질을 추출하는 작업이다.
- 복잡한 현실을 단순화하여 코드의 재사용성, 유연성, 유지보수성을 높인다.
- 자바에서는 추상 클래스와 인터페이스를 통해 추상화를 실현한다.
- 행위 중심 추상화와 데이터 중심 추상화를 필요에 따라 구분하여 설계할 수 있다.
2. abstract 제어자
- abstract 키워드란?
Java에서 abstract 키워드는 "미완성"을 나타내는 제어자이다. 이 키워드는 추상 클래스(abstract class)와 추상 메서드(abstract method)를 정의할 때 사용된다.
- abstract method : 메서드 시그니처만 존재하고, 본문(메서드 바디)이 없는 메서드
- abstract class : 하나 이상의 추상 메서드를 포함하거나, 객체 생성을 제한하기 위해 선언된 클래스
abstract class AbstractExample {
abstract void start(); // 추상 메서드
}
2 - 2. abstract의 특징
- abstract 메서드
- 메서드의 본문이 없는 미완성 메서드이다.
- 구현이 없기 때문에 하위 클래스에서 반드시 오버라이딩(Override)해야 한다.
- abstract 클래스
- 추상 메서드를 포함하거나, 직접 객체 생성을 막기 위해 사용한다.
- 불완전한 설계도의 역할을 하며, 이를 상속받는 하위 클래스가 구체적인 구현을 담당한다.
2 -3. abstract 정리
- abstract는 "미완성"의 의미로, 구체적인 구현 없이 설계만 정의할 때 사용한다.
- 추상 메서드는 메서드 바디 없이 선언만 되어 있으며, 반드시 하위 클래스에서 구현해야 한다.
- 추상 클래스는 불완전한 설계도로서 객체 생성이 불가능하며, 상속을 통해 완성된다.
- 공통적인 설계는 추상 클래스로 정의하고, 실제 동작은 하위 클래스에 위임함으로써 유연하고 확장성 있는 구조를 만들 수 있다.
3. 추상 클래스
- 추상클래스란
Java에서 추상 클래스란 0개 이상의 추상 메서드(메서드의 바디가 없는 메서드)를 포함하거나 객체 생성을 제한하기 위해 선언된 클래스이다. abstract 키워드를 사용하여 정의하며, 직접 객체를 생성할 수 없다. 추상 클래스는 다음과 같은 특징을 가진다.
- 추상 메서드를 0개 이상 포함할 수 있다
- 직접 인스턴스를 생성할 수 없다.
- 완성된 메서드(일반 메서드)도 함께 포함할 수 있다.
- 상속을 통해 하위 클래스에서 추상 메서드를 오버라이딩하여 완성해야 사용할 수 있다.
abstract class AbstractExample {
abstract void method(); // 추상 메서드
public void method2() {
System.out.println("완성된 메서드도 정의 가능");
}
}
3 - 1. 추상 클래스의 사용 목적
3 - 1 - 1. 상속 구조에서 유연한 설계를 위해 사용
추상 클래스는 상속 구조에서 공통적인 속성과 기능을 미리 정의하고, 각 하위 클래스가 구체적인 구현을 담당하도록 하는 데 유리하다. 이렇게 하면 변경에 유연하게 대응할 수 있고, 코드의 중복도 줄일 수 있다.
3 - 1 - 2. 공통적인 기능을 강제하기 위한 설계 도구
추상 클래스에 선언된 추상 메서드는 하위 클래스에서 반드시 구현해야 하므로, 공통된 동작을 하위 클래스에 강제할 수 있다. 추상 클래스를 직접 인스턴스화할 수는 없지만, 하위 클래스에서 구현 후에는 인스턴스 생성이 가능하다.
3 - 2. 추상 클래스 vs 일반 클래스
| 항목 | 추상 클래스 | 일반 클래스 |
|---|---|---|
| 인스턴스 생성 | 불가 | 가능 |
| 추상 메서드 포함 여부 | 가능 | 불가능 |
| 상속 여부 | 상속 전제 필요 | 상속 선택 가능 |
| 용도 | 공통 구조 설계 | 구체 기능 구현 |
3 - 3. 추상화와 추상 클래스
- 추상 클래스는 객체지향 프로그래밍의 핵심 원칙 중 하나인 추상화(abstraction)를 실현하는 데 중요한 역할을 한다.
- 공통 속성과 기능을 상위 클래스로 정의하고 상황에 따라 다른 동작을 하위 클래스에 위임함으로써, 유지보수와 확장에 유리한 구조를 만들 수 있다.
3 - 4. 추상 클래스 정리
- 추상 클래스는 미완성 설계도로, 0개 이상의 추상 메서드를 포함하거나 객체 생성을 막기 위해 사용된다.
- 추상 클래스는 직접 인스턴스를 만들 수 없고, 상속을 통해 하위 클래스가 구현을 완성해야만 객체 생성이 가능하다.
- 추상 클래스는 상속과 추상화 구조를 동시에 설계할 수 있는 강력한 도구로, 객체지향 시스템의 유연성과 재사용성을 높인다.
4. final 키워드
- final은 Java에서 "변경 불가" 또는 "확장 불가"의 의미를 가지는 제어자이다. 이 키워드는 클래스, 메서드, 변수에 사용할 수 있으며, 사용하는 위치에 따라 의미가 달라진다. final은 결국 대상의 변경이나 확장 자체를 금지하는 키워드라는 점에서 공통적인 성격을 가진다.
| 위치 | 의미 |
|---|---|
| 클래스 | 상속이 불가능한 클래스 |
| 메서드 | 오버라이딩이 불가능한 메서드 |
| 변수 | 값 변경이 불가능한 (static이 붙는다면) 상수 (한번만 할당 가능) |
4 - 1. final 변수
- 초기화 이후 값 변경 불가
- 선언 시 반드시 값을 할당하거나 생성자에서 한 번만 초기화 가능
4 - 2. final 메서드
- 메서드가 하위 클래스에서 재정의(overriding)되지 않도록 막는다.
- 보안 또는 설계 목적으로 메서드의 구현을 고정하고자 할 때 사용한다.
4 - 3. final 클래스
- 클래스가 상속되지 않도록 제한한다. 예) java.lang.String, java.lang.Math 등
4 - 4. 정리
- final은 수정 또는 확장 금지를 의미하는 제어자이다.
- 클래스, 메서드, 변수 어디에 붙는지에 따라 구체적인 제약이 달라진다.
- 설계의 안정성, 보안성, 유지보수성을 높이기 위해 자주 사용된다.
5. 인터페이스
- 자바에서 추상화를 구현하기 위한 가장 기본적이면서도 강력한 도구이다. 인터페이스는 객체들이 서로 상호작용할 수 있도록 돕는 약속된 규격을 정의하는 장치이다.
- interface는 클래스가 반드시 구현해야 할 기능의 목록(추상 메서드)만 정의한다.
- 기본적으로 모든 메서드는 public abstract, 모든 필드는 public static final로 간주된다.
- 구현체 클래스는 인터페이스에 정의된 모든 메서드를 반드시 구현해야 한다.
- 인터페이스는 다중 구현이 가능하다.
5 - 1. 인터페이스의 기본 구조
- 모든 필드는 자동으로 public static final로 처리되며, 생략 가능
- 모든 메서드는 자동으로 public abstract로 처리되며, 생략 가능
- 메서드 바디는 가질 수 없다. (단, Java 8 이후부터는 default, static 메서드 허용)
5 - 2. 인터페이스의 구현
- 인터페이스는 인스턴스를 생성할 수 없으며, 반드시 구현체 클래스가 인터페이스를 구현해야 한다. implements 키워드를 사용하여 구현하며 인터페이스에 정의된 모든 추상 메서드를 반드시 오버라이딩해야 한다.
5 - 3. 인터페이스의 다중 구현
- 자바는 클래스 간 다중 상속을 허용하지 않지만, 인터페이스는 여러 개를 동시에 구현할 수 있다.
5 - 4. 추상 클래스 vs 인터페이스
| 항목 | 추상 클래스 | 인터페이스 |
|---|---|---|
| 인스턴스 생성 | 불가능 | 불가능 |
| 상속/구현 키워드 | extends | implements |
| 다중 구현 | 불가능 | 가능 |
| 멤버 구성 | 필드, 생성자. 메서드 등 모두 가능 | 추상 메서드, 상수(Java 8 이후 default/static 메서드 가능) |
| 사용 목적 | 공통 로직 공유 + 강제 구현 | 강제 구현 중심, 역할 명세 |
5 - 5. 인터페이스의 장점
5 - 5 - 1. 역할과 구현의 분리로 인한 유연성

- 인터페이스를 사용하면 사용자는 실제 구현 클래스의 변경이나 교체와 무관하게 기능을 사용할 수 있다. 이는 유지보수성과 확장성 측면에서 큰 장점이며, 시스템이 커질수록 효과가 더 커진다.
5 - 6. 인터페이스 요약
- 인터페이스는 기능 명세의 집합으로 다형성과 느슨한 결합을 위한 핵심 수단이다.
- 모든 클래스는 여러 인터페이스를 구현할 수 있어, 자바의 단일 상속의 한계를 극복할 수 있다.
- 인터페이스를 잘 활용하면 유지보수성과 재사용성이 높은 코드 구조를 설계할 수 있다.
6. 추상 클래스 vs 인터페이스 : 선택 기준과 활용 전략
6 - 1. 추상 클래스와 인터페이스의 개념 비교
- 추상 클래스 (Abstract Class)
- 메서드 바디가 없는 추상 메서드(abstract method)를 0개 이상 포함할 수 있는 클래스
- 공통 속성(필드)와 기본 기능(구현된 메서드)을 함께 정의할 수 있음
- 단일 상속만 가능하며, extends 키워드를 사용
- 인터 페이스(Interface)
- 상수(public static final 필드)와 추상 메서드(public abstract 메서드)로만 구성된 일종의 계약서
- 다중 구현이 가능하며, implements 키워드를 사용
- Java 8부터는 default/static 메서드를 통해 일부 구현도 가능
6 - 2. 언제 추상 클래스를 사용할까?
- 공통 속성과 기본 기능이 필요한 경우
- 일관된 기본 동작 제공 + 자식 클래스 확장 허용
- 공통 로직을 제공하면서도, 일부 메서드는 자식 클래스에서 반드시 구현하도록 강제 가능
- 단일 상속 구조가 적절한 경우
- 상속 계층이 명확하게 정해져 있을 때 사용
6 - 3. 언제 인터페이스를 사용할까?
- 동작(기능)만 정의하고 구현은 위임하고 싶을 때
- 여러 타입에 동일한 기능을 강제하고 싶을 때
- 하나의 클래스가 여러 역할을 수행하도록 허용
- 다중 구현이 필요한 경우
- 클래스는 하나만 상속할 수 있지만, 여러 인터페이스는 구현 가능
6 - 4. 추상 클래스 vs 인터페이스 : 정리 표
| 구분 | 추상 클래스 | 인터페이스 |
| 사용 키워드 | extends | implements |
| 상속 수 | 단일 상속만 가능 | 다중 구현 가능 |
| 구성 요소 | 필드, 구현 메서드, 추상 메서드 | 상수, 추상 메서드(default/static 가능) |
| 용도 | 공통된 상태와 기능 제공 | 동작 규칙 정의 및 구현 강제 |
| 예시 관계 | is-a | can-do |
- 상속 계층 설계가 필요하다면 → 추상 클래스
- 역할(기능)만 정의하고 구현은 위임하고 싶다면 → 인터페이스
| 상황 | 추상클래스 | 인터페이스 |
| "is-a"관계 (상속 기반) | ✅ 사용 적합 | ❌ |
| "can-do" 관계 (기능 부여) | ❌ | ✅ 사용 적합 |
| 공통된 상태(필드)를 함께 정의하고 싶을 때 | ✅ 가능 | ❌ (불가) |
| 공통된 기능(메소드)만 정의하고 싶을 때 | 가능 | ✅ 더 적합 |
| 단일 상속 구조 | ✅ 적합 | ✅ 가능 |
| 다중 타입 구현 필요 (다중 상속) | ❌ | ✅ 가능 |
| 개념 | 의미 | 설명 | 예시 |
| is-a | 상속 | A는 B의 일종이다 | Cat is-a Animal |
| has-a | 포함 (컴포지션) | A는 B를 가진다 | Car has-a Engine |
| can-do | 행위 능력 (인터페이스) | A는 어떤 행동을 할 수 있다 | Bird can-do Flyable |
'자바 고급(JAVA)' 카테고리의 다른 글
| SOLID 원칙 - OCP(Open/Closed Principle) (0) | 2026.05.14 |
|---|---|
| SOLID 원칙 - SRP(단일 책임의 원칙) (0) | 2026.05.14 |
| 객체지향 프로그래밍의 4가지 핵심 개념 - 다형성(Polymorphism) (0) | 2026.05.12 |
| 객체지향 프로그래밍의 4가지 핵심 개념 - 캡슐화(Encapsulation) (0) | 2026.05.12 |
| 객체지향 프로그래밍의 4가지 핵심 개념 - 상속(Inheritance) (0) | 2026.05.12 |