5. 인터페이스 ( interface )
1) 문법:
public interface 인터페이스명 {
int NUM = 20; // public static final int NUM = 20; 동일
abstract void a( ); // default 가 아니고 public
void b( ); // public abstract void b( ) 동일
}
인터페이스명.java 로 저장됨
2) 구성요소 4가지:
- 상수: final int NUM = 20;
==> public static final 지정자가 자동으로 지정된다.
==> 접근은 인터페이스명.상수명 으로 사용한다.
( 인터페이스.NUM )
- default 메서드
==> public default 리턴타입 메서드명 ( [변수,...] ) { 실행문; }
==> 클래스의 인스턴스 메서드처럼 동작된다.
따라서 default 메서드는 new 한 후에 사용이 가능하다.
- static 메서드
==> public static 리턴타입 메서드명 ( [변수,...] ) { 실행문; }
==> 클래스의 static 메서드처럼 동작된다.
- 추상 메서드 ( abstract method )
==> public abstract 리턴타입 메서드명 ( [변수,...] );
==> public abstract 지정자가 자동으로 지정된다.
따라서 abstract 키워드는 생략할 수 있다.
( 추상클래스의 추상메서드는 abstract 필수 )
ex)
public interface Flyer {
void a ( ); // 권장안함.
void b ( ); // 권장안함.
public abstract void c ( ); // 권장
}
3) 특징:
- 불완전 객체이다. 따라서 객체생성( new ) 불가.
- 불완전한 객체인 자신은 인스턴스가 안되지만
상속이 아닌 구현을 통한 자식 클래스를 이용해서 인터페이스의
구성요소를 인스턴스화 할 수 있다.
ex)
* 같은종이면 실선
클래스(큰타입) 추상클래스(큰타입)
| ( 삼각형 실선 ) | ( 삼각형 실선 )
클래스(작은타입) 클래스(작은타입)
-> 상속관계 > 상속관계
-> 단일상속 -> 단일상속
-> extends -> extends
-> 다형성 -> 다형성
-------------------------------------------------------
인터페이스(A)(큰타입) 인터페이스 (B)(큰타입)
| |
| ( 삼각형 점선 ) | ( 삼각형 점선 )
| |
클래스(작은타입) 클래스(작은타입)
-> 구현관계(준상속관계)
-> 다중구현
-> implements A, B
-------------------------------------------------------
인터페이스 인터페이스
| (삼각형 실선)
인터페이스
-> 상속관계 ( 다중상속 )
-> extends A,B
하위클래스:
public class B implements A {
// 준부모(interface)의 상수 사용
// 준부모의 default 메서드 사용
// 준부모의 static 메서드 사용
// 준부모의 추상 메서드를 반드시 오버라이딩( overriding ) 해야하는
제약이 붙는다. 만약에 추상메서드를 오버라이딩하지 않으면 에러가
발생한다.
}
- 구현은 implements 키워드를 사용
- 다중 구현이 가능하다. ( implements 인터페이스, 인터페이스2, ... )
- 인터페이스간에도 상속관계이다.
( 인터페이스 extends 인터페이스, 인터페이스2,... )
- 타입으로 인터페이스가 큰 타입이기 때문에 다형성 적용이 가능하다.
- 명시적으로 인터페이스를 만드는 경우는 4가지 구성요소중
추상메서드를 사용하기 위한 것이다.
4) 목적:
목적1)
- 추상클래스와 동일하게 인터페이스에서 지정된 추상메서드명으로
하위 클래스에서 사용하도록 강제할 수 있다.
<추상 클래스 Pet 인경우>
abstract Pet
- name, age
- abstract eat( ){ }
// 자식인 Cat, Dog, Bird,... 에서 eat( ) 메서드로만 사용하도록 강제.
interface Flyer {
abstract fly( );
}
Cat extends Pet
@Override
eat( ) { s.o.u("쩝쩝"); }
Dog extends Pet
@Override
eat( ) { s.o.u("냠냠"); }
Bird extends Pet implements Flyer
@Override
eat( ) { s.o.u("짹짹"); }
@Override
fly( ) { }
Bat extends Pet implements Flyer
@Override
eat( ) { s.o.u("찍찍"); }
@Override
fly( ) { }
목적2)
- 다음시간에....
package exam16_interface;
// 인터페이스
interface A {
public static final int NUM = 10; // 상수권장코드
int size = 20; // public staitc final 이 자동으로 지정 (권장x)
public default void a(){}
public static void b(){}
// 추상메서드
public abstract void c(); // 권장
void d(); // public abstract 자동으로 지정됨.(권장x)
// 따라서 abstract 키워드 생략 가능
}
interface A2 {
// void e(); // 재정의하지않아서 오류가 발생
}
interface F extends A, A2 { // 인터페이스간에는 다중상속 가능.
}
class B implements A, A2 { // 다중구현
@Override
public void c() {}
@Override
public void d() {}
}
public class interfaceTest {
public static void main(String[] args) {
// A a = new A(); // 객체생성 불가
B b = new B(); // 하위클래스를 통해서 인터페이스의 요소를 인스턴스화 한다.
System.out.println(A.NUM); // 상수 호출
System.out.println(A.size); // 상수 호출
b.a(); // default 메서드 호출
A.b(); // static 메서드 호출
b.c(); // 재정의된 메서드 호출
b.d(); // 재정의된 메서드 호출
// 다형성 적용
A b2 = new B(); // interface A > class B ; 다형성
}
}
'Programming > JAVA(eclipse)' 카테고리의 다른 글
java 10일차 _01. 인터페이스 (0) | 2024.03.21 |
---|---|
java 10일차 _ 9일차 정리 (0) | 2024.03.21 |
java 9일차 _ 04. 추상클래스(2) (0) | 2024.03.20 |
java 9일차 _04. 추상클래스 (0) | 2024.03.20 |
java 9일차 _03. 접근지정자 (0) | 2024.03.20 |