본문 바로가기
Programming/JAVA(eclipse)

java 9일차 _05. 인터페이스

by yoon9i 2024. 3. 20.

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