본문 바로가기
Java

[Java] 인터페이스

by lmyourpearl 2025. 11. 14.

인터페이스(Interface)

개발 코드와 객체가 서로 통신하는 접점 역할을 하고 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킴, 그래서 개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 됨.

인터페이스는 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라서 실행 내용과 리턴값이 다를 수 있으며, 개발 코드 측면에서는 코드 변경 없이 실행 내용과 리턴값을 다양화할 수 있다는 장점을 가지게 됨.

 

인터페이스 선언

인터페이스는 '~.java'형태의 소스 파일로 작성되고 컴파일러(javac)를 통해'~.class'형태로 컴파일되기 때문에 물리적 형태는 클래스와 동일하지만, 소스를 작성할 때 선언하는 방법이 다름.

[public] interface 인터페이스이름 {...}

 

인터페이스 생성

interface 인터페이스이름 {
	// 상수
    타입 상수이름 = 값;
    // 추상 메소드
    타입 메소드이름(매개변수,...);
}

클래스는 필드, 생성자, 메소드를 구성 멤버로 가지는데 비해, 인터페이스는 상수 필드와 추상 메소드만을 구성 멤버로 가지며, 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없음.


상수 필드 선언

인터페이스는 객체 사용 방법을 정의한 것이므로 실행 시 데이터를 저장할 수 있는 인스턴스 또는 정적 필드를 선언할 수 없지만, 상수 필드(constant field)는 선언이 가능하다.(단, 상수는 인터페이스에 고정된 값으로 실행 시에 데이터를 바꿀 수 없음)

[public static final] 타입 상수이름 = 값;

 

// 상수 필드 선언

package sec01.exam02;

public interface RemoteControl {
	public int MAX_VOLUME = 10;
    public int MIN_VOLUME = 0;
}

추상 메소드 선언

인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행되는데, 인터페이스의 메소드는 실행 블록이 필요 없는 추상 메소드로 선언함. 추상 메소드는 리턴 타입, 메소드 이름, 매개 변수만 기술되고 중괄호{ }를 붙이지 않는 메소드를 말함.

[public abstract] 리턴타입 메소드이름(매개변수,...);

 

// 추상 메소드 선언

package sec01.exam03;

public interface RemoteControl {
	// 상수
    public int MAX_VOLUME = 10;
    public int MIN_VOLUME = 0;
    
    // 추상 메소드
    public void turnOn();	// 메소드 선언부만 작성
    public void turnOff();
    public void setVolume(int volume);
}

인터페이스 구현

개발 코드가 인터페이스 메소드를 호출하면 인터페이스는 객체의 메소드를 호출하고, 객체는 인터페이스에서 정의된 추상 메소드와 동일한 메소드 이름, 매개 타입, 리턴 타입을 가진 실체 메소드를 가지고 있어야함. 이러한 객체를 인터페이스의 구현(implement)객체라고 하고, 구현 객체를 생성하는 클래스를 구현 클래스라고 함.

 

구현 클래스

구현 클래스는 인터페이스 타입으로 사용할 수 있음을 알려주기 위해 클래스 선언부에 implements 키워드를 추가하고 인터페이스 이름을 명시해야 하며, 인터페이스에 선언된 추상 메소드의 실체 메소드를 선언해야 함.

public class 구현클래스이름 implements 인터페이스이름 {
	// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}

 

// 구현 클래스

package sec01.exam04;

public class Television implements RemoteControl {
	// 필드
    private int volume;
    
    // turnOn() 추상 메소드의 실체 메소드
    public void turnOn() {
    	System.out.println("TV를 켭니다.");
    }
    
    // turnOff() 추상 메소드의 실체 메소드
    public void turnOff() {
    	System.out.println("TV를 끕니다.");
    }
    
    // setVolume() 추상 메소드의 실체 메소드
    public void setVolume(int volume) {
    	if(volume>RemoteControl.MAX_VOLUME) {	// 인터페이스 상수를 이용해서 volume필드의 값을 제한
        	this.volume = RemoteControl.MAX_VOLUME;
      } else if(volume<RemoteControl.MIN_VOLUME) {
       	this.volume = RemoteControl.MIN_VOLUME;
      } else {
      	this.volume = volume;
      }
      System.out.println("현재 TV 볼륨: " + this.volume);
    }
}

* 구현 클래스에서 인터페이스의 추상 메소드에 대한 실체 메소드를 작성할 때 주의할 점은 인터페이스의 모든 메소드는 기본적으로 public 접근 제한을 갖기 때문에 public보다 더 낮은 접근 제한으로 작성할 수 없다.

 

인터페이스로 구현 객체를 사용하려면 인터페이스 변수를 선언하고 구현 객체를 대입해야 함.

// 인터페이스 변수에 구현 객체 대입

package sec01.exam04;

public class RemoteControlExample {
	public static void main(String[] args) {
    	RemoteControl rc;
        rc = new Television();
   }
}

 

다중 인터페이스 구현 클래스

인터페이스 A와 인터페이스 B가 객체의 메소드를 호출할 수 있으려면 객체는 이 두 인터페이스를 모두 구현해야 함.

public class 구현클래스이름 implements 인터페이스A, 인터페이스B {
    // 인터페이스 A에 선언된 추상 메소드의 실체 메소드 선언
    // 인터페이스 B에 선언된 추상 메소드의 실체 메소드 선언
}

다중 인터페이스를 구현할 경우, 구현 클래스는 모든 인터페이스의 추상 메소드에 대해 실체 메소드를 작성해야 함.

 

// 인터페이스

package sec01.exam05;

public interface Searchable {
	void search(String url);
}
// 다중 인터페이스 구현 클래스

package sec01.exam05;

public class SmartTelevision implements RemoteControl, Searchable {
	private int volume;
    
