8주자 과제: 인터페이스

2021. 1. 28. 16:38
728x90

목표

자바의 인터페이스에 대해 학습하세요.

학습할 것 (필수)

  • 인터페이스 정의하는 방법
  • 인터페이스 구현하는 방법
  • 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
  • 인터페이스 상속
  • 인터페이스의 기본 메소드 (Default Method), 자바 8
  • 인터페이스의 static 메소드, 자바 8
  • 인터페이스의 private 메소드, 자바 9

 


출처/참고

 

[01] 추상클래스와 인터페이스의 차이가 뭐죠?

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

cbw1030.tistory.com

 

 

자바 인터페이스(Java Interface)는 무엇인가?

개요 "자바 인터페이스(Java Interface)는 무엇인가?" 이런 궁금점을 가지고 있는 Java Programmer가 많습니다. 저는 "객체 지향 개발 5대 원칙 - SOLID"을 만족시켜줄 수 있어서라고 생각합니다. 그러면 "왜

interconnection.tistory.com

 

 

나만 모르고 있던 - Java 9 (Java9 빠르게 훑어 보기) | Popit

지난 9월 공식 릴리즈된 Java9에 대해서 알아 보고자 구글링 통해서 찾은 문서중 괜찮은 문서 가 있어서 발번역해 봅니다. 본 문서는 Java9의 신규기능과 변경사항에 대해 빠르게 훑어 보는것을 목

www.popit.kr

 


 

인터페이스

 

 

  • 추상클래스보다 한 단계 더 추상화된 클래스
  • 인터페이스에서 모든 메소드들은 추상메소드로 간주되기 때문에 abstract를 생략할 수 있다.
  • 기존 인터페이스에서는 일반 메소드를 구현할 수 없지만 자바8 버전부터 default 예약어를 통해 일반메소드 구현이 가능하다.
  • 인터페이스는 static final 필드만 가질 수 있다 => 선언할 때 public static final이 생략되어 있다고 생각하기
  • new 생성자를 이용하여 객체를 생성할 수 없다.
  • 인터페이스는 구현 객체가 같은 동작을 한다는 것이 목적이다.
  • 인터페이스는 추상클래스와 반대로 다중상속이 가능함. 
  • 인터페이스를 이용하여 개발코드를 직접 수정하지 않고도 사용하고 있는 객체만 변경할 수 있도록 하기 위함

 

 

 

*public static final을 사용하는 이유

  1. 구현 객체의 같은 동작을 보장하기 위한 목적
  2. 인터페이스의 변수는 스스로 초기화될 권한이 없음
  3. 아무 인스턴스도 존재하지 않는 시점이기 때문

 

* 클래스 - extends - 클래스   /   인터페이스  - extends - 인터페이스   /   인터페이스 - implements - 클래스

 

 

 

 

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

 

  • 추상클래스와 인터페이스는 선언만 있고 구현내용은 없는 클래스 
  • => 자바8부터 인터페이스에서 default method로 구현이 가능하지만 일반적으로 구현은 없다.
  • 객체를 생성할 수 없다.

 

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

 

  • 추상클래스는 단일상속, 인터페이스는 다중상속
  • 추상클래스의 목적은 상송을 받아서 기능을 확장시키는 것.
  • 인터페이스의 목적은 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제하는 역할
  • => 구현 객체가 같은 동작을 한다는 것을 보장하기 위함.

 

 

 

 

인터페이스 정의하는 방법

 

[public] interface 인터페이스이름 {...}

 

인터페이스는 접근지정자로 public을 사용하면 다른 패키지에서도 사용가능.

public을 사용하지 않으면 인터페이스가 있는 패키지 내에서만 사용가능.

인터페이스 접근지정자는 public만 사용가능 => 인터페이스는 클래스 설계도이기 때문에 존재 목적이 공개에 있다.

 

 

 

 

 

인터페이스 구현하는 방법

 

 

  • 개발 코드에서 인터페이스 메소드를 호출하면 인터페이스는 구현객체의 메소드를 찾아서 호출.
  • 객체는 인터페이스에 있는 추상메소드를 구현한 실체 메소드를 가지고 있어야 한다.
  • 인터페이스를 구현한 객체를 구현객체(구현체)라고 한다.
  • 구현 객체를 생성하는 클래스를 구현 클래스라고 한다.

 

 

 

1.단일 인터페이스 구현클래스(Implement class)

 

 

인터페이스 

public interface Person {
    public static final String NAME = "sujin";
    public static final int AGE = 27;

    //추상메소드
    public  abstract void print();
}

 

구현 클래스

public class personImpl implements Person {

    //추상 메소드는 실체 메소드를 정의해야 한다.
    @Override
    public void print() {
        System.out.println("이름: " + NAME);
        System.out.println("나이: " + AGE);
    }
}

 

