[Java] 인터페이스(Interface)

이다혜·2023년 11월 7일
0

Java

목록 보기
15/23
post-thumbnail

인터페이스(Interface)란?

자바에서는 클래스를 이용하여 다중 상속을 할 경우 메소드 출처의 모호성 등의 문제가 발생할 수 있어 다중 상속을 지원하지 않는다.

메서드 출처의 모호성 발생 예시

class Animal { 
    public void cry() {
        System.out.println("짖기!");
    }
}
 
class Cat extends Animal {
    public void cry() {
        System.out.println("냐옹냐옹!");
    }
}
 
class Dog extends Animal {
    public void cry() {
        System.out.println("멍멍!");
    }
} 

class MyPet extends Cat, Dog {}

public class Polymorphism {
    public static void main(String[] args) {
        MyPet p = new MyPet();
        p.cry(); // --- 문제
    }
}

위의 코드에서 MyPet은 Cat과 Dog를 다중 상속받고 있다.
MyPet 객체를 생성하고 cry() 메서드를 호출하면, 이 메서드가 Cat 클래스에서 상속받은 cry() 메서드인지, Dog 클래스에서 상속받은 cry() 메서드인지 구분할 수 없는 모호성이 발생한다.

이를 해결하기 위해 인터페이스를 통해 다중 상속을 지원한다.

인터페이스란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하는 일종의 추상 클래스이다.

인터페이스 선언

인터페이스는 오로지 추상 메서드와 상수만 포함할 수 있다.

interface 인터페이스이름 {
	public static final 타입 상수이름 =;
    
    public abstract 메소드이름(매개변수);
}

모든 필드는 public static final,
모든 메서드는 public abstract 이어야 한다.
단, 생략 가능하다.

구현

추상클래스와 마찬가지로 직접 인스턴스를 생성할 수 없다.
따라서 인터페이스의 추상메서드를 구현해 줄 클래스가 필요하다.

class 클래스이름 implements 인터페이스이름 {
	...
}

예제

interface Animal { 
	public abstract void cry(); 
}

class Cat implements Animal {
    public void cry() {
        System.out.println("냐옹냐옹!");
    }
}

class Dog implements Animal {
    public void cry() {
        System.out.println("멍멍!");
    }
}

public class Polymorphism03 {
    public static void main(String[] args) {
        Cat c = new Cat();
        Dog d = new Dog();

        c.cry(); // "냐옹냐옹!" 출력
        d.cry();// "멍멍!" 출력
    }
}

인터페이스의 장점

  1. 일관되고 정형화된 개발을 위한 표준화 가능
  2. 클래스의 작성과 인터페이스의 구현을 동시에 진행 가능
  3. 클래스와 클래스 간의 관계를 인터페이스로 연결하면, 클래스마다 독립적인 프로그래밍 가능

0개의 댓글