본문 바로가기
Language/Java

JAVA입문-7 [인터페이스(interface)와 다른 형식의 클래스(class)]

by 드럼치는 코린이 2021. 3. 5.
728x90
반응형


[인터페이스 만들기]

인터페이스를 왜 쓸까?

객체에 무슨 기능을 가지면 좋을까 고민하는데 구현하지 않고 그 기능들을 가지고 있는 것을 인터페이스라고 한다.

예) TV - 켜고 끄는 기능, 볼륨 조절 기능, 채널 변경 기능 등..

여기서 중요한 점은 메서드를 구현하기는 애매할 때 추상메서드(abstract)를 활용했는데, 인터페이스 자체는 구현하지는 않고 어떤 기능이 있으면 좋을지까지만 선언하는 것이기 때문에 굳이 abstract를 붙이지 않아도 오류를 발생하지 않는다.


ex. 인터페이스에 상수를 선언해 기능의 한도를 고정할 수 있는데 이 때 final를 사용하지 않아도 상수처럼 사용할 수 있다. 


인터페이스는 자체적으로 타입의 역할은 할 수 있지만 구현을 하지 않기 때문에 인터페이스 자체가 객체를 생성할 수는 없다.


[인터페이스 사용하기]

인터페이스를 통해 기능을 정의만 했지 실제 구현하지 않았기 때문에 인터페이스만 갖고 무언가 사용할 수는 없다.

그래서 인터페이스를 구현하여 사용하는 방법을 알아보자.


ex. 클래스를 상속할 때는 superclass의 Browse...를 통해 상속했는데, 인터페이스는 interfaces의 Add... 를 통해 상속하면 된다.

TV 인터페이스를 상속받는 LedTV클래스를 만들면 eclipse가 자동적으로 TV 인터페이스에서 만든 메서드를 만들어준다.


 

ex. TV인터페이스의 기능을 간단하게 구현해보자.

1. 각 메서드에 출력할 내용을 구현

2. 참조변수의 타입으로 인터페이스도 타입이 될 수 있고, 인터페이스가 가진 메서드만 LedTV를 통해 구현하여 사용할 수 있다.

만약, LedTV가 TV 인터페이스가 가지지 않은 기능들을 확장해 사용하고 있거나, 기능들을 더 사용하고 싶다면 클래스의 형변환을 이용하여 사용할 수 있다.


인터페이스를 사용해야 하는 중요한 이유?

TV인터페이스를 구현하는 클래스가 LedTV만 있는 것이 아닌 LcdTV 등 다른 TV를 만들었다면 LedTV를 만든 것과 같이 똑같은 방법으로 TV 인터페이스를 상속받는 LcdTV를 만들어 구현할 수 있는데, 여기서 LedExam에서 사용하고 있던 LedTV클래스에서 LedTV를 LcdTV로 변경만 해주면 나머지 부분은 똑같이 동작을 할 수 있다.

즉, 동일한 인터페이스를 구현한다는 것은 클래스의 사용법이 똑같다는 것을 의미.


+ 인터페이스의 상수는 변경할 수 없으므로 변경하고 싶다면 인터페이스를 상속받고 있는 클래스에 선언을 하므로 변경할 수 있다.


[인터페이스의 default method]

기존에 인터페이스는 추상메서드만 가질 수 있었는데 Java8부터는 default method와 static method도 정의할 수 있게 되었다.


ex. default method를 활용한 인터페이스 구현

1. Calculator 인터페이스를 만들고 더하고 곱하는 기능을 만든 후 default method를 만들 수 있다.

2. Calculator 인터페이스를 구현하는 클래스를 만들고 리턴 값을 수정해준다.

3. 사용할 수 있는 MycalTest를 만들고 인터페이스를 타입으로하는 Mycal를 생성하고 구현해볼 수 있고, default method도 사용 가능.

4. + Calculator 인터페이스에 있는 default method를 변경하여 사용하고 싶다면 Calculator의 default method를 상속받는 Mycal클래스에 오버라이드 하여 변경 사용할 수 있다.


ex. static method도 사용 가능

1. static한 메서드 정의 가능

2. 인터페이스에서 정의한 static한 메서드는 반드시 인터페이스명.메서드명 으로만 호출이 가능하다.


[내부 클래스] : 클래스 안에 선언된 클래스

내부 클래스는 어느 위치에 선언되느냐에 따라 4가지 형태로 나뉠 수 있다.


ex. 1번 형태 : 클래스안에 인스턴스 변수, 즉, 필드를 선언하는 위치에 선언하는 경우 (중첩 클래스 or 인스턴스 클래스)

1. 내부 클래스안에는 필드나 메서드를 만들 수 있다.

2. 내부에 있는 클래스를 사용하기 위해서는 먼저 외부 클래스가 먼저 만들어져야 한다. 즉, 내부 클래스 혼자 독자적으로 생성될 수는 없다.


ex. 2번 형태 : 정적 중첩 클래스 또는 스태틱 클래스(static class)

여기서 static을 사용하는 Cal은 정적 필드와 같기 때문에 외부 클래스를 생성할 필요가 없이 내부 클래스에 바로 접근이 가능하다.


ex. 3번 형태 : 지역 중첩 클래스 또는 지역 클래스(local class)

내부 클래스가 인스턴스 변수로 선언되는 것이 아닌 메서드 안에서 내부 클래스가 선언되는 경우를 말한다.

그리고 Cal객체의 사용은 메서드안에서만 가능하기 때문에 메서드 안에서 Cal객체를 생성한다.


[익명 (중첩) 클래스]

ex. 일반적인 형태의 내부 클래스

1. 추상 클래스를 사용하기 위해서는 반드시 이 클래스를 상속받은 자식클래스가 해당 메서드를 구현해야만 한다.

2. Action타입의 action을 만드는데 Action은 추상클래스이기 때문에 Action자체가 객체가 될 수 없으므로 생성은 자식클래스인 MyAction가 생성된다.


ex. 4번 형태 : 익명 (중첩) 클래스

익명 클래스는 자식 클래스인 MyAction을 만들지 않고 ActionExam클래스에서 Action클래스를 상속받는 익명클래스를 만들어 사용할 수 있다.

생성자 다음있는 {} 부분이 해당 생성자 이름의 클래스(Action)를 상속받은 이름 없는 객체인 익명클래스를 만듦.

{} 안에는 메서드를 구현하거나 추가할 수 있다.

따라서 참조변수인 action이 익명클래스를 참조하도록 함.


  • 익명클래스를 사용하는 이유

1. 특별히 상속받는 클래스를 만들 필요가 없을 때

2. 해당 클래스 외에 사용되지 않는 클래스일 경우.

728x90
반응형

'Language > Java' 카테고리의 다른 글

[Java] Java 구동 원리  (0) 2021.08.24
JAVA입문-8 (예외처리 Exception)  (1) 2021.03.05
JAVA입문-6 (상속)  (0) 2021.02.27
JAVA입문-5 (클래스 다듬기)  (0) 2021.02.26
JAVA입문-4 (클래스와 객체)  (2) 2021.02.21

댓글