Programing Language/Java

[Java] 인터페이스(Interface)

vinedpillar 2022. 7. 6. 22:58

인터페이스(Interface)

  • 인터페이스란 객체와 객체를 연결하는 접속부 역할을 하는 요소를 뜻합니다.

  • 인터페이스는 구체화 되지 않은 객체로 추상 클래스와 유사한 특성을 가지고 있습니다.

  • 인터페이스는 필요에 따라 연결된 객체를 다른 객체로 교체해야할 때 유용하게 쓰입니다.
    • 인터페이스를 사용하기 위해서는 다른 클래스에서 구현(상속)하여 사용해야 합니다.
    • 이 때 인터페이스에서 선언한 메서드의 선언부는 구현되는 클래스에서 반드시 완성되어야 합니다. 
    • 따라서 같은 인터페이스를 구현한 클래스는 인터페이스를 통해 상황에 맞춰 오버라이딩 된 메서드를 호출할 수 있게 됩니다.

  • 구현 해야 할 메서드들이 미리 선언되어 있기 때문에 이를 구현하는 클래스의 사용법을 가이드 해줄 수 있습니다.

  • 또한 인터페이스는 추상 클래스와 달리 다중 상속이 가능하여 복수의 객체를 상속받아야 할 때 활용할 수 있습니다.

 

 

 

 

인터페이스의 선언

  • 인터페이스는 class 대신에 interface 라는 예약어를 입력하여 통해 선언할 수 있습니다.

  • 인터페이스는 .java 형태의 소스 파일로 작성되고, .class 형태로 컴파일 되기 때문에 물리적 형태는 클래스와 동일합니다.

  • 인터페이스는 아래와 같은 요소들을 멤버로 가질 수 있습니다. 
    • 상수
    • 추상 메서드
    • 기본 메서드
    • 정적 메서드
인터페이스 선언 방법

접근제어자 interface 인터페이스이름 {

    인터페이스의 멤버 선언부
    // 상수, 추상 메서드, 디폴트 메서드, 정적 메서드

}

 

인터페이스 사용 예시

// 걷는 기능을 가지는 인터페이스 선언
public interface Walkable {
	// 걷기 시작하는 메서드 선언
    void startWalk();
    
    // 뛰기 시작하는 메서드 선언
    void startRun();
    
    // 멈추는 메서드 선언
    void stopMove();
}

 

 

 

 

인터페이스의 구현

  • 인터페이스는 상속이 아닌 구현(implements)라는 용어를 사용합니다.

  • 클래스의 상속과 마찬가지로 클래스의 선언 뒤에 implements 예약어를 사용하여 인터페이스의 구현을 선언할 수 있습니다.

  • 인터페이스를 구현하는 클래스는 인터페이스에서 선언한 추상 메서드를 반드시 모두 구현해야합니다. 
인터페이스 구현 방법

// 구현 인터페이스가 하나일 경우
접근제어자 class 클래스이름 implements 인터페이스이름 {
	
    클래스 구현부
    // 구현을 선언한 인터페이스 메서드를 반드시 구현해줘야 함 
    
}

// 구현 인터페이스가 복수일 경우
접근제어자 class 클래스이름 implements 인터페이스이름1, 인터페이스이름2, ... {

	클래스 구현부
    // 구현을 선언한 인터페이스의 메서드는 반드시 구현해줘야 함

}

 

인터페이스 구현 예시

// 걷는 기능을 가지는 인터페이스 선언
public interface Walkable {
    // 걷기 시작하는 메서드 선언
    void startWalk();
    
    // 뛰기 시작하는 메서드 선언
    void startRun();
    
    // 멈추는 메서드 선언
    void stopMove();
}


// Walkable을 구현하는 Human 클래스 구현
public class Human implements Walkable {
    // 클래스 필드
    // 클래스 생성자
    
    // 메서드
    @Override
    public void startWalk() {
    	System.out.println("사람이 두 발로 걷기 시작합니다.");
    }
    
    @Override
    public void startRun() {
    	System.out.println("사람이 두 발로 뛰기 시작합니다.");
    }
    
    @Override
    public void stopWalk() {
    	System.out.println("사람이 멈춥니다.");
    }
}


// Walkable을 구현하는 Dog 클래스 구현
public class Dog implements Walkable {
    // 클래스 필드
    // 클래스 생성자
    
    // 메서드
    @Override
    public void startWalk() {
    	System.out.println("개가 네 발로 걷기 시작합니다.");
    }
    
    @Override
    public void startRun() {
    	System.out.println("개가 네 발로 뛰기 시작합니다.");
    }
    
    @Override
    public void stopWalk() {
    	System.out.println("개가 멈춥니다.");
    }
}

 

 

 

 

인터페이스 타입 변수 선언 및 구현 객체 대입

  • 인터페이스도 하나의 참조 자료형이기 때문에 변수의 타입으로 선언할 수 있습니다.

  • 하지만 인터페이스는 추상적인 자료형으로 스스로 인스턴스를 생성할 수 없습니다.

  • 따라서 인터페이스형 변수에 값을 대입하기 위해서는 인터페이스를 구현한 클래스이거나 null이여야 합니다.

  • 해당 인터페이스를 구현한 클래스의 인스턴스라면 피구현 인터페이스로 선언한 변수에 모두 대입될 수 있습니다.
인터페이스형 변수 선언 및 대입 예시

// Walkable을 구현한 Human 선언
public class InterfaceExample {
    public static void main(String[] args) {
    	// 인터페이스형 변수 선언
        // 변수에 Human의 인스턴스 대입
        // 사람이 두 발로 걷기 시작합니다. 출력
        Walkable walker;
        walker = new Human();
        walker.startWalk();
        
        
        // 다른 구현 클래스도 대입 가능
        // 개가 네 발로 걷기 시작합니다. 출력
        walker = new Dog();
        walker.startWalk();
    }
}