본문 바로가기

Programming/JAVA

추상 메서드와 추상 클래스 ( abstract )

◼︎ abstract 키워드 - 추상 메서드와 추상 클래스

추상 메서드( abstract method )

간단하게 이야기하자면, 선언부는 존재하나 구현부가 없는 메서드를 칭한다. 추상 메서드를 하나라도 갖고 있는 클래스는 반드시 추상 클래스( Abstract Class )로 선언해야 한다. 추상 메서드 없이도 추상 클래스 선언이 가능하다.

 

다시 한 번 정리하자면, 메서드만 선언된 것으로, 몸체 ' {   } '사이에 코드가 없으며, 상속 받는 클래스에게 강제해 메서드를 구현하도록 하는 것이다.

 

 

하지만 중요한 사실이있다. 추상 클래스는 인스턴스를 생성할 수 없는 클래스이다.

 

 

이처럼 말이다. 그 이유는 클래스가 미완성이기 때문이다. 추상 클래스는 내부적으로 구현되지 않은 클래스이다. 무슨 말이냐. Animal Class에 존재하는 sing( ) 메서드는 구현되어 있지 않아 기능을 수행할 수 없어 생성할 수 없는 것이다.

 

 

반대로 상속받고 있음에도 추상 메서드를 구현하지 않는다면 에러가 발생한다. 추상 클래스는 추상 메서드 구현을 강제하는 것인데, 이를 구현하지 않았기 때문이다.

 

이 내용을 정리해보자면

 

  • 추상 클래스는 인스턴스. 즉, new를 사용해 객체를 만들 수 없습니다.

  • 추상 메서드는 하위 클래스에게 메서드 구현을 강제합니다. 즉, 오버라이딩을 강제합니다.

  • 추상 메서드를 포함하는 클래스는 반드시 추상 클래스여야 합니다.

추상 클래스와 인터페이스, 어떤 것을 사용할까?

큰 차이가 존재한다면, 추상 클래스는 완성되지 않은 것이며 인터페이스는 기본적인 설계도와 같다고 볼 수 있다. 우선 우리가 아는 공통점 먼저 보겠다.

 

이 둘은 모두 상속 받는 클래스의 구현을 강제한다. 하지만 추상 클래스와 인터페이스를 나누어서 사용하는 이유는 둘의 용도가 다르기 때문이다.

 

1. 사용용도의 차이

 

추상 클래스의 만족 조건은  [ A is a kind of B ]라고 볼 수 있다. 반면에 인터페이스는  ' A is able to B' 이다. 정리하자면 추상 클래스는 A가 B의 한 종류인 상속의 조건을 만족하며, 인터페이스는 A가 B를 행할 수 있다는 조건을 만족할 때라는 뜻이다.

 

이와 같이 구분한 이유는 자바의 다중상속 제한때문이다. 자바는 다중상속을 제한하고 있다. 그렇기에 해당 클래스의 분류(구분)을 추상 클래스를 통해하며, 클래스가 행할 수 있는 기능을 인터페이스로 구현한다.

 

2. 공통된 기능의 사용 여부

 

만약 모든 클래스가 인터페이스를 사용한다면, 공통으로 필요한 기능들도 모두 오버라이딩해 재정의하는 번거로움이 존재한다. 이때 해당 공통 기능 구현을 일반 메서드로 구현한 뒤 자식 클래스에서 사용 가능하도록 할 수 있다. 

 

3. 다중구현

 

다중 상속을 지원하지 않는 자바에서 여러 기능을 공통적으로 구현해야할 상황이 오기도 한다. 이때 어떻게 하는가? 인터페이스를 활용해 구현한다.

 

인터페이스는 다중구현이 가능하다. 즉, 한 클래스에 복수의 인터페이스 선언이 가능하다는 것이다.

 

[ 참고: myjamong.tistory.com/150 ]