IT/JAVA

인터페이스

So1_b 2022. 1. 27. 23:40

참고 사이트

배운 점

 

인터페이스 (interface)

interface 인터페이스 명 { ... }

- 추상 메서드의 집합 따라서 구현부{ }가 없어야 한다. 

 

- 인터페이스는 인터페이스만 조상으로 가질 수 있다. 

    (추상화 클래스는 추상화 클래스, 인터페이스를 조상으로 가질 수 있음)

    이 특성은 자바의 다중상속을 가능하게 한다.

    여러 인터페이스를 implements 키워드를 통해 상속받을 경우 메서드의 이름이 겹쳐도 

    선언부만 있기때문에 충돌ㄴㄴ

    자바에서 단일상속(extends)을 하는 이유가 여러 클래스에서 상속 받을 시 

    메서드의 선언부는 같은데 구현부가 다르면 충돌이 나는 것을 방지하기 위해서 (== 어느 메서드를 선택해?)

 

- 추상화 클래스와 마찬가지로 미완성의 성질을 띔. 따라서 상속을 통해 클래스에서 구현해야한다.

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

 

- 모든 멤버의 접근제한자는 public

 

- 인터페이스 타입의 참조변수는 그 인터페이스를 구현한 인스턴스만 가리킬 수 있다.

 

- 메서드의 리턴 타입으로 인터페이스 사용 가능 > 그 인스턴스를 구현한 클래스의 인스턴스를 반환함.

 


인터페이스 재료

      생략 가능 

1. 추상메서드

   public abstract 반환형 메서드명(); 

2. 상수

   public static final 자료형 상수명;

3. static 메서드, defualt메서드 

   인터페이스에 새로운 메서드를 추가하기 어려움 (그 인터페이스를 상속하는 모든클래스에서 다 추가된 메서드를 구현해야 하는 어려움존재) 따라서 디폴트 메서드 추가 default, static키워드 생략 불가능!!

   private메서드도 디폴트 메서드에서 호출하는 식으로 사용가능하다고 함. (시도 안해봄)

 

    * 3-1 여러 인터페이스에서 디폴트 메서드 이름 충돌 시 > 인터페이스를 구현한 클래스에서 오버라이딩

      3-2  디폴트 메서드와 조상클래스의 메서드간 충돌 시 > 조상 클래스의 메서드가 상속되고 디폴트 메서드는 무시됨.

 

장점 

1. 두 대상(객체)간 중간 역할을 담당하는 껍데기이다.

   선언부(껍데기)와 구현부(알맹이)를 분리시켜 객체 수정을 용이하게 도와줌 코드의 유연성 up

class A{
	public void method(I b) { //인터페이스 I를 구현한 클래스만 들어가라! 매개변수 (B b), (C b)
		b.method();
	}
}

interface I{
	public abstract void method();
}
//인터페이스로 클래스를 감싼다
class B implements I{
	public void method() {
		System.out.println("B클래스의 메서드");
	}
}

class C implements I{
	public void method() {
		System.out.println("c클래스의 메서드");
	}
}
public class InterfaceTest {

	public static void main(String[] args) {
		A a=new A();
		a.method(new B()); //a가 b에 의존(사용)하고 있다.
		a.method(new C());
	}

}

2. 서로 관계없는 클래스들을 관계 맺어줄수 있음.

      상속 계층도에서 공통점이 없는 일부 클래스에 기능(세부적인 기능은 각 클래스마다 다름)을 부여

      해야 할 때 굳이 오버로딩하지 않고 인터페이스의 상속을 통해 관계를 맺어줄 수 있음)

 

 

* 중첩 인터페이스

    인터페이스가 클래스의 멤버로 정의 > 특정 클래스에서 사용하는 인터페이스를 만들고 싶을 때 사용

     인스턴스 멤버, static 멤버 둘다 가능