[Java] 5.4 인터페이스

5.4 인터페이스

Java 언어에서는 특정 기능을 구현할 것을 약속만 하고 구체적인 구현을 구현 클래스에서 작성하는 인터페이스를 제공합니다. 이는 추상 클래스와 매우 흡사합니다. 인터페이스를 정의하였을 때 구체적 구현을 하지 않기 때문에 개체를 생성할 수 없다는 점에서는 추상 클래스와 같습니다. 하지만 인터페이스에서는 구체적인 기능을 정의하는 메서드를 멤버로 정의할 수 없습니다.

인터페이스에서는 상수와 추상 메서드만 멤버로 약속할 수 있으며 암시적으로 추상 클래스입니다. 여기에서 암시적으로 추상 클래스라는 말은 클래스 이름 앞에 abstract 키워드를 명시하지 않지만 개체 인스턴스를 생성할 수 없는 추상 클래스라는 말입니다.

이러한 인터페이스는 사용 방법을 아키텍쳐링 혹은 설계 단계에서 약속하고 구체적인 행위를 구현하는 것을 구현 클래스에서 작성할 수 있게 할 수도 있습니다. 그리고 내부 구현은 다르지만 같은 방법으로 사용할 수 있는 여러 클래스의 기반 형식 역할을 할 수 있게 만들 때도 사용합니다.

인터페이스를 정의할 때는 clsss 키워드 대신 interface 키워드를 사용합니다.

[접근 지정자] interface 인터페이스 이름{

상수

추상 메서드

}

인터페이스를 기반으로 구현 클래스를 정의할 때는 클래스 이름 뒤에 implements 키워드와 인터페이스 이름을 명시합니다.

[접근 지정자] class 클래스 이름 implements 기반 인터페이스 이름{

}

다음은 IStudy 인터페이스에서 Study 기능을 약속하고 이를 기반으로 구현한 Student 클래스에서 Study 메서드를 재정의하는 예제입니다.

[소스 5.8] 인터페이스 정의 및 구현 클래스 정의 예

//인터페이스
public interface IStudy {
	abstract void study();
}
//구현 클래스
public class Student implements IStudy {
	@Override
	public void study() {
		System.out.println("공부하다.");
	}
}
//인터페이스 사용 예
public class Program {
	public static void main(String[] args){
        IStudy istudy = new Student();
        istudy.study();
	}
}

실행 결과

공부하다.

인터페이스 또한 기반 인터페이스에서 파생한 인터페이스를 정의할 수 있습니다. 물론 인터페이스에서는 구체적인 메서드 구현을 하지 않기 때문에 기반 인터페이스에 추상 메서드를 구현하지 않습니다. 추상 메서드의 구체적인 구현은 인터페이스를 기반의 구현 클래스에서 할 수 있습니다.

다음 예제는 기반 인터페이스 IGetName와 이를 기반으로 파생한 IStudy 인터페이스를 정의하고 IStudy 인터페이스를 기반으로 Student 구현 클래스를 정의하여 사용하는 예제입니다.

IGetName 인터페이스는 getName 메서드를 약속하였고 IStudy 인터페이스 study 메서드를 약속하였습니다. 따라서 IStudy 인터페이스를 기반으로 구현 클래스 Student에서는 이 둘의 추상 메서드를 반드시 재정의하여야 구상 클래스로 정의할 수 있습니다.

[소스 5.9] 계층화 인터페이스 예

//기반 인터페이스
public interface IGetName {
	public abstract String getName();
}
//IGetName에서 파생한 인터페이스
public interface IStudy extends IGetName {
	abstract void study();
}
//구현 클래스
public class Student implements IStudy {
	String name;
	public Student(String name){
		this.name = name;
	}
	@Override
	public String getName() {
		
		return name;
	}
	@Override
	public void study() {
		System.out.println(name+" 공부하다.");
	}
}
//계층화 인터페이스 사용 예
public class Program {
	public static void main(String[] args){
		Student stu = new Student("홍길동");
		stu.study();
		System.out.println(stu.getName());
	}
}

실행 결과

홍길동 공부하다.
홍길동

그리고 인터페이스가 추상 클래스와 다른 점으로 다중 상속 대상이라는 것입니다. Java 언어에서는 기반 클래스는 단 하나만 정의할 수 있습니다. 대신 기반 인터페이스는 여러 개를 정의할 수 있습니다.

다음의 예는 IStudy 인터페이스와 IWork 인터페이를 정의하고 이를 다중 상속한 구현 클래스 Student를 정의하여 사용한 예제입니다.

[소스 5.10] 인터페이스 다중 상속 예

//IStudy 인터페이스
public interface IStudy {
	abstract void study();
}
//IWork 인터페이스
public interface IWork {
	abstract void work();
}
//인터페이스 다중 상속한 구현 클래스
public class Student implements IStudy, IWork {
	@Override
	public void work() {
		System.out.println("자습하다.");
	}
	@Override
	public void study() {
		System.out.println("공부하다.");
	}
}
//인터페이스 다중 상속 예
public class Program {
	public static void main(String[] args){
		Student stu = new Student();
		stu.study();
		stu.work();
	}
}

실행 결과

공부하다.
자습하다.

기본 문법을 다룰 때는 인터페이스의 장점을 크게 와 닿지 않을 수도 있지만 실제 다양한 개발을 하다보면 인터페이스의 매력을 느낄 수 있을 것입니다. 여러분도 매력적인 인터페이스의 모습을 만나길 바랍니다.