본문 바로가기

JAVA

인터페이스 - 6주차

인터페이스

- 클래스 간의 상속과 관련이 있음

 

*상속의 장점 : 공통되는 코드를 상위 클래스에 모아두면, 수정할 일이 생겼을 때 상위 코드만 수정하면 됨. -> 하위 코드도 함께 수정되기 때문. => 코드의 재사용성과 유지 보수성이 높아짐.

*사람과 자동차는 Run이라는 기능을 수행할 수 있는데, 이에 대한 부모클래스를 정의할 수 없음. 즉 상속 이용 불가 => 인터페이스 등장

 

인터페이스 정의 (클래스와 비슷)

public interface 인터페이스_이름 {
	public 반환형 추상메소드1(...);
	public 반환형 추상메소드2(...);
}

* 인터페이스는 첫 글자를 대문자로 하는 것이 좋음

* 인터페이스 안에는 소속변수, 생성자, 일반 메소드 정의 불가. 추상메소드만 가능

* public 여부는 선택임

* extends 키워드로 다른 인터페이스 상속 가능

 

+) 추상메소드란?

- body가 없는 메소드

+) 추상메소드 정의 방법

1. void 추상메소드();

2. abstract 추상메소드();

3. public void 추상메소드();

4. public abstract void 추상메소드();

 

인터페이스 구현 : 인터페이스에 정의된 추상 메소드의 몸체를 구현하는 방법

- 인터페이스만으로는 객체 생성 불가함

- 클래스가 인터페이스를 구현하기 위해서는 implement 키워드 사용

ex. Television 클래스가 RemoteControl 인터페이스를 구현하기 위한 문법

public interface RemoteControl {
     public void turnOn();
     public void turnOff();
}

class Televison implements RemoteControl {
     boolean on;
     
     public void turnOn() {
          (...)
     }
     
     public void turnOff() {
          (...)
     }
}

- 인터페이스를 어떤 클래스가 사용하기 위해서는 인터페이스에 포함된 모든 추상 메소드를 구현해야 함.

 

주의사항

- 인터페이스로 객체를 만들 수 없음. 단, 참조변수는 정의할 수 있음

- 인터페이스 참조변수는 인터페이스를 구현한 모든 클래스 객체를 가리킬 수 있음. (업캐스팅)

RemoteControl obj1 = new RemoteControl(); //컴파일 오류

RemoteControl obj2 = new Television(); // 올바른 코드
obj2를 통해 메소드, 소속변수 등 접근 가능

 

인터페이스 간의 상속

+) 상속될 때 사용하는 키워드

클래스 -> 클래스 : extends

인터페이스 -> 클래스 : implements

인터페이스 -> 인터페이스 : extends

 

* extends 뒤에는 1개 밖에 못 씀

* implements 뒤에는 여러 개 사용 가능함

 

이런 인터페이스가 있다고 가정 여기에 두 개의 추상메소드를 더 추가하고 싶다면?

public interface RemoteControl {
     public void turnOn();
     public void turnOff();
}

 

추가는 가능하나, 추상메소드는 모두 구현이 필요하기 때문에 모든 클래스가 동작하지 않음

public interface RemoteControl {
     public void turnOn();
     public void turnOff();
     
     public void volumUp();
     public void volumDown();
}

 

그래서 인터페이스도 상속 받아서 확장 시킬 수 있게 함

public interface AdvanceRemoteControl extends RemoteControl {     
     public void volumUp();
     public void volumDown();
}

 

* 클래스 상속과 인터페이스 구현 둘 다 가능함
-> public class A extends B implements C

 

인터페이스 안의 업캐스팅

interface Drivable { void drive(); }
interface Flyable { void fly(); }

public class Test implements Drivable, Flyable {
	public void drive() { System.out.println("Im driving."); }
	public void fly() { System.out.println("Im flying"); }
	
    public static void main(String[] args) {
        Test obj = new Test();
        
        obj.drive();
        obj.fly();
        
        Drivable d = obj; //인터페이스 Drivable 참조 변수가 obj가 가리키는 것을 가리킴
        d.drive(); //실행 가능
        //d.fly(); //실행 불가
        
        Flyable f = obj; //인터페이스 Flyable 참조 변수가 obj가 가리키는 것을 가리킴
        //f.drive(); //실행 불가
        f.fly(); //실행 가능
    }
}

//출력 결과
Im driving.
Im flying
Im driving.
Im flying

'JAVA' 카테고리의 다른 글

제네릭 - 객지설 10주차  (0) 2024.05.17
예외 처리 - 객지설 7~9주차  (0) 2024.05.10
다형성 - 객지설 5주차  (0) 2024.05.04
랩퍼 클래스 - 객지설 4주차  (0) 2024.05.03
객프 13주차  (0) 2023.11.29