녕의 학습 기록

[Java] 인터페이스 본문

Dev/Java

[Java] 인터페이스

kjyyjk 2022. 8. 6. 18:41

인터페이스란 객체의 사용 방법을 정의한 타입이다.

 

인터페이스를 두는 이유는 개발 코드를 수정하지 않고, 사용하는 객체를 중간에 변경할 수 있도록 하기 위해서이다.

 

즉, 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라 다양한 결과값을 가진다.


public interface RemoteControl{}
//RemoteControl이라는 인터페이스 선언

일반 클래스는 필드 / 생성자 / 메서드를 멤버로 가지지만, 인터페이스는 상수 / 메서드만을 가진다.

 

public interface GameRule{
    //상수
    int time= 30;
    public static final int player = 2;
    
    //추상 메서드
    void gameSetting(//매개변수);
    
    //디폴트 메서드
    void gameReset(//매개변수){
        System.out.println("게임을 리셋합니다.");
    }
    
    //정적 메서드
    static void Start(){
        System.out.println("게임을 시작합니다.");
    }


}

 

인터페이스에서는 상수필드만 선언이 가능하다.

 

그렇기 때문에 인터페이스의 구성 필드는 전부 public static final의 특성을 가진다.(생략해도 자동으로)

 

public class Chess implements GameRule(){
	//인터페이스 내 추상 메서드의 실체 메서드를 선언해준다
}
public class Chess implements GameRule(){ //GameRule인터페이스를 구현한 Chess 구현클래스
    public void gameSetting(){
        System.out.println("체스로 세팅합니다"); //추상메서드의 실체 메서드 선언
    }
}

 

만약에 인터페이스 내 추상 메서드의 실체 메서드를 구현해주지 않는다면,

 

구현 클래스는 추상 클래스가 되기 때문에 선언부에 abstract 키워드를 붙여야한다.


인터페이스는 상속과는 다르게 다중 상속?이 가능하다.

 

public class A implements B, C {
    //B에 해당하는 실체 메서드
    //C에 해당하는 실체 메서드
}

인터페이스의 사용

GameRule ch;    //인터페이스 변수가

ch = new Chess();    //구현 객체 참조.
GameRule ch = new Chess();

 

인터페이스 변수 Ch가 구현 객체를 참조하기 때문에 변수 Ch에는 객체의 번지수를 저장한다.

 

public class PinBall implements GameRule(){
    public void gameSetting(){
        System.out.println("핀볼로 세팅합니다"); 
    }
    
    public void gameReset(){  //인터페이스의 디폴트 메서드를 오버라이딩
        System.out.println("핀볼 리셋합니다");
    }
}
public class Test{
    public static void main(String[] args){
    
    GameRule ch = new Chess();    //Chess 객체를 대입
    ch.gameSetting();   //결과 : 체스로 세팅합니다.
    ch.gameReset();  //디폴트 메서드는 구현 객체 모두가 가지는 기본 메서드
                     // 결과 : "게임을 리셋합니다"
    
    ch = new PinBall();    //PinBall 객체를 대입
    ch.gameSetting();    //핀볼로 세팅합니다.
    ch.gameReset(); //구현 클래스에서 오버라이딩 했으므로 다른 결과
                    // 결과 : "핀볼 리셋합니다."
    }
}

 

외에 인터페이스의 정적 메서드는 객체 필요 없이 인터페이스로 바로 호출 가능하다.

public class Test{
    public static void main(String[] args){
        GameRule.gameStart(); //객체 없이 바로 정적 메서드 호출
    }
}