[JAVA] 01. 추상클래스와 인터페이스

jae_s_a·2022년 8월 10일
0

JAVA

목록 보기
1/2
post-thumbnail

추상 클래스와 인터페이스

Q.
각각 무엇인지?
언제 추상클래스를 사용하고 언제 인터페이스를 사용하지?
공통점과 차이점은 뭐가 있지?

추상 클래스

  • 추상 메서드를 선언하여 상속을 통해 하위 클래스에서 반드시 구현하도록 강제하는 클래스. 추상 클래스는 상속을 위한 클래스
  • 클래스 앞에 'abstract' 키워드를 사용하여 정의하며 *추상 메서드를 가지는 클래스
    • *추상 메서드는 선언부만 작성하고 구현부는 작성하지 않은 채 남겨둔 메서드. ‘미완성 클래스’에 비유할 수 있다.
      abstract class AbstractClazz {
      	...
      	public abstract void absMtd();
      }
  • 추상 클래스는 new키워드를 통해 직접 객체를 생성할 수 없고, java는 다중 상속을 지원하지 않기 때문에 여러 개의 추상 클래스를 상속할 수 없다.
    • 추상메서드를 포함하고 있지 않은 클래스에도 ‘abstract’를 붙여서 추상 클래스로 지정할 수 있다. 단, 추상메서드가 없는 클래스일지라도 인스턴스를 생성할 수 없다.
      (혼동될 수 있으니, 계속해서 설명할 추상클래스의 정의에서는 하나 이상의 추상 메서드를 가지고 있다는 것을 전제)

인터페이스

  • 인터페이스도 추상클래스처럼 추상메서드를 갖지만 추상클래스와 달리, 일반 메서드나 멤버변수를 가질 수 없고, 오직 추상 메서드와 상수만을 멤버로 갖는다.
  • 인터페이스는 다중 상속(구현)이 가능하다.
  • 모든 멤버변수는 public static final . 메서드는 public abstract이어야 한다.
    멤버변수와 메서드의 키워드들은 생략 가능하다.
    - JDK 1.8부터 static메서드와 default 메서드를 허용
     interface 인터페이스_이름 {
     	public static final 타입 상수_이름 =;
     	public abstract 메서드_이름(매개변수목록);
     }

Q> 추상클래스가 인터페이스의 역할을 다 할 수 있는데 왜 각각을 나누었는가?
A> 사용용도가 다르기 때문.

추상클래스는 왜?

💡 추상클래스는 상위 클래스로부터 공통된 구현을 뽑아내기 위해 사용한다.

추상 메서드를 하나 이상 가진 것이 추상 클래스이다. 추상 클래스를 상속함으로써 그 클래스가 가지는 메서드들을 상속받은 하위 클래스에서 오버라이딩하게 된다.

그래서 왜! 사용하는가?
코드의 중복을 줄이고 유지보수의 편의성을 위해.

스타크래프트의 유닛으로 예시로 들면,

  • 저글링 extends 클래스
    • 기본 사거리: 1
    • 미네랄: 50
    • 움직이다: 네 발로 뛰어간다
    • 공격하다: 할퀴다
  • 마린 extends 클래스
    • 기본 사거리: 5
    • 미네랄: 50
    • 움직이다: 두 발로 걸어간다
    • 공격: 총을 쏘다

설명하기에 앞서 추상 클래스는 생성자, 일반 메서드, 멤버 변수 등을 가질 수 있다.

그 말은 즉, 생성자나 오버라이딩을 활용한다면 공통분모에 대한 코드의 중복을 줄이고, 각 유닛에 알맞게 하위 클래스에서 재정의가 가능하다는 것이다.

인터페이스는 왜?

💡 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 구현하기 위해 사용한다.

예를 들면, A, B, C가 엮여 동작하는 클래스가 존재하는데 A개발자가 A와 B클래스를 만들고 C개발자가 C클래스를 만든다고 가정

그런데, A개발자가 만들고 있는 A클래스가 C개발자가 만들고 있는 C클래스가 완성이 되어야 개발이 가능한 경우가 있다. 이런 경우에 용이

A개발자는 C클래스를 가짜(임시) 클래스로 만들어서 C클래스가 필요한 자리에 채워넣은 뒤, C개발자가 C클래스를 완성한 후에 바꿔뀜으로써, 개발 일정에 차질이 없도록 하기 위함

즉, 이렇게 인터페이스를 사용함으로써 결합도를 낮게 만들어 협업과 유지보수에 용이하다.

또 다른 이유로는 상속의 이유이다.

추상 클래스는 단일 상속이기에 트리 형식으로 상위 클래스와 하위 클래스로 나뉘는 형태로 볼 수 있다.

즉, 하위 클래스는 상위 클래스에서 추상화시킨 생성자 혹은 메서드를 재정의하면서 하위 클래스로 내려갈수록 구체화된다.

반면, 인터페이스는 수직적 구조가 아닌 수평적 구조를 갖는 형태라고 볼 수 있다.

여기서 말하는 수평적 구조는 다중 상속이 가능하기 때문에 비슷한 기능을 가진 것들을 묶어 수평적 구조를 가진다는 걸 말한다.

추상클래스와 인터페이스의 공통점과 차이점

공통점

  • new를 통해 직접 객체를 생성할 수 없으며, 상속받은 자식만이 객체를 생성할 수 있다.
  • 둘 다 하나의 클래스이며, 하위클래스에서 모든 메서드를 구현해야 한다.
  • 추상 메서드(선언부만 존재하는 메서드)를 갖는다.

차이점

  • 추상 클래스는 다중 상속이 불가능하지만, 인터페이스는 다중 상속이 가능하다.
  • 인터페이스는 추상 메서드만 사용 가능한 반면, 추상 클래스는 일반 메서드와 추상 메서드 모두 사용 가능하다.
  • 인터페이스는 생성자를 가질 수 없고, 상수만 가능한 반면, 추상 클래스는 생성자와 일반변수를 가질 수 있다.
  • 추상 클래스는 상속받는 클래스가 일부만 구현(하위 클래스로 전가)할 수 있지만 인터페이스는 반드시 인터페이스에 있는 메서드를 모두 구현해야 한다.

[참고]

[JAVA] 추상클래스 VS 인터페이스 왜 사용할까? 차이점, 예제로 확인 :: 마이자몽
추상클래스와 인터페이스의 공통점과 차이점
자바[Java] 인터페이스[Interface] 사용과 이유

profile
if not now, when

0개의 댓글