ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 추상 클래스는 무엇
    개발/자바 2020. 3. 19. 19:20

    일반적으로 말하는 추상의 의미는 '구체'와 대응된다. 구체적이지 않은 것은 추상적이다. 회화에서의 추상화는 눈에 보이는 사물을 재현하지 않고 눈에 보이지 않는 현실을 순수한 점, 선, 면, 색채 등으로 표현한 그림이다. 컴퓨터 과학에서 말하는 '추상'은 이 느낌과 결이 다르다. 위키백과에 나오는 정의에 따르면 추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려내는 것을 말한다.

     

    객체 지향 프로그래밍은 기본적으로 현실 세계에 가까운 모습으로 프로그램을 구현하는 것이 목표다. 객체 지향 프로그래밍 패러다임은 컴퓨터 프로그램을 단순한 명령어의 집합으로 보지 않고 객체들의 집합으로 파악하고자 하는 것이며 이 '객체'는 결국 전체를 이루는 요소를 말한다. 현실의 어떤 점을 프로그래밍에 반영하기 위해서는 현실을 부분적으로 나누는 작업을 해야 한다.

     

    클래스는 객체의 설계도, 청사진이므로 클래스의 집합은 프로그램의 청사진이 된다. 클래스의 설계는 어떤 부분(부품)을 만들지 정의하는 것과 같다. 클래스를 설계하는 과정에서 데이터를 어떤 이름, 어떤 형태로 담을지(속성), 어떤 행위를 넣을 것인지(메소드)를 정의한다. 클래스를 만드는 근본적인 이유다. 객체 지향 이전에도 함수, 구조체 등을 이용한 구조적 프로그래밍이 존재했지만 프로그램의 규모가 커지고 복잡해지면서 객체 지향이라는 패러다임이 생겼다. 객체 지향 프로그래밍에서는 클래스가 기본 단위가 되고 클래스 안에서 모든 게 시작된다.

     

    클래스를 아무렇게 설계하면 안 된다. 팀원들에게 아무런 사전 약속도 없이 클래스를 작성해 보라고 하면 사람마다 변수명, 메소드 이름이 다를 거다. 같은 기능을 메소드의 이름이 다를 필요가 없다. 일부 클래스에서 공통점을 뽑아낼 수 있다면 뽑아내야 한다. 헬리콥터, 전투기, 여객기 등은 비행기라는 개념으로 묶을 수 있다. 기능적으로도 유사한 부분이 많고 실제로 비행기라는 개념으로 인식한다. SUV, 세단, 왜건, 패스트백 등은 자동차다.

     

    공통점을 한데 모아 놓아 추상 클래스로 만들어 놓는 것은 구현해야 하는 부분을 미리 정한다는 의미다. 자동차는 move(), steer(), brake() 등의 메소드가 예시가 된다. 추상 클래스를 정의하면 필수 기능이 누락되는 일이 줄어들고 다형성의 관점에서 객체를 관리하기 쉬워진다. 자동차와 비행기는 이동 수단이라는 상위 개념으로도 카테고리화할 수 있다. 

     

    자동차, 비행기 혹은 이동 수단 등으로 핵심적인 기능을 간추리는 과정을 추상화라고 하며 기본적이고 핵심적인 기능을 모아둔 클래스가 추상 클래스가 된다. 자바에서는 추상 클래스를 만들 때 abstract를 붙이고 추상 메소드 역시 abstract를 붙인다. 추상 클래스를 상속하는 클래스는 추상 클래스의 추상 메소드를 반드시 오버라이드해야 한다. 

    public abstract class Car {
    	public abstract void move();
    	public abstract void brake();
    	public abstract void steer();
    }
    public class Sedan extends Car {
    	@Override
    	public void move() {
    		
    	}
    
    	@Override
    	public void brake() {
    		
    	}
    
    	@Override
    	public void steer() {
    		
    	}
    }
    public class SUV extends Car {
    	@Override
    	public void move() {
    		
    	}
    
    	@Override
    	public void brake() {
    		
    	}
    
    	@Override
    	public void steer() {
    		
    	}
    }

     

    이런 맥락이 있기 때문에 추상 클래스가 무엇이냐고 물을 때 단순하게 "abstract가 붙은 클래스"라 말하고 턴을 종료하면 안 된다. 문법적으로 틀린 말은 아니지만 충분한 대답이 아니다. 사실 보통은 틀린 대답이 된다. 고작 그 답변을 들으려고 물어본 게 아니니까. 추상화를 거쳐 필수적 혹은 핵심적인 기능과 속성을 간추린 클래스가 추상 클래스고 이 목적을 위해 설계된 클래스에 abstract 키워드를 붙인다. 추상 클래스는 클래스 설계 단계에서 객체로 만들지 않기로 혹은 만들면 안 되는 클래스로 정한 것이기에 abstract를 붙여서 객체화를 막는다.

    댓글

Designed by Tistory.