본문 바로가기
Java Tutorial

[Java] 인터페이스 (interface)

by 미소5 2024. 6. 16.
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); //자동타입변환
    }
}

 

 


  •  디폴트메소드:   기존 인터페이스를 확장해서, 인터페이스에 새로운 메소드(구현클래스에 없는 메소드)를 추가 
    • 디폴트메소드는 추상메소드가 아닌 인스턴스메소드이므로, 구현객체가 있어야 사용할 수 있다.
    • 디폴트메소드가 기존의 메소드와 충돌할때의 해결책? 직접 오버라이딩하기
      1.  여러 인터페이스의 디폴트메소드 간의 충돌: 인터페이스를 구현한 클래스에서 디폴트메소드를 오버라이딩해야한다.
      2.  디폴트메소드와 조상클래스의 메소드 간의 충돌: 조상클래스의 메소드가 상속되고, 디폴트메소드는 무시된다.

interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2 { ... }
  • 인터페이스의 상속:     인터페이스의 조상은 인터페이스만 가능
    • 다중상속을 허용 (추상메소드는 충돌해도 문제없기 때문)

  • 추상클래스와 인터페이스
    • 공통점? 추상메소드를 갖는다.
    • 차이점? 인터페이스는 iv(인스턴스 변수)를 가질 수 없다.

 

728x90
반응형

'Java Tutorial' 카테고리의 다른 글

[Java] Map컬렉션  (1) 2024.07.14
[Java] 스트림 (Stream) +Optional 클래스  (0) 2024.07.02
[Java 필수 지식] 접근제어자  (0) 2024.06.08
[Java] StringBuilder 클래스  (0) 2023.07.24
[Java] 예외 처리  (0) 2023.07.02