본문 바로가기
Study/Java_study

Java_study_8 (인터페이스)

by hjshims 2021. 8. 17.

♨학습내용

더보기

인터페이스 구현하는 방법

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

 인터페이스 상속

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

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

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

 

  • 인터페이스 구현하는 방법
  • 인터페이스란?

- 자바에서 인터페이스는 객체의 사용 방법정의한 타입이다.

- 인터페이스는 객체의 교환성을 높여주기 때문에 다형성을 구현하는 매우 중요한 역할을 한다.

 

  • 인터페이스의 역할

- 인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 한다.

- 개발 코드가 인터페이스의 메서드를 호출하면 인터페이스는 객체의 메서드를 호출시킨다.

- 개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메서드만 알고 있으면 된다.

 

  • 인터페이스를 정의하는 방법

- 인터페이스는 "~java" 형태의 소스 파일로 작성되고 컴파일러를 통해 "~.class" 형태로 컴파일되기 때문에 물리적 형태는 클래스와 동일하다.

- 그렇지만 소스를 작성할 때 선언하는 방법이 다르다.

 

인터페이스 선언

- 인터페이스의 선언은 class 대신 interface를 사용한다.

 

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

 

- 인터페이스 이름은 클래스 이름을 작성하는 방법과 동일하다.

- public 접근제한자는 다른 패키지에서도 인터페이스를 사용할 수 있도록 해준다.

- 클래스는 필드, 생성자, 메서드를 구성 멤버로 가지는데 비해, 인터페이스는 상수와 메서드만을 구성 멤버로 가진다.

- 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.

 

  • 상수 필드 선언

- 인터페이스는 객체 사용 설명서 이므로 런타임 시 데이터를 저장할 수 있는 필드를 선언할 수 없다.

- 대신 상수 필드만 선언할 수 있다.

- 상수는 public static final로 선언합니다.

- 인터페이스는 선언된 필드는 모두 public static final의 특성을 갖는다.

- public, static, final을 생략하더라도 자동적으로 컴파일 과정에서 붙게된다.

- 상수는 대문자로 작성하되, 서로 다른 단어로 구성되어 있을 경우 언더바(_)로 연결하는 것이 관례이다.

 

  • 추상 메서드 선언

- 인터페이스를 통해 호출된 메서드는 최종적으로 객체에서 실행된다.

- 그렇기 때문에 메서드는 실행 블록이 필요없는 추상 메서드로 선언한다.

 

  • 디폴트 메서드 선언

- 디폴트 메서드는 자바8에서 추가된 인터페이스의 새로운 멤버이다.

- 형태는 클래스의 인스턴스 메서드와 동일한데, default 키워드가 리턴 타입 앞에 붙는다.

- 디폴트 메서드는 public 특성을 갖기 때문에 생략하더라도 자동적으로 컴파일 과정에서 붙게된다.

 

  • 정적 메서드 선언

- 정적 메서드는 자바8에서 추가된 인터페이스의 새로운 멤버이다.

- 형태는 클래스의 정적 메서드와 완전 동일하다.

- 정적 메서드는 public 특성을 갖기 때문에 생략하더라도 자동적으로 컴파일 과정에서 붙게된다.

 


 

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

- 자바는 인터페이스를 통해 다형성을 이용할 수 있다.

- A라는 클래스에서 B라는 인터페이스를 구현화한 객체라면, B 타입의 참조변수에 A 클래스의 객체를 참조할 수 있다.

 

interface B {
  void run();
}

class A implements B {

  @Override
  public void run() {
    System.out.println("running..");
  }
  
}

class Main {
  public static void main(String[] args) {
    B parent = new A();  // B 라는 인터페이스 타입에 A 객체를 삽입
    parent.run();    
  }
}

 


 

  • 인터페이스 상속

- 인터페이스는 인터페이스로부터만 상속을 받을 수 있다.

- 인터페이스는 추상화 클래스와 다르게 다중 상속이 가능하다.

 

public class Car implements Sedan, SUV, SmallCar {
    @Override
    public void ride() {    // call method in Sedan interface

    }
    
    @Override
    public void ride1() {    // call method in SUV interface

    }
    
    @Override
    public void ride2() {    // call method in SmallCar interface

    }
}

 

- 하위 인터페이스를 구현을 한다면, 해당 클래스는 상위 인터페이스 메서드까지 모두 구현해야한다.

 


 

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

- 자바 8부터 interface에 Default Method를 선언할 수 있게 되었다. 

- Default Method는 클래스 상속 설계 중 비효율적이었던 부분을 고칠 수 있게 되었다.

- defalut 키워드를 앞에 붙여서 선언하며, 일반 메서드처럼 구현부가 있어야 한다.

 

public interface A {

  default void print() {
    System.out.println("default method!");
  }
  
}

 


 

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

- private 접근 지시자를 반드시 사용해야 한다.

- private  abstract 키워드를 동시에 사용할 수 없다.

- 동시에 사용 시 컴파일 에러가 발생한다.

 

  • private methods

- private method는 해당 클래스에서만 사용 가능하다.

- 결국 하위 클래스가 상속할 수 없고, 이 메서드를 재정의(오버라이딩) 할 수 없다는 의미이기 때문에 추상 메서드가 될 수 없다.

- 즉, 구현이 되어 있어야만 한다.

 

  • abstract methods

- 추상 메서드는 구현부가 없는 메서드라는 의미이다.

- 즉, 하위 클래스가 상속해서 이 추상 메서드를 구현해야한다.

 

private [static] 리턴타입 메서드명(매개변수, ...) { ... }

 

 

- private method는 interface 내에서만 사용할 수 있다.

- private static method는 static & non-static 인터페이스 메서드 안에서 사용할 수 있다.

- private non-static method는 private static method 내에서 사용할 수 없다.

 

 


 

  • 인터페이스의 private 메서드, 자바 9

- 자바9 부터 인터페이스에 private 메서드와 private static 메서드가 추가되었다.

 

  • 추가된 배경

- 여전히 자바8 에서의 기본 메서드와 static 메서드가 있음에도 불편한 점이 있었고,

- 특정 기능만 수행하는 내부 메서드인데, 외부에 공개되는 public method로 만들어야 했기 때문이다.

- 코드의 중복을 줄이고 interface에 대한 캡슐화를 유지하는 것이 가능해졌다.

 

  • private 메서드 규칙

- private 메서드는 구현부가져야만 한다.

- 오직 인터페이스 내부에서만 사용할 수 있다.

- private static 메서드는 다른 static메서드 와 static이 아닌 메서드에서도 사용이 가능하다.

- static이 아닌 private 메서드는 다른 private static에서는 사용될 수 없다.

 

 

 

'Study > Java_study' 카테고리의 다른 글

Java_study_10 (멀티쓰레드 프로그래밍)  (0) 2021.08.30
Java_study_9 (예외처리)  (0) 2021.08.23
Java_study_7 (패키지)  (0) 2021.08.11
Java_study_6 (상속)  (0) 2021.08.09
Java_study_5 (클래스)  (0) 2021.08.04