Programming

; develop a program

Back-End/Java

[Java] 인터페이스 요소

Clloud_ 2023. 2. 10. 07:49
반응형

이번 포스팅에서는 자바(Java)에서 인터페이스 요소에 대하여 공부를 해보고자 한다.

 


인터페이스 상수

인터페이스는 추상 메서드로 이루어지므로 인스턴스를 생성할 수 없으며 멤버 변수도 사용할 수 없다.

그런데 인터페이스에 다음 코드와 같이 변수를 선언해도 오류가 발생하지 않는다.

public interface Calc {
    double PI = 3.14;
    int ERROR = -999999999;
    ...
}
  • Calc 인터페이스에  선언한 변수 PI를 컴파일하면 public static final double PI = 3.14, 즉 상수 3.14로 변환된다.
  • int형 변수 ERROR 역시 public static fianl int ERROR = -999999999로 변환되어 상수로 취급된다.
인터페이스에 선언한 변수를 컴파일하면 상수로 변환되기 때문이다.

 


디폴트 메서드와 정적 메서드

어떤 인터페이스를 구현한 클래스에서 사용할 메서드가 클래스마다 같은 기능을 제공하는 경우가 있다.

자바 8부터는 이런 부분에서 인터페이스 활용성을 높이기 위해 디폴트 메서드와 정적 메서드 기능을 제공한다.

  • 디폴트 메서드: 인터페이스에서 구현코드까지 작성한 메서드
    인터페이스를 구현한 클래스에 기본적으로 제공할 메서드이다.
  • 정적 메서드:  인스턴스 생성과 상관없이 사용할 수 있는 메서드
디폴트 메서드나 정적 메서드를 추가했다고 해서 인터페이스가 인스턴스를 생성할 수 있는 것은 아니다.

 

디폴트 메서드

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

 

Calc 인터페이스에 디폴트 메서드 구현

public interface Calc {
    double PI = 3.14;
    int ERROR = -999999999;

    int add(int num1, int num2);
    int substract(int num1, int num2);
    int times(int num1, int num2);
    int divide(int num1, int num2);

    default void description(){
        System.out.println("정수 계산기를 구현합니다");
        myMethod();
    }
}

 

 

디폴트 메서드 재정의

이미 인터페이스에 구현되어 있는 디폴트 메서드가 새로 생성한 클래스에서 원하는 기능과 맞지 않는다면, 하위 클래스에서 디폴트 메서드를 재정의할 수 있다.

인터페이스를 구현하는 클래스에서 재정의할 수도 있고, 상위 클래스를 상속받은 하위 클래스에서 재정의할 수도 있다. 

public class CompleteCalc extends Calculator{
    ...
    //디폴트 메서드 descripition()을 CompleteCalc 클래스에서 원하는 기능으로 재정의
    @Override
    public void description(){
        super.description
    }
}
  • super.descripiton( )은 인터페이스에 선언한 메서드를 의미한다.
  • 이 코드를 사용하지 않는다면 지우고 새 코드를 작성하면 된다.
  • CompleteCalc 클래스로 인스턴스를 생성하여 호출하면 재정의된 메서드가 호출된다.

 

정적 메서드

정적 메서드는 static 예약어를 사용하여 선언하며, 클래스 생성과 무관하게 사용할 수 있다.

정적 메서드를 사용할 때는 인터페이스 이름으로 직접 참조하여 사용한다.

 

정적 메서드 구현

public interface Calc {
    ...
    //인터페이스에 정적 메서드 total() 구현
    static int total(int[] arr){	
        int total = 0;

        for(int i: arr){
            total += i;
        }
        return total;
    }
}
  • 매개변수로 전달된 배열의 모든 요소 값을 더하는 정적 메서드 total( )을 추가한다.
  • 메서드 자료형 앞에 static 예약어를 사용한다.

 

Private 메서드

자바 9부터 인터페이스에 private 메서드를 구현할 수 있다.

private 메서드는 인터페이스를 구현한 클래스에서 사용하거나 재정의할 수 있다.

  • 기존에 구현된 코드를 변경하지 않고 인터페이스를 구현한 클래스에서 공통으로 사용하는 경우에 private 메서드로 구현하면 코드 재사용성을 높일 수 있다.
  • 클라이언트 프로그램에 제공할 기본 기능을 private 메서드로 구현하기도 한다.
  • private 메서드는 코드를 모두 구현해야 하므로 추상 메서드에 private 예약어를 사용할 수는 없지만, static 예약어는 함께 사용할 수 있다.
  • private static 메서드는 정적 메서드에서 호출하여 사용한다.

 

private 메서드 구현

public interface Calc {
    ...
    default 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() {	//private 메서드
        System.out.println("private 메서드 입니다.");
    }

    private static void myStaticMethod() {	//private static 메서드
        System.out.println("private static 메서드 입니다.");
    }
}

 


반응형

'Back-End > Java' 카테고리의 다른 글

[Java] Object 클래스  (0) 2023.02.10
[Java] 인터페이스와 다형성  (0) 2023.02.09
[Java] 인터페이스(Interface)  (0) 2023.02.09
[Java] final 예약어  (0) 2023.02.08
[Java] 템플릿 메서드(Template Method)  (0) 2023.02.07