본문 바로가기

언어공부/Java

자바 추상 클래스(Abstract Class), 추상 메소드(Abstract Method)

자바 추상 클래스(Abstract Class)에 대해서 알아보자.

추상 클래스(Abstract Class)

클래스를 설계도에 비유한다면, 추상 클래스는 미완성 설계도에 비유할 수 있다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상 클래스로 인스턴스는 생성할 수 없다. 추상클래스 자체로는 클래스로서의 역할을 다 못하지만, 새로운 클래스를 작성하는데 있어서 바탕이 되는 조상 클래스로서 중요한 의미를 갖는다. 추상클래스가 필요한 이유는 공통부분을 가진 미완성 설계도를 만들어 놓고, 이 클래스를 이용해서 각각의 설계도를 완성해 효율적이게 된다.

 

추상클래스 키워드는 "abstract"을 붙이면 된다. 추상클래스는 추상메소드를 포함하고 있다는 것을 제외하고는 일반클래스와 전혀 다르지 않다. 추상 클래스에도 생성자가 있으며, 멤버변수와 메소드도 가질 수 있다.

 

상속이 자손클래스를 만드는데 조상클래스를 사용하는 것이라면, 이와 반대로 추상화는 기존의 클래스의 공통부분을 뽑아내서 조상클래스를 만드는 것이라고 할 수 있다. 

 


추상 메소드(Abstract Method)

추상메소드는 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것이 추상메소드이다. 메소드를 미완성 상태로 남겨놓는 이유는 메소드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상클래스에서는 선언부만 작성하고, 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지 알려주고, 실제내용은 상속받는 클래스에서 구현하도록 비워두는 것이다.

 

추상메소드 키워드는 "abstract"을 붙이면 된다. 그리고 구현부가 없으므로 괄호{}대신 세미콜론(;)을 적어준다. 추상클래스로부터 상속받는 자손일반클래스는 오버라이딩을 통해 조상인 추상클래스의 추상메소드를 모두 구현해주어야 한다. 만일 조상으로부터 상속받은 추상메소드 중 하나라도 구현하지 않는다면, 자손클래스 역시 추상클래스로 지정해주어야 한다. 만약 추상클래스가 추상클래스를 상속받는다면 오버라이딩 할 필요가 없다.

 

ex)

추상클래스는 객체를 생성할 수 없다.

ex)

추상클래스가 추상클래스를 상속받을 때는 오버라이딩을 안해도 된다. 일반클래스가 추상클래스를 상속받을 때 오버라이딩 필요.
상속관계이기 때문에 업캐스팅도 가능하다.

 

출력화면

 

ex)

net.abc.model패키지의 추상 클래스 ShapeClass 

 

net.abc.model2패키지의 추상클래스 ShapeClass를 상속한 일반 클래스 Circ. 이렇게 Rect와 Tria 클래스도 따로 만들었다.

 

import할 패키지 및 클래스들.

 

해당 패키지의 클래스들을 import했기 때문에 ShapeClass 및 Circ, Rect, Tria 클래스들을 사용할 수 있다. 첫 번째는 ShapeClass타입 ref참조변수를 선언해 각 도형(Circ, Rect, Tria)인스턴스 들을 생성해 업캐스팅한 후, draw()메소드를 호출하면 각 클래스에 맞게 오버라이딩 된 함수가 호출된다.

 

두 번째는 ShapeClass타입의 추상클래스 배열을 생성해 각 배열에 도형 인스턴스들을 대입해 각 배열마다 draw()메소드를 호출해 각 클래스에 맞는 오버라이딩 된 함수가 호출된다.(arr[0]=new Circ();에서 업캐스팅 된다.)

 

세 번째는 static void dr(ShapeClass ref){}메소드를 따로 정의해서 각 매개변수에 대한 draw()메소드를 호출해 각 클래스에 맞는 오버라이딩 된 함수가 호출된다.

 

출력화면

 

세 개의 방법 모두 같은 결과를 출력한다.