OOP - Abstraction(추상화)이란 무엇이며 왜 사용하는가?

 

OOP 추상화란 무엇인가? 

(감독비유와 애니원화비유로 쉽게 풀어보기)

https://ko.wikipedia.org/wiki/%EC%B6%94%EC%83%81%ED%99%94_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)

https://velog.io/@minthug94_/%EC%B6%94%EC%83%81%ED%99%94-Abstraction

oop 프로그래밍에서 클래스는 흔히 설계도라고 표현한다.

그 설계도를 구현화 하는게 인스턴스화 한다 라고 전문용어로 부른다



추상화의 어원

abstract



그렇다면 추상 클래스는 뭘까? 

바로 구체적인 구현은 없지만 전체적인 청사진을 잡아주는 클래스다.


다시말해 비추상클래스 즉 abstract키워드가 있는 클래스는 

생성자함수가 없어서 설계도를 구현하는 결과인 인스턴스화를 할수가 없다


좀더 알기 쉽게 비유하자면 


추상클래스는 마치 만들어는 놓지만 영화관에 상영은 안하는 영상물처럼 비유한다

구체적인 구현과정= 즉 제작 은 이후의 자식들(자식클래스/부하클래스)들에게 맡긴다


여기서 우리는 개발자를 변호사이자 영화감독 또는 애니감독으로도 비유할 수 있다.

  • 변호사는 법을 찾아보고 정리한다. → 개발자는 코드의 규칙을 만든다.

  • 영화감독은 한 장면, 한 장면을 머릿속에 담아둔다. → 개발자는 프로그램의 큰 그림을 구상한다.


봉준호 감독의 스타일과 추상화 클래스

봉준호 감독님은 영화계에서 디테일한 콘티 작업으로 유명하다.
영화 제작 초반부터 **스토리보드(콘티)**를 철저하게 짜서 현장 스텝들과 구상을 공유한다.

  • 디테일한 콘티 작업
    “봉테일”이라는 별명처럼, 장면 하나하나를 매우 치밀하게 준비한다. 덕분에 프리 단계에서 이미 편집과 연출의 그림이 나온다.

  • 철저한 사전 계획
    러프한 밑그림부터 촬영, 후반작업까지 전체 과정을 치밀하게 통제한다. 그래서 영화의 모든 요소가 유기적으로 결합된다.

개발자도 프로그램을 설계할 때 이와 비슷하다.
추상화 클래스는 감독이 미리 짜둔 콘티 같은 것이다.

마치 애니메이션 제작 과정에서 **제1원화(러프 원화)**가 있듯, 추상 클래스는 전체적인 방향과 흐름을 잡아주는 밑그림이다.
세세한 색칠과 디테일은 제작진(=자식 클래스)이 채워 넣는다.


자바에서 추상 클래스란?

정의부터 정리해보자.

  • 객체를 생성할 수 없는 클래스, 미완성 클래스

  • 구현이 없는 메소드(추상 메소드)를 포함하는 클래스

즉, 청사진 역할만 하는 클래스다.

1. 추상 메소드 선언 방법

접근제어자 abstract 리턴타입 메소드();

2. 추상 클래스의 특징

  • 추상 메소드와 일반 메소드를 모두 가질 수 있다.

  • abstract 예약어를 클래스 선언부에 붙여야 한다.

  • 객체 생성이 불가능하다 → 즉, new로 바로 만들 수 없다.

  • 생성자가 없다 → 힙 메모리에 올라갈 일이 없다.

  • 하지만 상위 클래스로서 존재 자체가 중요하다.


추상 클래스와 상속 관계

1차적으로 추상 클래스를 상속받는 자식 클래스는 에러가 발생한다.
왜냐하면 부모의 추상 메소드를 그대로 물려받아버리기 때문이다.

  • 해결 방법은 2가지

    1. 자식 클래스도 추상으로 선언하기
      → 하지만 이렇게 하면 결국 자식도 쓸 수 없게 된다.

    2. 부모의 추상 메소드를 자식 클래스에서 모두 오버라이딩하기
      → 이게 일반적으로 우리가 사용하는 방법이다.


코드 예제

package chap09.oop.poly;

public class AbstractTest {
    public static void main() {
        // 메인 메소드에서 매개변수 굳이 넣어야 할까?
    }
}

abstract class SuperA {
    public void test() {
        System.out.println();
    }
    
    public abstract void run();
}

class SubA extends SuperA {
    @Override
    public void run() {
        // TODO Auto-generated method stub
    }
}

정리

추상화란 결국 큰 그림을 그리는 것이다.
개발자는 봉준호 감독처럼 프로그램을 완성하기 전에 **콘티(추상 클래스)**를 만들어둔다.

  • 추상 클래스 = 봉준호 감독의 콘티

  • 추상 메소드 = 아직 채워지지 않은 장면 연출

  • 자식 클래스 = 실제로 영화를 만드는 제작진

애니메이션의 제1원화처럼, 추상 클래스는 완성은 아니지만 전체 그림을 이해할 수 있는 뼈대다.
구현은 뒤에 하지만, 이 단계가 없으면 완성도 있는 프로그램(=영화)은 나올 수 없다.


👉 그러니 추상화는 어렵게 생각할 필요 없다.
“추상 클래스즉, abstract클래스는 감독의 콘티, 원화다” 이렇게 기억하면 된다.

댓글

가장 많이 본 글