티스토리 뷰

추상 클래스(abstract class)

클래스는 일반 클래스(concrete class, )와 추상 클래스로 나뉘는데 추상 클래스는 클래스 구현부 내부에 추상 메서드가 하나 이상 포함되거나 abstract로 정의된 경우를 말한다. 

 

- 추상 클래스는 new 연산자를 사용하여 객체를 생성할 수 없다.

- 추상 클래스(부모)와 일반 클래스(자식)는 상속의 관계에 놓여있다.

- 추상 클래스는 새로운 일반 클래스를 위한 부모 클래스의 용도로만 사용된다.

- 일반 클래스들의 필드와 메소드를 통일하여 일반 클래스 작성 시 시간을 절약할 수 있다.

- 추상 클래스는 단일 상속만 가능하며 일반 변수를 가질 수 있다.

- 추상 클래스는 동일한 부모를 가지는 클래스를 묶는 개념으로 상속을 받아서 기능을 확장시키는 것이 목적이다.


 

 

추상 클래스를 설명하기 위해 Animal 추상 클래스를 선언해보자

 

Animal 추상 클래스

 

어떤 A라는 클래스가 추상 클래스를 상속 받는다면 A 클래스는 추상 클래스에 선언했던 추상 메서드를 무조건 구현을 해야하는 룰이 있다. 이 룰을 어기면 에러가 발생한다.

 

Animal 추상 클래스를 상속받은 Dog 일반 클래스

Animal 추상 클래스를 상속받은 Cat 일반 클래스

 

위와 같이 자식 클래스(Dog, Cat)를 선언해주고 메인 메서드에서 실행을 해보자.

 

Main class

출력 결과


 

추상 클래스에는 일반 메서드를 구현할 수 없을까?

구현이 가능하다. Animal 추상 클래스에 나이를 출력해주는 age 메서드를 만들어보자.

Animal 추상 클래스에 age 일반 메서드 추가

 

그렇다면 Dog, Cat 클래스에서 사용이 가능한지 확인해보자.

Main 클래스에 age함수 호출

출력 결과

 

결과는 아주 잘 출력이 된다.

 


 

인터페이스(interface)

인터페이스는 모든 메서드가 추상 메서드인 경우를 말한다. 

 

- 인터페이스는 추상 클래스보다 한 단계 더 추상화된 클래스라고 볼 수 있다. 

   - 인터페이스에 적는 모든 메서드들은 추상 메서드로 간주되기 때문에 abstract을 적지 않는다.

   - 기존에는 인터페이스에 일반 메서드를 구현할 수 없었지만, 자바8 버전부터 default 예약어를 통해 

     일반 메서드구현이 가능하다.

- 인터페이스는 static final 필드만 가질 수 있다. 필드를 선언할 때는 public static final이 생략되어있다고 생각하자

   - public static final을 사용하는 이유는 다음과 같다.

      1. 구현 객체의 같은 동작을 보장하기 위한 목적

      2. 인터페이스의 변수는 스스로 초기화 될 권한이 없음

      3. 아무 인스턴스도 존재하지 않는 시점이기 때문

- 인터페이스도 추상 클래스와 마찬가지로 new 연산자를 사용하여 객체를 생성할 수 없다.

- 인터페이스는 구현 객체가 같은 동작을 한다는 것을 보장하는 것이 목적이다.

- 인터페이스는 추상 클래스와 반대로 다중 상속이 가능하다.


 

인터페이스에 필드와 메서드를 선언하면 컴파일러가 자동으로 키워드를 붙여 해석한다.


 

클래스와 인터페이스 사이 관계 이해하기

아래 사진에서 보이는 것처럼 클래스끼리 인터페이스끼리 상속을 할 때는 extends, 클래스가 인터페이스를 상속받을 때 implements 키워드를 사용한다.


 

예시로 인터페이스를 이해해보자.

인터페이스 생성

위와 같이 인터페이스를 생성을 하고

 

새로운 클래스를 만들어 인터페이스를 상속받는다. 그리고 출력을 하게 되면.

 

Main 클래스

 

출력결과

예상대로 잘 나온다.

 


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

- 추상 클래스와 인터페이스는 선언만 있고 구현 내용은 없는 클래스이다.

  (자바 8부터 인터페이스에서 default method로 구현이 가능하지만 일반적으로 구현은 없다.)

- 인스턴스화(객체를 생성 X)를 할 수 없다.

- 추상 클래스를 extends로 상속받은 자식들과 인터페이스를 implements하고 구현한 자식들만 객체를 생성할 수 있다.

  (결국 자식 클래스가 무언가 반드시 구현하도록 위임해야할 때 사용한다.)

 

 

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

- 추상 클래스(단일상속) / 인터페이스(다중상속)

- 추상 클래스의 목적은 상속을 받아서 기능을 확장시키는 것

- 인터페이스의 목적은 구현하는 모든 클래스에 대해 특정한 메서드가 반드시 존재하도록 강제하는 역할

  즉, 구현 객체가 같은 동작을 한다는 것을 보장하기 위함


결론적으로, 추상 클래스는 상속 개념, 인터페이스는 그렇지 않다는 것을 이해하면 서로 가지는 목적을 구분짓을 수 있을 것이다.

 

인터페이스를 사용하는 이유는 무엇인가?

 

설계도라고 생각하면 된다.

하나의 규약, 즉 구체적인 약속 같은 것으로 인해 협업에 필수적이라고 볼 수 있다.

큰 프로젝트일수록 또는 개발 인원이 많을 경우 인터페이스를 통해 많은 이점을 얻게 된다.

 

추상 클래스를 사용하는 이유는 무엇인가?

 

상속을 강제하기 위함이다.

부모 클래스에서 정의만 해놓고, 실제 동작은 자식 클래스에서 하게 된다.

이러한 추상 클래스의 성격이 잘 반영되어진 것이 팩토리 메소드 패턴(Factory Method Pattern) 이다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크