728x90

인터페이스

//인터페이스의 선언
interface 인터페이스명 {
	//메소드는 public과 abstract는 자동으로 지정되기 때문에 생략 가능
    //변수도 마찬가지로 항상 자동으로 public static final로 지정
	//상수
    //클래스 메소드
    //추상 메소드
}

//다중 상속
interface 인터페이스1 extends 인터페이스2, 인터페이스3 { }

//인터페이스의 구현
class 클래스명 implements 인터페이스명 { // 클래스가 인터페이스를 구현했다는 의미
	//인터페이스의 추상 메소드를 모두 구현하기
}

//인터페이스를 이용한 다형성
class 클래스명 extends 부모클래스명 implements 인터페이스명 { }

//부모 클래스나 인터페이스로 자식클래스의 객체를 참조할 수 있음
부모클래스 참조변수 = new 자식클래스();
인터페이스 참조변수 = new 자식클래스();

//매개변수의 다형성
interface Fight {
	void attack(Fight f); //인터페이스 타입과 일치하는 값만 매개변수로 받겠다는 뜻
} //해당 인터페이스를 구현한 클래스의 인스턴스만 사용 가능

//리턴타입의 다형성 : 해당 인터페이스를 구현한 클래스의 인스턴스를 반환
Fightable method() { //인터페이스를
	Fight f = new Fight();
    return f; //메소드의 리턴타입으로 지정
    //return new Fight() // 같은 내용
}
Fightable f = method();
Fightable f = new Fight();

추상 메소드의 집합 + 상수, 스태틱 메소드, 디폴트 메소드

구현된 것이 하나도 없는 설계도로 모든 멤버가 public으로 지정 됨 

추상 클래스와의 차이점

추상 클래스는 클래스의 구성요소를 모두 가지고 추상 메소드를 가진 클래스

인터페이스는 인스턴스 변수, 생성자, 인스턴스 메소드를 가질 수 없고 추상 메소드만 가질 수 있음

인터페이스의 상속

인터페이스의 조상은 인터페이스만 가능

Object는 인터페이스의 최고 조상이 아님

클래스와는 다르게 다중 상속이 가능하고 추상 메소드가 충돌해도 문제가 없음(구현부가 없기 때문에)

인터페이스의 구현

클래스에 구현할 인터페이스를 가져와서 인터페이스 내의 추상 메소드를 모두 구현

인터페이스 내의 추상 메소드를 모두 구현하지 못할 경우 클래스 선언부 앞에 abstract를 붙여야 함

인터페이스의 다형성

인터페이스도 구현 클래스의 부모라고 볼 수 있음

기존 클래스의 상속은 다중 상속이 불가능했지만 인터페이스를 사용하면 몸통이 없는 메소드끼리

충돌을 하는 경우는 상관이 없이 때문에 다중 상속과 비슷하게 사용 가능

또한, 인터페이스를 메소드의 리턴 타입으로 지정할 수 있음

인터페이스의 장점

  • 두 대상(객체) 간의 연결, 대화, 소통을 돕는 중간 역할
  • 선언(설계, 클래스 내의 메소드의 선언부만 따로 떼어서 인터페이스의 추상 메소드로 만드는 것)과
  • 구현(클래스에서 인터페이스를 완성시키는 과정. 추상 메소드를 구체화하는 것)을 분리시킬 수 있음
  • 클래스와 조상클래스의 상속 관계보다 느슨한 결합 상태이기 때문에
  • 클래스의 내용이 바뀌어도 인터페이스를 바꿀 필요는 없음
  • 즉, 클래스-클래스 관계는 의존 관계지만 클래스-인터페이스-클래스 관계로 만들면
  • 클래스끼리의 관계가 없어지게 되고 두 클래스는 모두 인터페이스랑만 관계가 있음
  • 코드가 더 유연해지고 변경에 유리
  • 인터페이스만 있으면 양쪽 클래스 모두 개발을 할 수 있어져서 개발 시간을 단축
  • 표준화가 가능 (예: JDBC)
  • 서로 관계 없는 클래스들을 관계를 맺어줄 수 있음

(default) / static 메소드

인터페이스에 새로운 메소드를 추가하기 어려워 JDK 1.8 버전부터 추가

디폴트 메소드 간의 충돌 시 조상 클래스의 메소드만 상속되고 인터페이스의 디폴트 메소드는 무시되서 상관 없음

추상 메소드 간의 충돌 시 인터페이스를 구현한 클래스에서 디폴트 메소드를 오버라이딩 해줘야 함

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

예외  (0) 2023.04.29
내부 클래스  (0) 2023.04.25
추상화  (0) 2023.04.25
다형성  (0) 2023.04.24
제어자와 캡슐화  (0) 2023.04.24

+ Recent posts