자바 고급(JAVA)

객체지향 프로그래밍의 4가지 핵심 개념 - 추상화(Abstraction)

beginner-development 2026. 5. 13. 21:41

1. 추상화란?

- "추상"의 사전적 정의는 사물이나 개념의 공통적인 본질을 추출하여 단순화하는 것이며, 자바에서의 추상화는 객체들의 공통적인 속성과 기능을 뽑아 상위 클래스로 정의하는 작업이다. 추상화를 통해 현실 세계의 복잡한 개념을 단순하고 명확하게 모델링할 수 있다.

(예 : 자동차와 오토바이의 공통 기능(전진, 후진, 정지)을 추출해 Vehicle이라는 상위 클래스를 만들 수 있다.)

1 - 2. 추상화의 필요성

  1. 복잡한 시스템을 단순하게 표현할 수 있다.
    • 핵심 요소만 모델링하여 시스템의 이해도를 높인다.
  2. 공통점을 기준으로 설계하면 코드 재사용성이 높아진다.
    • 중복 코드 제거, 유지보수 비용 절감
  3. 유연한 구조 설계가 가능하다.
    • 구체 구현에 의존하지 않고 인터페이스 기반 설계 가능
  4. 기능 확장과 교체가 용이하다.
    • 새로운 클래스가 기존 구조를 따르기만 하면 호환 가능

1 - 3. 추상화를 구현하는 방법

- 자바에서는 추상 클래스인터페이스를 통해 추상화를 구현한다.

  • 추상 클래스(abstract class) : 공통 속성과 일부 구현 메서드를 포함할 수 있다.
  • 인터페이스(interface) : 공통 행위만 정의한다. (자바 8 이후 default 메서드의 추가가 가능해졌다.)

1 - 4. 추상화 유형

1 - 4 - 1. 행위 중심 추상화

  • 객체가 수행해야 할 "기능"에 초점을 맞춘 추상화
  • 예) 자동차와 전자기기에서의 "전원켜기", "작동하기" 등의 메서드 정의

1 - 4 -2. 데이터 중심 추상화

  • 객체가 가져야할 "데이터"에 초점을 맞춘 추상화
  • 예) DTO, VO 객체에서 이름, 나이, 성별 등의 필드 정의

1 - 5. 추상화 정리

- 상속이 하위 클래스를 정의하는데 상위 클래스를 사용하는 것이라고 한다면 추상화는 반대로 기존 클래스들의 공통적인 요소들을 뽑아서 상위 클래스를 만들어 내는 것이라고 할 수 있다. 사실 방법에 있어서는 상향식과 하향식 설계 모두 크게 상관이 없다. 즉, 공통적인 속성과 기능을 저으이하고 하위 클래스들을 생성할 수도 있고, 반대로 하위 클래스들의 공통성을 모아 상위 클래스를 정의할 수 있는 것이다. 이렇게

공통적인 속성과 기능을 모아서 정의해 주면 코드의 중복을 줄일 수 있고, 보다 효과적으로 클래스 간의 관계를 설정할 수 있으며, 유지/보수가 용이해 진다. 자바에서는 주로 추상 클래스인터페이스라는 문법 요소를 사용해서 추상화를 구현한다.

  1. 추상화는 객체 지향 설계에서 핵심적인 개념으로, 공통성과 본질을 추출하는 작업이다.
  2. 복잡한 현실을 단순화하여 코드의 재사용성, 유연성, 유지보수성을 높인다.
  3. 자바에서는 추상 클래스인터페이스를 통해 추상화를 실현한다.
  4. 행위 중심 추상화데이터 중심 추상화를 필요에 따라 구분하여 설계할 수 있다.

2. abstract 제어자

- abstract 키워드란?

Java에서 abstract 키워드는 "미완성"을 나타내는 제어자이다. 이 키워드는 추상 클래스(abstract class)추상 메서드(abstract method)를 정의할 때 사용된다.

  • abstract method : 메서드 시그니처만 존재하고, 본문(메서드 바디)이 없는 메서드
  • abstract class : 하나 이상의 추상 메서드를 포함하거나, 객체 생성을 제한하기 위해 선언된 클래스

abstract class AbstractExample {
abstract void start(); // 추상 메서드
}

2 - 2. abstract의 특징

  1. abstract 메서드
    • 메서드의 본문이 없는 미완성 메서드이다.
    • 구현이 없기 때문에 하위 클래스에서 반드시 오버라이딩(Override)해야 한다.
  2. abstract 클래스
    • 추상 메서드를 포함하거나, 직접 객체 생성을 막기 위해 사용한다.
    • 불완전한 설계도의 역할을 하며, 이를 상속받는 하위 클래스가 구체적인 구현을 담당한다.

2 -3. abstract 정리

  1. abstract는 "미완성"의 의미로, 구체적인 구현 없이 설계만 정의할 때 사용한다.
  2. 추상 메서드는 메서드 바디 없이 선언만 되어 있으며, 반드시 하위 클래스에서 구현해야 한다.
  3. 추상 클래스는 불완전한 설계도로서 객체 생성이 불가능하며, 상속을 통해 완성된다.
  4. 공통적인 설계는 추상 클래스로 정의하고, 실제 동작은 하위 클래스에 위임함으로써 유연하고 확장성 있는 구조를 만들 수 있다.

3. 추상 클래스

- 추상클래스란