=> 만약 구현클래스에서 추상메소드를 구현하지 않으면 구현클래스는 추상클래스로 선언되어야함.

 

 

public abstract class personImpl implements Person {

}

 

 

 

 

 

2. 다중 인터페이스 구현클래스 (Multiple Interface  Implement class)

 

public class 구현클래스 이름 implements 인터페이스이름1, 인터페이스이름2 { ... }

다중인터페이스를 구현한 구현클래스는 반드시 모든 인터페이스의 추상메소드를 구현해야한다.

 

 

 

 

3.익명 구현 객체(Anonymous Implement Object) - 더 공부

 

 

 

 

인터페이스 레퍼런스를 통해 구현체를 사용하는 방법

 

 

인터페이스 변수는 참조 타입이기 때문에 구현 객체가 대입될 경우 구현 객체의 번지가 저장된다.

 

* 인터페이스 변수에 인터페이스가 구현된 서로 다른 구현객체를 할당해서 사용가능 => 잘모르겟다

//Person 인터페이스를 구현한 구현 클래스 Imple
public class Imple implements Person {...}
//Person 인터페이스를 구현한 구현 클래스 Imple2
public class Imple2 implements Person {...}


Person p = new Imple();
p = new Imple2();

 

 

인터페이스를 사용해서 다형성을 사용하면, 사용할 구현 객체만 바꿔주면 나머지 소스코드는 변경할 필요가 없다.

Interface i = new ImplementObjectA();

i = new ImplementObjectB();

// i를 수정해도 변경이 없다.
i.method1();
i.method2();

 

 

 

인터페이스 상속

 

 

  • 인터페이스도 다른 인터페이스를 상속할 수 있다.
  • 클래스는 다중 상속을 허용하지 않지만, 인터페이스는 다중상속을 허용한다.

 

public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2,... { ... }

 

=> 하위인터페이스를 구현하는 구현클래스는 하위인터페이스의 추상메소드와 

     상속하는 모든 상위 인터페이스의 추상메소드를 구현해야한다

 

 

 

 

인터페이스의 기본 메소드 (Default Method), 자바8

 

[public] default 리턴타입 메소드이름( 매개변수,...) {...}
  • 자바8에서 추가된 인터페이스 멤버
  • 클래스의 인스턴스 메소드와 동일하다.
  • 인터페이스에서 선언할 때 default키워드가 붙는다.
  • 구현 클래스에서 실체 메소드를 작성하지 않아도 구현객체에서 호출이 가능하다.
  • 구현 클래스에서 디폴트 메소드가 변경이 필요한 경우, 오버라이드가 가능하다
  • 추상메소드가 아니고 인스턴스 메소드이기 때문에 생성한 구현객체가 있어야 사용할 수 있다.

 

* 디폴트메소드가 생긴 이유 *

 

디폴트메소드는 인스턴스 메소드이기 때문에 구현객체가 있어야 사용할 수 있다.

Java8에서 디폴트 메소드를 허용하는 이유는 기존 인터페이스를 확장해서 새로운 기능을 추가하기 위함.

기존 인터페이스에서 새로운 기능을 위해 추상메소드를 추가하면 해당 인터페이스를 구현하는 클래스를 

찾아다니면서 새로 선언된 추상메소드를 구현해야 한다.

하지만 인터페이스에 디폴트 메소드를 선언하게 되면 이미 선언된 인스턴스 메소드이기 때문에

실체 메소드를 선언하지 않아도 문제없이 필요한 곳에 디폴트 메소드를 사용할 수 있다.

=> 추상메소드가 구현 클래스에서 실체 메소드로 구현되어야 한다는 제약을 없애주는 편의 메소드

 

 

 

 

인터페이스의 static 메소드, 자바 8

 

  • 자바8에서 추가된 인터페이스의 멤버
  • 선언 형식은 클래스 정적메소드와 완전 동일하다.
  • 인터페이스의 정적 메소드도 클래스의 정적 메소드와 똑같은 방식으로 사용이 가능하다.
  • 정적메소드이기 때문에 재정의(Override)는 불가능.

 

 

 

 

인터페이스 private 메소드, 자바 9

 

 

Java8은 인터페이스에 default method 및 static method 라는 두 가지 새로운 기능을 제공한다.

하지만 이것은 여전히 우리를 불편하게 만드는데 왜냐하면

  • 단지 특정 기능을 처리하는 내부method 일뿐인데도 외부에 공개되는 public method로 만들었어야 했다.
  • interface를 구현하는 다른 interface 또는 class가 해당 method에 액세스하거나 상속 할수 있는것을 원하지 않는다.

Java9 Private Interface Method는 interface에 private method / private static method라는 새로운 기능을 제공하여 문제를 해결한다. 이제 중복 코드를 피하고 interface에 대한 캡슐화를 유지 할 수 있다.

728x90

BELATED ARTICLES

more