Java_인터페이스, 추상클래스

SG Jang·2021년 2월 1일
0

길잡이를 자바보자

목록 보기
4/12
post-thumbnail

이번 시간에는 "Java_인터페이스, 추상클래스"에 대해 다뤄보겠습니다.


소개

  • 인터페이스
    개발자 사이의 코드 규약을 정한다. 여러 구현체에서 공통적인 부분을 추상화한다.(다형성) 자바 인터페이스는 기본적으로 추상메서드의 모음이다. 추상메서드는 구현부가 없는 메서드를 말한다.
  • 클래스
    • 일반클래스 = 실체클래스
      실체가 드러나는 클래스 => 구체성을 가지므로 객체를 생성할 수 있다.
    • 추상클래스
      실체클래스의 공통적인 부분을 추출해 어느정도 규격을 잡아놓은 추상적인 클래스 => 아직 메소드와 내용이 추상적이기 때문에 객체를 생성할 수 없다.


인터페이스란?

  • 인터페이스란, 극단적으로 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 것이 인터페이스의 역할이자 개념이다. 즉, 자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해 인터페이스를 사용한다.
  • (상황예시)
    스마트폰제조사 A는 몇 십억을 투입해 지잡1회사의 카메라를 스마트폰에 탑재하여 제품을 1000대정도 만들었다. 그런데 문제가 생겼다. 지잡1회사의 카메라는 연속촬영이 안되는것..! 결국 스마트폰제조사 A는 지잡1회사의 카메라를 훌륭2회사의 카메라로 전면 교체하기로 결정하였다. 그런데.. 오.. 맙소사.. 지잡1회사 카메라의 촬영 모듈에만 특화된 프로그램을 만든 것이다. 즉, 훌륭2회사의 카메라로 교체하기 위해서는 다시 프로그램을 만들고 시스템을 구축해야한다. 만약 촬영 모듈을 모두 공통적으로 규격에 맞는 모듈로 개발했다면 이런 유지보수성의 불편함은 발생되지 않을 것이며 호환성이 높아질 것이다. 정리하자면, 제조사가 다른 카메라여도 촬영이라는 동일한 기능을 제공하게 하는 것이 바로 '인터페이스'이다.
  • 문법
    인터페이스가 되는 경우 => 모든 메소드가 추상메소드인 경우
    인터페이스는 interface라는 키워드를 통해 선언할 수 있으며 implements 키워드를 통해 일반 클래스에서 인터페이스를 구현할 수 있다.
    public interface 인터페이스명 {
    	타입 상수명 =; //상수
    	타입 메소드명(매개변수, ... ); //추상 메소드
    	default 타입 메소드명(매개변수, ... ){
    	  //구현부
    	} //디폴트 메소드
    	static 타입 메소드명(매개변수) {
    	  //구현부
    	} //정적 메소드
    }

