코딩 기록들

객체지향 프로그래밍 15. 인터페이스의 여러가지 요소 본문

카테고리 없음

객체지향 프로그래밍 15. 인터페이스의 여러가지 요소

코딩펭귄 2023. 12. 17. 03:04
상수

- 모든 변수는 상수로 변환됨

- public static final

 

추상메서드

- 모든 선언된 메서드는 추상메서드

- public abstract

 

 

(자바8이후)

디폴트(default)메서드

- 구현을 가지는 메서드

- 인터페이스를 구현하는 클래스들에서 공통으로 사용할 수 있는 기본메서드

- default 키워드 사용

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

구현하는 클래스에서 재정의할수있음

@Override
public void description() {
	System.out.println("CompleteCalc에서 재정의한 default 메서드");
	//super.description();
}

- 인터페이스를 구현한( implement하는) 클래스의 인스턴스가 생성돼야 사용가능함

 

 

정적(static) 메서드

- 인스턴스생성과 상관없이 인터페이스 타입으로 사용할수있는 메서드

< 디폴트메서드 vs 정적메서드 >

- 디폴트메서드 : 나중에 인터페이스를 implement하는 클래스가 있고, 그 클래스에서 new한다음 호출될수있음

- 정적메서드 : static키워드가 붙으면 인스턴스의 생성과 상관없이 쓸수있음

- 정적메서드 : 인터페이스에서 메서드를 기본적으로 제공하고, implement되지 않더라도 인터페이스 타입으로 직접 호출해서 사용할 수 있음

- static이기 때문에 인터페이스이름으로 직접호출해서 사용가능

static int total(int[] arr) {
	int total = 0;
		
	for(int i: arr) {
		total += i;
	}
	mystaticMethod();
	return total;
}

- 기본적으로 인터페이스가 제공해야되는 기능을 구현할수있게끔 하는 기능

 

 

(자바9이후)

private메서드

- 인터페이스를 구현한 클래스에서 사용하거나 재정의 할 수 없음(privated이므로)

- default 메서드나 static 메서드에서 사용하기 위함. 즉, 인터페이스 내부에서만 사용하기 위해 구현하는 메서드

private void myMethod() {
	System.out.println("private method");
}
	
private static void mystaticMethod() {
	System.out.println("private static method");
}

 

 

 

 

예제

public interface Calc {

    double PI = 3.14; //상수
    int ERROR = -99999999;

    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 인터페이스 구현
    // 이 description이라는 메서드가 기본으로 제공되므로 default로 써도됨
    default void description(){
        System.out.println("정수의 사칙연산을 제공합니다.");
        //myMethod호출가능
        myMethod();
    }

    //정수 array가 들어오면 다 합쳐서 값을 반환해주는 정적(static)메소드
    static int total(int[] arr){
        int total = 0;
        for(int num :arr){
            total += num;
        }
        // myMethod호출가능
        mystaticMethod();
        return total;
    }

// private 메서드 구현
private void myMethod() {
    System.out.println("private method");
}

    //static메서드는 static키워드가 꼭 들어가야됨. 인스턴스생성과는 상관 없으므로
    private static void mystaticMethod() {
        System.out.println("private static method");
    }

}
//calc의 4개메서드가 아닌, 2개 메서드만 구현하므로 abstract메서드로 표현해야됨
public abstract class Calculator implements Calc {

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

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

    public static void main(String[] args) {
        //Calc'타입' 상속을 한 것. CompleteCalc만 생성할 수 있음.(Calcualtor은 abstract이기 때문에 생성)
        Calc calc = new CompleteCalc(); //타입을 calc로 했기때문에 calc. 가 쓸수있는 메서드는 calc메서드에 있는것뿐임
        int num1 = 10;
        int num2 = 2;

        System.out.println(num1 + "+" + num2 + "=" + calc.add(num1, num2));
        System.out.println(num1 + "-" + num2 + "=" +calc.substract(num1, num2));
        System.out.println(num1 + "*" + num2 + "=" +calc.times(num1, num2));
        System.out.println(num1 + "/" + num2 + "=" +calc.divide(num1, num2));

        //calc에 정의해놓은 description 호출
        calc.description();


        //total 이라는 정적메서드 사용
        int[] arr = {1,2,3,4,5};
        //호출
        System.out.println(Calc.total(arr)); //정적메서드이기때문에 인터페이스이름으로 바로호출가능

    }
}
//Calculator에서 구현하지 않은 2개메소드를 마저 구현
public class CompleteCalc extends Calculator {

    @Override
    public int times(int num1, int num2) {
        return num1 * num2;
    }

    @Override
    public int divide(int num1, int num2) {
        if( num2 == 0 ) //부모가 0이면 에러코드(-99999999) 발생
            return ERROR;
        else
            return num1 / num2;
    }

    public void showInfo() {
        System.out.println("모두 구현하였습니다.");
    }

    //이미 제공하고있는 default메서드 재정의
    @Override
    public void description() {
        // 1. 상위 클래스인,Calc의 인터페이스를 호출하는것
        super.description();

        // 2. 재정의 -> 최종 결과값이 됨
        System.out.println("CompleteCalc에서 재정의한 default 메서드");
    }
}

 

출력

10+2=12
10-2=8
10*2=20
10/2=5
정수의 사칙연산을 제공합니다.
private method
CompleteCalc에서 재정의한 default 메서드
private static method
15