728x90
반응형
interface 인터페이스명 {
//상수
//추상메소드
}
- 인터페이스: 두 객체 간의 연결/대화/소통/통신 을 돕는 중간 역할(접점)
- 여러 객체들을 사용 가능 → 코드를 수정하지않고 객체를 변경할 수 있다! (인터페이스의 목적)
- 구성멤버: 상수와 메소드(추상메소드, 정적메소드, 디폴트메소드)
- 인터페이스에 선언된 모든 메소드는 구현부가 없는 추상메소드로 선언 (인터페이스 = 추상메소드의 집합) (컴파일러가 public abstract 자동추가)
- 인터페이스에 선언된 필드는 모두 상수이다. (컴파일러가 public static final 자동추가)
- 인터페이스의 구현: 구현객체(구현클래스)가 인터페이스에 선언된 추상메소드를 완성한다.
class 클래스명 implements 인터페이스명 { //구현클래스 (구현객체를 생성하는 클래스)
//인터페이스에 선언된 추상메소드를 모두 구현
//모든 메소드에 public 붙인다
}
- 인터페이스의 모든 메소드에 public 붙인다.
- 일부만 구현한 경우, 클래스 선언부에 abstract 붙인다.
- 다중인터페이스 구현 클래스: 다수의 인터페이스 사용 가능 (인터페이스명을 2개 선언하면, 객체는 이 2개의 인터페이스의 추상메소드를 모두 구현해야 한다.)
- 인터페이스는 구현클래스의 부모
- 인터페이스의 사용
- Vehicle 인터페이스로 구현 객체인 Bus를 사용하려면, 다음과 같이 타입변수 v를 선언하고 구현 객체를 대입한다.
Vehicle v=new Bus(); //인터페이스 변수 = 구현객체;
Vehicle v=new Train();
v.run(); //Bus의 run() 실행
- 인터페이스를 통한 다형성
- 메소드의 리턴타입으로 인터페이스를 지정할 수 있다.
class Fighter implements Fightable{ //구현클래스
//내용 생략
}
Fightable method(){
Fighter f=new Fighter();
return f;
//return new Fighter();
//Fightable인터페이스를 구현한 클래스의 객체를 반환
}
- 매개변수의 다형성
- 매개변수를 인터페이스 타입으로 선언할 수 있다.
- 인터페이스타입 매개변수는 인터페이스를 구현한 클래스의 객체만 가능하다
class Driver{
void drive(Vehicle vehicle){ //매개변수의 인터페이스화
vehicle.run(); //구현클래스의 run()메소드가 실행
}
}
interface Vehicle{
void run();
}
class Bus implements Vehicle{ //구현클래스
@Override
void run(){ System.out.println("bus is running");
}
class Taxi implements Vehicle{ //구현클래스
@Override
void run(){ System.out.println("taxi is running");
}
- Driver의 drive()메소드 호출할 때, Bus 객체를 생성해서 매개값으로 줄 수 있다.
Driver driver=new Driver();
Bus bus=new Bus();
driver.drive(bus); //자동타입변환
//drive(Vehicle vehicle) =>Vehicle을 구현한 Bus객체가 매개값으로 사용되면 자동타입변환
- Driver클래스를 이용해서 실행하는 DriverEx클래스
public class DriverEx{
public static void main(String[] args){
Driver driver =new Driver();
Bus bus=new Bus();
Taxi taxi=new Taxi();
driver.drive(bus); //자동타입변환
driver.drive(taxi); //자동타입변환
}
}
- 디폴트메소드: 기존 인터페이스를 확장해서, 인터페이스에 새로운 메소드(구현클래스에 없는 메소드)를 추가
- 디폴트메소드는 추상메소드가 아닌 인스턴스메소드이므로, 구현객체가 있어야 사용할 수 있다.
- 디폴트메소드가 기존의 메소드와 충돌할때의 해결책? 직접 오버라이딩하기
- 여러 인터페이스의 디폴트메소드 간의 충돌: 인터페이스를 구현한 클래스에서 디폴트메소드를 오버라이딩해야한다.
- 디폴트메소드와 조상클래스의 메소드 간의 충돌: 조상클래스의 메소드가 상속되고, 디폴트메소드는 무시된다.
interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2 { ... }
- 인터페이스의 상속: 인터페이스의 조상은 인터페이스만 가능
- 다중상속을 허용 (추상메소드는 충돌해도 문제없기 때문)
- 추상클래스와 인터페이스
- 공통점? 추상메소드를 갖는다.
- 차이점? 인터페이스는 iv(인스턴스 변수)를 가질 수 없다.
728x90
반응형
'Java Tutorial' 카테고리의 다른 글
[Java] Map컬렉션 (1) | 2024.07.14 |
---|---|
[Java] 스트림 (Stream) +Optional 클래스 (0) | 2024.07.02 |
[Java] StringBuilder 클래스 (0) | 2023.07.24 |
[Java] 예외 처리 (0) | 2023.07.02 |
[Java 필수 기초 지식] 클래스 (생성자, 필드, 메소드) (0) | 2023.06.06 |