Java

Java, interface(is~a 관계) / 익명 inner class

greenyellow-s 2024. 7. 23. 09:45

 

interface

 

표준명세서의 역할을 한다.

interface안에는 상수와 추상 메소드만 존재하기 때문에

public static final과 abstract는 생략이 가능하다.

 

interace를 implements 한 클래스는 반드시 추상메소드를 Override 해주어야 한다.

Override 할때는 반드시 public을 붙여야한다.

 

다중 상속이 가능하며 상속과 같이 쓰일 때는 extends, implements 순서로 쓴다.


[형식]

interface 인터페이스명{  }

class 클래스명 implements 인터페이스명{  }

 

상속(extends)각각 클래스는 클래스끼리, interface는 interface끼리만 가능하다.

인터페이스(implements)는 인터페이스가 인터페이스를 연결 하지 못한다.

 

 interface InterB implements InterA{} --- 불가능

 

class B extends A{} -- 0
class B implements InterA{} -- 0

interface InterB extends InterA{} -- 0

 


interface : A.java, B.java, C.java

class :  Main.java

를 생성하고

 

interface A, B를 C에 상속하여

package interface_;

public interface C extends A, B{ // 다중 상속 가능
}

 

Main.java에서 C interface만 implements로 연결해주면

package interface_;
public class Main implements C {
	
	public void aa() {}
	public void bb() {}
	public void cc() {}
	public void dd() {}

	public static void main(String[] args) {
	}
}

 

A, B interface 모두 연결하겠다 라는 의미이다.

단, A,B,C interface에 있는 모든 추상 메소드를 Override 해줘야 한다.


Override를 Main에서 안했을 경우 Main의 자식 클래스가 물려받아 Override 해줘야 한다.


 

interface를 사용하려면

 

1.implements InterA

모든 추상 메소드를 Override 해줘야한다.

단점, Collection 같은 경우는 15개정도의 추상 메소드가 있기 때문에 너무 많아서 코드가 길어지고 힘들다.


2. 대신 Override 해주는 클래스를 이용

Collection의 자식 클래스를 이용해서 Override를 한다.

3. 메소드

인터페이스를 생성해주는 메소드를 사용한다.

4. 익명 inner class

1회성으로 사용할 때 쓰인다.

new class() {
	메소드 (){
		//구현
	}
}

// AbstractMain$1.class // 익명 inner class 파일명

 

 

interface의 추상메소드의 구현물을 가질 수 있는 건 class 밖에 없다.

따라서, 클라스 이름은 없지만 익명으로 클래스 처리해주는 방법이다.


 

추상 메소드는 꼭 추상 클래스 안에 있어야 하지만 추상 클래스 안에는 꼭 추상 메소드가 있을 필요는 없다.

 

 

추상 클래스는 new로 생성할 수 없다(객체 생성 안됨)

 

따라서, 자식 클래스가 추상 클래스를 Override 해주어야 한다.

이때 자식 클래스는 개발자가 원하는 메소드를 선택해서 Override하면 된다.