추상클래스란?

  • 추상클래스란, A클래스, B클래스, C클래스가 있다고 할 때, 각 클래스 안에는 각자의 필드와 메소드가 있을 것이다. 추상클래스는 A클래스, B클래스, C클래스들 간에 비슷한 필드와 메소드를 공통적으로 추출해 만들어진 클래스이다. 즉, 추상클래스는 계층적 상속 관계를 가지는 클래스들의 구조를 만들때 적합하다.

  • (상황예시)
    '키보드'라는 클래스가 있다. '키보드'를 만드는 제조사는 여러개이다. A제조사, B제조사, C제조사는 각 제조사만의 스타일대로 키보드를 제작하고 소비자들에게 제품을 출시한다. 여기서 차이가 있다면, A제조사는 누를때마다 불빛이 들어오고, B제조사는 누를때마다 딸깍거리는 소리가 장난아니다. C제조사는 키감이 좋다. 여기서 이 키보드들 간에 공통점은 바로 '키보드를 누른다'라는 액션이다. 즉, 메소드가 공통적이다. 그럼 이 메소드를 추출해서 추상클래스 안에 두면 되고, 키보드를 상속받아 A키보드, B키보드, C키보드가 탄생한다.

    아직도 감이 안오는가? 단순하게 요약해보자면 3가지로 요약가능하다.

    1. 공통된 필드와 메소드를 통일할 목적, 유지보수성을 높일 수 있다.
    2. 실체클래스 구현시 시간을 절약하기 위해
      즉 강제로 주어지는 필드와 메소드를 가지고 나만의 스타일대로 구현만 하면 된다. 설계 시간이 절약되고, 구현하는데만 집중할 수 있다.(번외로, 추상클래스를 설계하는 일은 AA(어플리케이션 아키텍쳐)가 해줄 것이다.)
    3. 규격에 맞는 실체클래스 구현을 위해
      2번의 시간절약과 비슷한 내용이다. '나만의 스타일대로 구현'을 보고 제멋대로 구현할 수 있다는 말이 아니다. '규격'안에서의 구현을 허락한다는 말이다. 중요한건, 소스 수정시 다른 소스의 영향도를 적게 가져가면서 변화에는 유연하게 만들기 위해 추상클래스를 사용하기도 한다. 규격에 맞게 소스가 구현되어 있기 때문에 해당 규격에 대한 구현부만 수정하면 손쉽게 수정이 가능하기 때문이다.(이부분은 객체지향(자바) solid설계원칙을 알면 이해하기 쉽다.)
  • 문법

    • 추상 클래스가 되는 경우 => 추상 메소드가 하나 이상 포함되거나 키워드 abstract로 정의된 경우

      public abstract class 클래스명{
        //필드
        //생성자
        //메서드
        //추상메서드
      }
    • 추상메소드
      선언은 되어 있으나 코드가 구현되어 있지 않은, 즉 껍데기만 있는 메소드, abstract키워드와 함께 메소드의 타입, 이름, 매개변수 리스트만 선언해야 한다.

      [public / protected] abstract 리턴타입 메소드명(매개변수1, 매개변수2, ... );
    • 객체(인스턴스)를 생성할 수 없다.
      소개부분에서 소개했지만 추상클래스에는 실행코드가 없는 추상메소드가 있을 수 있기 때문에 추상클래스의 객체를 생성할 수 없도록 제한하였다. 그러나 추상클래스를 상속받은 클래스를 통하면 인스턴스화가 가능하다.

      추상클래스명 ab = new 클래스명();
    • 서브클래스
      추상클래스를 상속받은 서브클래스는 조상클래스의 추상메소드를 그대로 상속받아 추상클래스가 된다. 그러므로 서브클래스 앞에 abstract 키워드를 반드시 사용하여 추상클래스임을 명시해야한다. 또한 모든 개발자들은 서브클래스에서 추상클래스에 선언된 추상메소드를 모두 구현해야 한다. 추상클래스를 책의 목차라고한다면 서브클래스는 목차에 따라 작성된 실제 책과 같다. 책을 쓸 때도 목차를 잡아놓고 책을 쓰면 훨씬 쉽고 빠르며 방향이 흐트러지지 않는 것처럼 추상클래스를 이용하면 응용프로그램의 설계와 구현을 분리할 수 있다. 추상 클래스로 기본 방향을 잡아놓고 서브 클래스에서 구현하면 구현 작업이 쉬워진다.

    • 추상클래스는 생성자를 가질 수 있고, 접근지정자(public, protected, default, private)는 어떤 것이나 가능하다.


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

공통점

상속받는 클래스 혹은 구현하는 인터페이스 안에 있는 추상 메소드를 구현하도록 강제한다.

차이점

존재목적의 차이

  • 인터페이스
    인터페이스는 함수의 껍데기만 있는데, 그 함수의 구현을 강제하기 위함이고, 구현을 강제함으로써 구현 객체와 같은 동작을 보장할 수 있다.(사용시기: 상속관계를 쭉 타고 올라갔을때 다른 조상클래스를 상속하는데 같은 기능이 필요할 경우)
  • 추상클래스
    추상클래스를 상속받아서 기능을 이용하고 확장시키기 위함.(사용시기: 상속관계를 쭉 타고 올라갔을때 같은 조상클래스를 상속하는데 기능까지 완벽히 똑같은 기능이 필요한 경우)


참고자료

0개의 댓글