본문 바로가기
Java

자바 #008_인터페이스

by haheehee 2023. 1. 17.

인터페이스(interface)

- 객체의 사용 방법을 정의한 타입

- 인터페이스를 통해 다양한 객체를 동일한 사용 방법으로 이용할 수 있음

- 다형성 구현

 

- 인터페이스의 메소드를 호출하면, 객체의 메소드가 호출된다.

- 개발 코드를 수정하지 않고도 객체 교환이 가능!!

 

- ~.java 형태 소스 파일로 작성. 컴파일러를 통해 ~class형태로 컴파일된다.

- 클래스와 물리적 파일 형태는 갖지만, 소스 작성 내용이 다르다.

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

- 인터페이스는 객체로 생성할 수 없다 => 생성자를 가질 수 없다.

interface 인터페이스명 {
    // 상수
    타입 상수명 = 값;
    // 추상 메소드
    타입 메소드명(매개변수, ...);
}

 


상수 필드 선언(constant field)

- 데이터를 저장할 인스턴스/ 정적 필드를 선언할 수 없다.

- 상수 필드만 선언 가능.

[public static final] 타입 상수명 = 값;

 

- 상수 이름은 대문자로 작성. 서로 다른 단어로 구성되어 있다면 언더바(_)로 연결해준다.

public interface ExampleTest {
    public int MAX_NUMBER = 10;
    public int MIN_NUMBER = 0;
}

 


추상 메소드 선언

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

- 인터페이스의 메소드는 실행 블록이 필요 없는 추상 메소드로 선언

 


구현 클래스 (implement class)

- 인터페이스에서 정의된 추상 메소드를 재정의해서 실행내용을 가지고 있는 클래스

- 클래스 선언부에 implements 키워드를 추가, 인터페이스 이름 명시

public class 구현클래스명 implements 인터페이스명 {
    // 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}

 

- 객체는 다수의 인터페이스 타입으로 사용할 수 있다. 

public class 구현클래스명 implements 인터페이스A, 인터페이스B {
    // 인터페이스A에 선언된 추상 메소드의 실체 메소드 선언
    // 인터페이스B에 선언된 추상 메소드의 실체 메소드 선언
}


인터페이스 사용

- 인터페이스는 필드, 매개변수, 로컬 변수의 타입으로 선언 가능

public class MyClass {
    // 필드
    RemoteControl rc = new Televesion();
    
    // 생성자
    MyClass(RemoteControl rc) {
        this.rc = rc;
    }
    
    // 메소드
    void methodA() {
        // 로컬 변수
        RemoteControl rc = new Audio();
    }
    
    void methodB(RemoteControl rc) {
        ...
    }
}

 


인터페이스의 다형성

- 인터페이스 사용 방법은 같다. -> 구현 객체를 교체하여 프로그램 실행 결과를 다양화 하는 것!!!

 

자동타입변환(promotion)

- 구현 객체와 자식 객체는 인터페이스 타입으로 자동 타입 변환 된다.

// 자동 타입 변환
인터페이스 변수 = 구현 객체;

 


매개변수의 다형성

 


강제 타입 변환(casting)

- 구현 객체가 인터페이스 타입으로 자동 변환하면 => 인터페이스에 선언된 메소드만 사용 가능!!!!

- 구현 클래스에만 선언된 필드나 메소드를 사용할 경우, 강제타입변환.

// 강제 타입 변환
구현클래스 변수 = (구현클래스) 인터페이스변수;

 

객체 타입 확인 instanceof

- 구현 객체가 변환되어 있는지 알 수 없는 상태에서 강제 타입 변환-> ClassCastException 발생

- 이럴 경우, instanceof 연산자로 확인하고, 안전하게 강제 타입 변환하기

public class Driver {
    public void drive(Vehicle vehicle) {
        if(vehicle instanceof Bus) {	// vehicle 매개 변수가 참조하는 객체가 Bus인지 조사
            Bus bus = (Bus) vehicle;	// Bus객체일 경우 안전하게 강제 타입변환
            bus.checkFare();	// Bus 타입으로 강제타입변환을 하는 이유
        }
    }
}

 


인터페이스 상속

- 인터페이스는 다중 상속이 가능하다.

public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2 {
    ...
}

 

 

 

 

 

 

 

출처 : 혼자 공부하는 자바 (신용권)

'Java' 카테고리의 다른 글

자바 #007_상속  (0) 2023.01.16
자바 : 리스트 List list = new ArrayList(); 로 사용하는 이유 (링크)  (0) 2023.01.10
자바 : 피라미드 * 만들어보기  (0) 2022.12.14
자바 #006_클래스  (0) 2022.12.12
자바 #005_참조  (0) 2022.12.12

댓글