✍JAVA STUDY 4주차-2

min·2021년 11월 4일
0

✅ JAVA STUDY 4주차-2

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

1. 인터페이스 정의하는 방법

인터페이스(interface)는 클래스 혹은 프로그램이 제공하는 기능을 명시적으로 선언하는 역할을 한다.

  • 추상 메서드상수로 이루어져 있다.
  • 구현된 코드가 없기 때문에 인터페이스로 인스턴스를 생성할 수 없다.
public interface Calc {
//인터페이스에서 선언한 변수는 컴파일 과정에서 상수로 변환됨
double PI = 3.14;
int ERROR = -999999999;

//인터페이스에서 선언한 메서드는 컴파일 과정에서 추상 메서드로 변환됨
int add(int num1, int num2);
int substract(int num1, int num2);
}

2. 인터페이스 구현하는 방법

위와 같이 선언한 인터페이스를 클래스가 사용하는 것'클래스에서 인터페이스를 구현한다(implements)'라고 한다.

public class Claculator implements Calc { 

  @Override
  public int add(int num1, int num2) {
      return num1 + num2;
  }

  @Override
  public int substract(int num1, int num2) {
      return num1 - num2;
  }
}

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

4. 인터페이스 상속

  • 인터페이스 간 상속은 구현 코드를 통해 기능을 상속하는 것이 아니므로 형 상속(type inheritance)라고 부른다.
  • 클래스의 경우 하나의 클래스만 상속 받을 수 있지만, 인터페이스는 여러개를 동시에 받을 수 있다.
  • 한 인터페이스가 여러 인터페이스를 상속받으면, 상속받은 인터페이스는 상위 인터페이스에 선언한 추상 메서드를 모두 가지게 된다.
public interface X {
	void x();
}
public interface Y {
	void y();
}

MyInterface 인터페이스가 X,Y 인터페이스를 상속받는 방법은 아래와 같다.

  • 클래스를 상속할 때 사용한 extends 예약어를 그대로 사용한다.
public interface MyInterface extents X, Y {
	void myMethod();
}

MyInterface 인터페이스를 구현하는 MyClass 클래스 코드는 아래와 같다.

  • MyInterface 인터페이스에는 myMethod() 메서드만 선언되어 있지만 X,Y 인터페이스를 상속 받았으므로 x(), y() 메서드도 구현되어야 한다.
public class MyClass implements MyInterface {
  @Override
  public void x(){
  	System.out.println("x()");
  }

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

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

자바 7까지는 인터페이스에서 추상메서드와 상수, 두 가지 요소만 선언해서 사용할 수 있었지만 자바 8부터 인터페이스 활용성을 높이기 위해 디폴트 메서드와 정적 메서드 기능을 제공한다.
디폴트 메서드는 인터페이스에서 구현코드까지 작성한 메서드
정적 메서드는 인스턴스 생성과 상관없이 사용할 수 있는 메서드
하지만 디폴드 메서드나 정적 메서드를 추가했다고 해서 인터페이스가 인스턴스를 생성할 수 있는 것은 아니다.

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

  • 기본으로 제공되는 메서드
  • 디폴트 메서드는 인터페이스에서 구현하지만, 이후 인터페이스를 구현한 클래스가 생성되면 그 클래스에서 사용할 기본 기능이다.

디폴트 메서드 구현

public interface calc {
   ...
   
   //디폴트 메서드는 일반 메서드와 똑같이 구현하면 되고, 
   //메서드 자료형 앞에 defult 예약어만 써주면 된다.
   defult void description() {
      System.out.println("정수 계산기를 구현합니다.");
   }
}

디폴트 메서드 호출

public class CalclatorTest {
  public static void main(String[] args) {
    int num1 = 10;
    int num2 = 5;

    CompleteCalc calc = new CompleteCalc(); //클래스 생성
    clac.description(); //디폴트 메서드 호출
  }
}

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

  • 정적 메서드는 static 예약어를 사용하여 선언하며 클래스 생성과 무관하게 사용할 수 있다.
  • 정적 메서드를 사용할 때는 인터페이스 이름으로 직접 참조하여 사용한다.

정적 메서드 구현

public interface calc {
   ...
   
   static int total(int[] arr) {
   	int total = 0;
    
    for(int i : arr) {
    	total += i;
    }
    return total;
   }
}

정적 메서드 호출

public class CalclatorTest {
  public static void main(String[] args) {
    int num1 = 10;
    int num2 = 5;

    CompleteCalc calc = new CompleteCalc(); 
    clac.description();

    int[] arr = {1,2,3,4,5};
    System.out.println(Calc.total(arr));
  }
}
  • Calc.total(arr)처럼 인터페이스 이름으로 직접 참조하여 정적 메서드를 호출한다.

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

private 메서드는 인터페이스를 구현한 클래스에서 사용하거나 재정의할 수 없다. 따라서 기존에 구현된 코드를 변경하지 않고 인터페이스를 구현한 클래스에서 공통으로 사용하는 경우에 private 메서드로 구현하면 코드 재사용성을 높일 수 있다. 또한 클라이언트 프로그램에 제공할 기본 기능을 private 메서드로 구현하기도 한다.

private 메서드는 코드를 모두 구현해야 하므로 추상 메서드에 private 예약어를 사용할 수 없지만, static 예약어는 함께 사용 가능하다.

public interface calc {
   ...
   
   defult void description() {
      System.out.println("정수 계산기를 구현합니다.");
      myMethod(); //디폴트메서드에서 private 메서드 호출
   }
   
   static int total(int[] arr) {
   	int total = 0;
    
    for(int i : arr) {
    	total += i;
    }
    myStaticMethod(); //정적메서드에서 private static 메서드 호출
    return total;
   }
   
   private void myMethod() {
   	System.out.println("private 메서드 입니다.");
   }
   
   private static void myStaticMethod() {
   	System.out.println("private static 메서드 입니다.");
   }
}

0개의 댓글