OOP - Abstraction(추상화)이란 무엇이며 왜 사용하는가?
OOP 추상화란 무엇인가?
(감독비유와 애니원화비유로 쉽게 풀어보기)
oop 프로그래밍에서 클래스는 흔히 설계도라고 표현한다.
그 설계도를 구현화 하는게 인스턴스화 한다 라고 전문용어로 부른다
추상화의 어원
abstract
그렇다면 추상 클래스는 뭘까?
바로 구체적인 구현은 없지만 전체적인 청사진을 잡아주는 클래스다.
다시말해 비추상클래스 즉 abstract키워드가 있는 클래스는
생성자함수가 없어서 설계도를 구현하는 결과인 인스턴스화를 할수가 없다
좀더 알기 쉽게 비유하자면
추상클래스는 마치 만들어는 놓지만 영화관에 상영은 안하는 영상물처럼 비유한다
구체적인 구현과정= 즉 제작 은 이후의 자식들(자식클래스/부하클래스)들에게 맡긴다
여기서 우리는 개발자를 변호사이자 영화감독 또는 애니감독으로도 비유할 수 있다.
변호사는 법을 찾아보고 정리한다. → 개발자는 코드의 규칙을 만든다.
영화감독은 한 장면, 한 장면을 머릿속에 담아둔다. → 개발자는 프로그램의 큰 그림을 구상한다.
봉준호 감독의 스타일과 추상화 클래스
봉준호 감독님은 영화계에서 디테일한 콘티 작업으로 유명하다.
영화 제작 초반부터 **스토리보드(콘티)**를 철저하게 짜서 현장 스텝들과 구상을 공유한다.
디테일한 콘티 작업
“봉테일”이라는 별명처럼, 장면 하나하나를 매우 치밀하게 준비한다. 덕분에 프리 단계에서 이미 편집과 연출의 그림이 나온다.철저한 사전 계획
러프한 밑그림부터 촬영, 후반작업까지 전체 과정을 치밀하게 통제한다. 그래서 영화의 모든 요소가 유기적으로 결합된다.
개발자도 프로그램을 설계할 때 이와 비슷하다.
추상화 클래스는 감독이 미리 짜둔 콘티 같은 것이다.
마치 애니메이션 제작 과정에서 **제1원화(러프 원화)**가 있듯, 추상 클래스는 전체적인 방향과 흐름을 잡아주는 밑그림이다.
세세한 색칠과 디테일은 제작진(=자식 클래스)이 채워 넣는다.
자바에서 추상 클래스란?
정의부터 정리해보자.
객체를 생성할 수 없는 클래스, 미완성 클래스
구현이 없는 메소드(추상 메소드)를 포함하는 클래스
즉, 청사진 역할만 하는 클래스다.
1. 추상 메소드 선언 방법
접근제어자 abstract 리턴타입 메소드();
2. 추상 클래스의 특징
추상 메소드와 일반 메소드를 모두 가질 수 있다.
abstract예약어를 클래스 선언부에 붙여야 한다.객체 생성이 불가능하다 → 즉, new로 바로 만들 수 없다.
생성자가 없다 → 힙 메모리에 올라갈 일이 없다.
하지만 상위 클래스로서 존재 자체가 중요하다.
추상 클래스와 상속 관계
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클래스는 감독의 콘티, 원화다” 이렇게 기억하면 된다.
댓글
댓글 쓰기