인터페이스 : 클래스들이 동일한 목적아래 동일한 기능을 구현하는것을 보장하기 위해 사용된다. 쉽게 말해 클래스의 가이드라인이나 규격을 제공해주는 일종의 설계도라고 할 수 있다.
default method
와 static method
가 추가되었다.private method
를 정의할 수 있게 되었다.인터페이스 선언은 class
대신 interface
를 사용하며, 접근제어자는 default
혹은 public
을 사용한다.
[인터페이스 선언 방법]
접근제어자 interface 인터페이스명{
public static final 타입 상수이름 = 값;
...
public abstract 메소드이름(매개변수);
...
}
인스턴스의 모든 필드는 public static final 이어야 하며, 모든 메서드는 public abstract 여야 한다. 이 부분은 모든 인터페이스에 공통적으로 적용되는 부분이며 생략이 가능하다. 만약, 생략된다면 컴파일시 자바 컴파일러가 제어자를 자동으로 추가한다.
인터페이스는 추상 클래스와 마찬가지로 자신이 직접 인스턴스를 생성할 수 없다. 따라서 인터페이스가 포함하고 있는 추상메서드를 구현할 클래스를 작성해야 한다.
[인터페이스 구현 방법]
class 클래스 이름 implements 인터페이스 이름 {...}
[인터페이스 구현 예제]
public interface Animal {
public abstract void cry();
}
class Cat implements Animal{
@Override
public void cry() {
System.out.println("냐옹");
}
}
class Dog implements Animal{
@Override
public void cry() {
System.out.println("멍멍");
}
}
public class Polymorphism {
public static void main(String[] args) {
Cat cat = new Cat();
Dog dog = new Dog();
cat.cry();
dog.cry();
}
}
// 실행결과
냐옹
멍멍
자바에서 클래스는 다중상속이 불가능하나 인터페이스는 다중 상속이 가능하다. 또한 인터페이스는 상속과 동시에 구현이 가능하다.
[상속과 구현을 동시에 하는 방법]
class 클래스 이름 extends 상위클래스 이름 implements 인터페이스 이름 {...}
단, 인터페이스는 인터페이스로부터만 상속을 받을 수 있으며, 여러 인터페이스를 동시에 상속받는것이 가능하다.
[동시 상속, 구현 예제]
public interface Animal {
public abstract void cry();
}
interface Pet{
public abstract void play();
}
class Cat implements Animal, Pet{
@Override
public void cry() {
System.out.println("냐옹");
}
@Override
public void play() {
System.out.println("쥐를 잡자");
}
}
class Dog implements Animal, Pet{
@Override
public void cry() {
System.out.println("멍멍");
}
@Override
public void play() {
System.out.println("산책가자");
}
}
public class Polymorphism {
public static void main(String[] args) {
Cat cat = new Cat();
Dog dog = new Dog();
cat.cry();
cat.play();
dog.cry();
dog.play();
}
}
// 실행결과
냐옹
쥐를 잡자
멍멍
산책가자
클래스를 이용하여 다중상속을 할 경우 메소드 출처의 모호성등이 발생할 수 있다.
[클래스를 이용한 다중상속]
public class Polymorphism {
public static void main(String[] args) {
MyPet myPet = new MyPet();
myPet.cry();
}
}
class Animal{
public void cry(){
System.out.println("짖기");
}
}
class Cat extends Animal{
@Override
public void cry() {
System.out.println("냐옹");
}
}
class Dog extends Animal{
@Override
public void cry() {
System.out.println("멍멍");
}
}
class MyPet extends Dog,Cat{
// 에러발생
}
위 코드의 MyPet
인스턴스가 cry
메서드를 호출하면 해당 메서드가 Dog
클래스의 메서드인지 Cat
클래스의 메서드인지 구분할 수 없는 모호성이 발생한다. 이런 이유때문에 자바에서는 다중상속을 지원하지 않는다.
하지만 아래처럼 인터페이스를 사용하면 이런 다중상속의 모호성을 해결할 수 있다.
[인터페이스를 이용한 다중 상속]
public interface Animal {
public abstract void cry();
}
interface Cat extends Animal{
public abstract void cry();
}
interface Dog extends Animal{
public abstract void cry();
}
class MyPet implements Cat, Dog{
@Override
public void cry() {
System.out.println("멍멍 냐옹");
}
}
public class Polymorphism {
public static void main(String[] args) {
MyPet myPet = new MyPet();
myPet.cry();
}
}
// 실행결과
멍멍 냐옹
위의 코드에서는 Cat
인터페이스와 Dog
인터페이스를 동시에 구현한 MyPet
클래스에서만 cry
메서드를 정의하므로 메서드 출처의 모호성이 사라진다.
static
메서드이므로 상속이 불가능하다.private
와 private static
메서드 추가.default
와 static
메서드 모두 public
메서드이기 때문에 외부에 노출된다는 단점을 보완하기 위해 private
메서드가 등장.자바에서 인터페이스는 다형성을 극대화하고 코드 재사용성을 높여준다. 또한 클래스의 기본틀을 제공해 표준화된 개발을 가능하게하여 프로그램의 유지보수성을 높여준다.
[Reference]
TCP SCHOOL
azderica