Java에서 추상 클래스란 0개 이상의 추상 메서드(메서드의 바디가 없는 메서드)를 포함하거나 객체 생성을 제한하기 위해 선언된 클래스이다. abstract 키워드를 사용하여 정의하며, 직접 객체를 생성할 수 없다. 추상 클래스는 다음과 같은 특징을 가진다.

  1. 추상 메서드를 0개 이상 포함할 수 있다
  2. 직접 인스턴스를 생성할 수 없다.
  3. 완성된 메서드(일반 메서드)도 함께 포함할 수 있다.
  4. 상속을 통해 하위 클래스에서 추상 메서드를 오버라이딩하여 완성해야 사용할 수 있다.

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. 추상 클래스 정리

  1. 추상 클래스는 미완성 설계도로, 0개 이상의 추상 메서드를 포함하거나 객체 생성을 막기 위해 사용된다.
  2. 추상 클래스는 직접 인스턴스를 만들 수 없고, 상속을 통해 하위 클래스가 구현을 완성해야만 객체 생성이 가능하다.
  3. 추상 클래스는 상속과 추상화 구조를 동시에 설계할 수 있는 강력한 도구로, 객체지향 시스템의 유연성재사용성을 높인다.

4. final 키워드

- final은 Java에서 "변경 불가" 또는 "확장 불가"의 의미를 가지는 제어자이다. 이 키워드는 클래스, 메서드, 변수에 사용할 수 있으며, 사용하는 위치에 따라 의미가 달라진다. final은 결국 대상의 변경이나 확장 자체를 금지하는 키워드라는 점에서 공통적인 성격을 가진다.

위치 의미
클래스 상속이 불가능한 클래스
메서드 오버라이딩이 불가능한 메서드
변수 값 변경이 불가능한 (static이 붙는다면) 상수 (한번만 할당 가능)

4 - 1. final 변수

- 초기화 이후 값 변경 불가

- 선언 시 반드시 값을 할당하거나 생성자에서 한 번만 초기화 가능

4 - 2. final 메서드

- 메서드가 하위 클래스에서 재정의(overriding)되지 않도록 막는다.

- 보안 또는 설계 목적으로 메서드의 구현을 고정하고자 할 때 사용한다.

4 - 3. final 클래스

- 클래스가 상속되지 않도록 제한한다. 예) java.lang.String, java.lang.Math

4 - 4. 정리

  1. final수정 또는 확장 금지를 의미하는 제어자이다.
  2. 클래스, 메서드, 변수 어디에 붙는지에 따라 구체적인 제약이 달라진다.
  3. 설계의 안정성, 보안성, 유지보수성을 높이기 위해 자주 사용된다.

5. 인터페이스

- 자바에서 추상화를 구현하기 위한 가장 기본적이면서도 강력한 도구이다. 인터페이스는 객체들이 서로 상호작용할 수 있도록 돕는 약속된 규격을 정의하는 장치이다.

  1. interface는 클래스가 반드시 구현해야 할 기능의 목록(추상 메서드)만 정의한다.
  2. 기본적으로 모든 메서드는 public abstract, 모든 필드는 public static final로 간주된다.
  3. 구현체 클래스는 인터페이스에 정의된 모든 메서드를 반드시 구현해야 한다.
  4. 인터페이스는 다중 구현이 가능하다.

5 - 1. 인터페이스의 기본 구조

  1. 모든 필드는 자동으로 public static final로 처리되며, 생략 가능
  2. 모든 메서드는 자동으로 public abstract로 처리되며, 생략 가능
  3. 메서드 바디는 가질 수 없다. (단, 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. 인터페이스 요약

  1. 인터페이스는 기능 명세의 집합으로 다형성과 느슨한 결합을 위한 핵심 수단이다.
  2. 모든 클래스는 여러 인터페이스를 구현할 수 있어, 자바의 단일 상속의 한계를 극복할 수 있다.
  3. 인터페이스를 잘 활용하면 유지보수성과 재사용성이 높은 코드 구조를 설계할 수 있다.

6. 추상 클래스 vs 인터페이스 : 선택 기준과 활용 전략

6 - 1. 추상 클래스와 인터페이스의 개념 비교

  1. 추상 클래스 (Abstract Class)
    • 메서드 바디가 없는 추상 메서드(abstract method)를 0개 이상 포함할 수 있는 클래스
    • 공통 속성(필드)기본 기능(구현된 메서드)을 함께 정의할 수 있음
    • 단일 상속만 가능하며, extends 키워드를 사용
  2. 인터 페이스(Interface)
    • 상수(public static final 필드)추상 메서드(public abstract 메서드)로만 구성된 일종의 계약서
    • 다중 구현이 가능하며, implements 키워드를 사용
    • Java 8부터는 default/static 메서드를 통해 일부 구현도 가능

6 - 2. 언제 추상 클래스를 사용할까?

  1. 공통 속성과 기본 기능이 필요한 경우
  2. 일관된 기본 동작 제공 + 자식 클래스 확장 허용
    • 공통 로직을 제공하면서도, 일부 메서드는 자식 클래스에서 반드시 구현하도록 강제 가능
  3. 단일 상속 구조가 적절한 경우
    • 상속 계층이 명확하게 정해져 있을 때 사용

6 - 3. 언제 인터페이스를 사용할까?

  1. 동작(기능)만 정의하고 구현은 위임하고 싶을 때
  2. 여러 타입에 동일한 기능을 강제하고 싶을 때
    • 하나의 클래스가 여러 역할을 수행하도록 허용
  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