인터페이스 : 클래스들이 동일한 목적아래 동일한 기능을 구현하는것을 보장하기 위해 사용된다. 쉽게 말해 클래스의 가이드라인이나 규격을 제공해주는 일종의 설계도라고 할 수 있다.
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