wms's Programming&Study

인터페이스와 추상클래스 본문

Programming/JAVA

인터페이스와 추상클래스

wms2275 2021. 10. 10. 23:18

인터페이스 (interface)

  • 객체를 어떻게 구성해야 하는지 정리한 설계도
  • 메소드 구현시 implements 예약어 사용하며 다중상속이 가능
  • new를 통해 인스턴스(객체)를 생성할 수 없다.
  • 인터페이스를 구현한 객체들에 대해서 동일한 동작을 약속하기 위해 존재
  • 실제 코드를 만들지 않더라도 어떤 메소드들이 있어야 하는지를 정의하려고 할 때 사용
  • 설계 단계에서 인터페이스만 만들어 놓고, 개발 단계에서 실제 작업을 수행하는 메소드를 만들면
    설계 단계의 산출물과 개발 단계의 산출물을 보다 효율적으로 관리할 수 있다.
  • 외부에 노출되는 것을 정의해 놓고자 할 때 사용
다형성(Polymorphism) 이란?   

하나의 타입 변수에 대입되는 객체에 따라서 실행 결과가 다양한 타입의 형태로 나오는 성질   
즉, 하나의 타입 변수를 동일한 메서드로 동작시키지만 실제 동작은 다를 수 있는 성질

  • 자바 1.8 버전부터 달라진 인터페이스

    • default 메소드
      인터페이스가 변경이 되면, 인터페이스를 구현하는 모든 클래스들이 해당 메소드를 구현해야 하는 문제가 있다.
      이런 문제를 해결하기 위하여 인터페이스에 메소드를 구현해 놓을 수 있도록 하였다.

    • static 메소드
      인터페이스에 static 메소드를 선언함으로써,
      인터페이스를 이용하여 간단한 기능을 가지는 유틸리티성 인터페이스를 만들 수 있게 되었다.


  public interface Calculator {
        public int plus(int i, int j);
        public int multiple(int i, int j);
        default int exec(int i, int j){          //default로 선언함으로 메소드를 구현할 수 있다.
            return i + j;
        }
        public static int exec2(int i, int j){   //static 메소드 
            return i * j;
        }
    }

    //Calculator인터페이스를 구현한 MyCalculator클래스
    public class MyCalculator implements Calculator {

        @Override
        public int plus(int i, int j) {
            return i + j;
        }

        @Override
        public int multiple(int i, int j) {
            return i * j;
        }
    }

    //인터페이스에서 정의한 static메소드는 반드시 인터페이스명.메소드 형식으로 호출해야한다.  

    public class MyCalculatorExam {
        public static void main(String[] args){
            Calculator cal = new MyCalculator();
            int value = cal.exec(5, 10);           // default 메소드 호출 
            System.out.println(value);

            int value2 = Calculator.exec2(5, 10);  // static 메소드 호출 
            System.out.println(value2);
        }
    }

추상클래스 (abstract class)

  • 추상 클래스는 클래스 앞에 abstract 키워드를 이용해서 정의
  • 메소드 구현시 extends 예약어 사용
  • 클래스이기 때문에 다중상속이 불가
  • 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스이며 미완성 설계도라고 한다. -> 상속을 통해 기능 확장 목적
  • 상속을 위한 클래스이기 때문에 추상 클래스는 new를 통해 인스턴스(객체)를 생성할 수 없다.

인터페이스와 추상클래스의 사용 이유

  • 개발자의 역량에 따른 메소드의 이름과 매개변수 선언의 격차를 줄일 수 있다.
  • 공통적인 인테페이스와 추상클래스를 선언해 놓으면 선언과 구현을 구분할 수 있다.

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

  • 다중상속의 차이 - 추상클래스는 다중상속이 안되고 인터페이스는 가능
  • 변수 선언 차이 - 인터페이스는 불가 (static final 변수만 가능 - 아무 인스턴스도 존재하지 않는 시점이기 때문에)

인터페이스와 추상클래스의 예시






출처 : https://programmers.co.kr/learn/courses/5/lessons/241