    // RemoteControl의 추상 메소드에 대한 실체 메소드
    public void turnOn() {
    	System.out.println("TV를 켭니다.");
    }
    public void turnOff() {
    	System.out.println("TV를 끕니다.");
    }
    public void setVolume(int volume) {
    	if(volume>RemoteControl.MAX_VOLUME) {
          this.volume = RemoteControl.MAX_VOLUME;
      } else if(volume<RemoteControl.MIN_VOLUME) {
      	  this.volume = RemoteControl.MIN_VOLUME;
      } else {
      	  this.volume = volume;
      }
      System.out.println("현재 TV 볼륨: " + this.volume);
   }
   
   // Searchable의 추상 메소드에 대한 실체 메소드
   public void search(String url) {
     System.out.println(url + "을 검색합니다.");
   }
}
// 인터페이스 변수에 구현 객체 대입

package sec01.exam05;

public class SmartTelevisionExample {
	public static void main(String[] args) {
    	SmartTelevision tv = new SmartTelevision();
        
        RemoteControl rc = tv;
        Searchable searchable = tv;
    }
}

인터페이스 사용

1. 인터페이스가 필드 타입으로 사용될 경우: 필드에 구현 객체를 대입할 수 있다.

2. 인터페이스가 생성자의 매개 변수 타입으로 사용될 경우: new 연산자로 객체를 생성할 때 구현 객체를 생성자의 매개값으로 대입할 수 있음.

3. 인터페이스가 로컬 변수 타입으로 사용될 경우: 변수에 구현 객체를 대입할 수 있다.

4: 인터페이스가 메소드의 매개 변수 타입으로 사용될 경우: 메소드 호출 시 구현 객체를 매개값으로 대입할 수 있다.

대입이 된 후에는 재정의된 구현 객체의 메소드를 호출할 수 있음.

 

// 인터페이스 사용

package sec01.exam06;

public class MyClass { 

	// 필드
    RemoteControl rc = new Television();
    
    // 생성자
    MyClass() {
    }
    
    MyClass(RemoteControl rc) {
    	this.rc = rc;
        rc.turnOn();
        rc.setVolume(5);
    }
    
    // 메소드
    void methodA() {
    	RemoteControl rc = new Audio();
        rc.turnOn();
        rc.setVolume(5);
    }
    
    void methodB(RemoteControl rc) {
    	rc.turnOn();
        rc.setVolume(5);
    }
 }
// 인터페이스 사용

package sec01.exam06;

public class MyClassExample {
	public static void main(String[] args) {
    	System.out.println("1)------------------");
        
        MyClass myClass1 = new MyClass();
        myClass1.rc.turnOn();
        myClass1.rc.setVolume(5);
        
        System.out.println("2)------------------");
        
        MyClass myClass2 = new MyClass(new Audio());
        
        System.out.println("3)------------------");
        
        MyClass myClass3 = new MyClass();
        myClass3.methodA();
        
        System.out.println("4)------------------");
        
        Myclass myClass4 = new MyClass();
        myClass4.methodB(new Television());
    }
 }

 


🔘 인터페이스: 객체의 사용 방법을 정의한 타입이며 개발 코드와 객체가 서로 통신하는 접점 역할을 함. 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킴. 구성 멤버는 상수 필드와 추상 메소드.

 

🔘 상수 필드: 인터페이스의 상수 필드는 기본적으로 public static final 특성을 갖는데, 관례적으로 필드 이름은 모두 대문자로 작성해야 하며, 선언 시 초기값을 대입해야 함.

 

🔘 추상 메소드: 인터페이스에 선언된 메소드는 public abstract가 생략되고 메소드 선언부만 있는 추상 메소드임. 구현 클래스는 반드시 추상 메소드를 재정의해야 함.

 

🔘 implements: 구현 클래스는 어떤 인터헤이스로 사용 가능한지(어떤 인터페이스를 구현하고 있는지)를 기술하기 위해 클래스 선언 시 implements 키워드를 사용함.

 

🔘 인터페이스 사용: 클래스를 선언할 때 인터페이스는 필드, 생성자 또는 메소드의 매개 변수, 생성자 또는 메소드의 로컬 변수로 선언될 수 있음.

'Java' 카테고리의 다른 글

[Java] 중첩 클래스와 중첩 인터페이스  (0) 2025.11.15
[Java] 타입 변환과 다형성  (0) 2025.11.14
[Java] 추상 클래스  (0) 2025.11.14
[Java] 타입 변환과 다형성  (0) 2025.11.12
[Java] 상속  (0) 2025.11.10