본문으로 건너뛰기
Advertisement

7.4 추상화와 인터페이스 (Abstraction & Interface)

객체지향 설계에서 추상화(Abstraction) 란 복잡한 현실 세계를 프로그램으로 모델링할 때, 불필요한 세부 사항은 숨기고 핵심적인 공통 속성과 기능만을 추출 하여 뼈대를 만드는 작업입니다.

자바에서는 이러한 추상화를 구현하기 위해 두 가지 주요 도구를 제공합니다:

  1. 추상 클래스 (Abstract Class)
  2. 인터페이스 (Interface)

1. 추상 클래스 (Abstract Class)

추상 클래스는 미완성 설계도와 같습니다. 구체적으로 어떻게 동작해야 할지 아직 완벽히 정해지지 않은(구현되지 않은) 메서드를 포함하고 있는 클래스입니다.

어떤 클래스에 미완성 메서드(추상 메서드)가 하나라도 있다면, 그 클래스는 반드시 추상 클래스가 됩니다.

// abstract 키워드를 사용하여 추상 클래스임을 명시
abstract class Player {
int currentPos; // 현재 위치 (일반 변수 가질 수 있음)

Player() { // 생성자도 가질 수 있음
currentPos = 0;
}

// 기능은 선언부만 있고 중괄호 {} 구현부가 없는 추상 메서드
abstract void play(int pos);
abstract void stop();

// 구현이 완료된 일반 메서드도 가질 수 있음
void play() {
play(currentPos);
}
}

추상 클래스의 특징

  • abstract 키워드가 붙은 클래스는 직접 객체(인스턴스)를 생성할 수 없습니다.(new Player(); 불가)
  • 상속을 통해서만 자식 클래스에서 완성될 수 있습니다. (자식 클래스는 물려받은 모든 추상 메서드를 강제로 오버라이딩 하여 구현해야 합니다.)
  • 관련된 클래스들 사이에 공통된 뼈대를 제공하면서도, 일부 기능은 자식들에게 구현을 위임할 때 사용합니다.

2. 인터페이스 (Interface)

인터페이스(Interface) 는 빈 껍데기와 같습니다. 추상 클래스보다 더 강력한 추상화를 제공하며, 일반적으로 밑그림만 있는 "기본 설계도" 또는 객체들이 서로 통신하기 위한 "규격(표준 약속)"의 역할을 합니다.

// interface 키워드로 선언
interface Fightable {
// 인터페이스의 모든 상수는 public static final (생략 가능)
int MAX_HP = 100;

// 인터페이스의 모든 메서드는 public abstract (생략 가능, Java 8 이후 default/static 제외)
void attack();
void move(int x, int y);
}

// 인터페이스는 implements 키워드로 구현(상속)합니다.
class Fighter implements Fightable {
// 반드시 모든 추상 메서드를 public으로 오버라이딩 해야 함
@Override
public void attack() {
System.out.println("주먹으로 공격합니다.");
}

@Override
public void move(int x, int y) {
System.out.println(x + ", " + y + " 좌표로 이동합니다.");
}
}

인터페이스의 강력한 특징

  1. 다중 구현 지원: 클래스는 단일 상속(extends)만 되지만, 인터페이스는 여러 개를 동시에 구현(implements A, B, C)할 수 있습니다.
    • class SmartPhone extends Phone implements Camera, MP3Player, GPS { }
  2. 다형성의 극대화: 부모 클래스와 상속 관계가 전혀 없는 완전히 다른 클래스들도, 같은 인터페이스를 구현하고 있다면 그 인터페이스 타입으로 하나로 묶어 관리할 수 있습니다.
  3. 표준화: 프로젝트를 여러 명이 개발할 때 큰 그림을 잡는 인터페이스만 먼저 던져주면, 안의 내용을 어떻게 짜든 상관없이 틀이 딱 맞아떨어져 프로그램 병합이 무척 수월해집니다.

3. 추상 클래스 vs 인터페이스

구분추상 클래스 (abstract class)인터페이스 (interface)
상속/구현extends (단일 상속)implements (다중 구현)
변수 유무일반 멤버 변수 선언 ** 가능**오직 상수(static final)만 선언 가능
메서드추상 메서드 + 일반 구현 메서드 모두 존재 가능기본적으로 모든 메서드가 추상 메서드
목적관련된 클래스들의 ** 공통점을 묶어서 부모 클래스**를 만들 때 (IS-A 관계)서로 상관없는 클래스들에게 ** 동일한 기능(규격)을 부여**할 때 (CAN-DO 관계)

인터페이스와 추상 클래스를 적재적소에 사용하는 것은 자바로 튼튼하고 유연한 소프트웨어를 설계(Architecture)하는 지름길입니다.

Advertisement