이번에는 인터페이스에 대해 알아보겠다.
인터페이스는 자바에서 매우 중요한 개념이다.
인터페이스란?
interface가 뭘까? 아마 대충 interaction(상호작용)과 비슷한 말일 것이다.
prefix inter는 between / among이라는 뜻이다.
인터페이스(interface)의 뜻은 아래와 같다.
Interface :
"a connection between two pieces of electronic equipment, or between a person and a computer"
"두 전자기기를 연결해주는 매개체 또는 사람과 컴퓨터를 이어주는 매개체"라고한다.
아무튼 서로다른 두 객체를 연결하는 매개체를 뜻한다.
자바에서 인터페이스는
- 하위 클래스들에 대한 규격을 만들어주기도하고 (강제성)
- 클래스들을 이어주는 매개체 역할을 담당하기도한다. (형변환)
인터페이스의 강제성에 대해 설명하겠다.
인터페이스는 하위 클래스에게 필수적으로 지켜야할 규격을 만든다.
인터페이스에는 주로 추상메소드를 넣는데 이로인해 하위 클래스들의 형태에 대한 강제성이 성립된다.
하위 클래스에서는 반드시 추상메소드를 정의해야한다. (오버라이드)
여기서 추상클래스와 인터페이스의 차이점을 한번 집고가겠다.
인터페이스는 다중상속이 된다.
추상클래스는 다중상속이 안된다. 오버라이딩시 충돌이 일어난다.
interface 키워드를 사용해 인터페이스를 정의하고
implements 키워드를 사용해 인터페이스를 구현(implement)한다.
아래의 예제를 통해 설명하겠다.
- 우선 변수 pi가 선언되었는데 pi를 잘보면 약간 누워있다. 이는 final 키워드 때문인데 인터페이스에서 생성되는 모든 변수는 final이 자동으로 붙는다.
- 추상메소드 getArea가 선언되었다. 하위클래스에선 반드시 getArea를 오버라이딩해야한다.
- 디폴트 메소드 print가 선언되었다. 오버라이딩을 해도되고 안해도 된다.
- 스태틱 메소드 hi가 선언되었다. 하위클래스에서 오버라이딩이 불가능하다.
위의 예제에서는 인터페이스에 들어갈 수 있는건 모두 넣었다.
설명을 위해 넣었음으로 필요한 부분을 제외하고 다 지우겠다.
- Rectangle이 Polygon을 구현한다. printArea를 오버라이드했다.
- Triangle이 Polygon을 구현한다. printArea를 오버라이드했다.
해당 예제에선 코드주석에 //interface 상속이라고 적었지만 상속이 아니라 구현으로 생각해야한다.
아래의 메인 클래스를 통해 사용해보겠다. 총 2번 사용하겠다.
- 1번
- 참조변수 polygon은 Rectangle를 참조하고있다.
- width와 height를 사용자로 부터 입력받아서 출력 후
- printArea메소드를 사용했다.
아래는 또 다르다.
- 2번
- 참조변수 polygon은 Triangle을 참조하고있다.
- width와 height를 사용자로 부터 입력 받아서 출력 후
- printArea메소드를 사용했다.
이런게 가능한 이유는 Triangle과 Rectangle은 인터페이스를 구현한 클래스이기 때문이다.
이와같이 인터페이스 Polygon은 메인클래스와 Rectangle 또는 Triangle을 이어주는 매개체 역활을 한다.
메인클래스의 어떠한 코드 변경도 없이 그저 참조변수 polygon이 무엇을 참조하는지만 바꿔주면 다 작동한다.
이는 인터페이스가 강제한 하위클래스들에 대한 규격으로 인한 호환성,
호한성을 바탕으로 형변환이 가능한 것이다.
애초에 인터페이스는 객체를 생성할 수 없다. 인터페이스는 클래스를 통해 구현되어야 실질적으로 사용이 가능한 것이다.
인터페이스 Polygon은 Triangle 또는 Rectangle을 받기위한 임시의 이름을 뿐인 것이다.
실제로 polygon은 Triangle과 Rectangle을 참조한다.
따라서 인터페이스를 상속이라고 생각하면 안된다.
인터페이스 Polygon을 사용하면 어떠한 다각형이든 구현만 한다면 main 클래스에서 이상 없이 사용할 수 있다.
'Java > Java 기초' 카테고리의 다른 글
[Java] 오브젝트 클래스 (Object Class) (0) | 2022.04.20 |
---|---|
[Java] 스태틱, 싱글톤 패턴 (static, singleton pattern) (0) | 2022.04.18 |
[Java] 추상메소드, 추상 클래스 (Abstract Method, Abstract Class) (0) | 2022.04.15 |
[Java] 객체지향 언어 특징(캡슐화 Encapsulation) (0) | 2022.04.15 |
[Java] 객체지향 언어 특징(다향성 Polymorphism) (0) | 2022.04.15 |