[자바] | 인터페이스(interface)

제롬·2022년 3월 6일
0

인터페이스란?

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

  • 구현된 것은 아무것도 없는 일종의 클래스 설계도
  • 일반메서드 또는 멤버변수를 가질수 없다.
  • 오직 추상메서드와 상수만을 멤버로 가질 수 있다.
  • Java8 버전에서 default methodstatic method가 추가되었다.
  • Java9 버전에서 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 메서드를 정의하므로 메서드 출처의 모호성이 사라진다.

인터페이스 default 메서드

  • 자바8 버전에서 추가.
  • 인터페이스에서 메서드 선언이 아니라 구현체를 제공하는 방법
  • 해당 인터페이스를 구현한 클래스에 어떠한 영향없이 새로운 기능을 추가하는 방법
  • 오버라이딩을 사용 또는 사용하지 않을수 있다.

인터페이스 static 메서드

  • 자바8 버전에서 추가.
  • static 메서드이므로 상속이 불가능하다.
  • 인스턴스 없이 수행할 수 있는 작업을 정의할 수 있다.
  • 인터페이스에서 메서드 선언이 아닌 구현이 가능하다.

인터페이스 private 메서드

  • 자바9 버전에서 privateprivate static메서드 추가.
  • defaultstatic 메서드 모두 public 메서드이기 때문에 외부에 노출된다는 단점을 보완하기 위해 private 메서드가 등장.
  • 인터페이스 캡슐화 유지가능.

인터페이스의 장점

  1. 다중상속이 가능하다.
  2. 대규모 프로젝트시 일관되고 정형화된 개발을 위한 표준이 가능하다.
  3. 클래스의 작성과 인터페이스의 구현을 동시에 진행할수 있으므로, 개발시간이 단축된다.
  4. 클래스와 클래스간의 관계를 인터페이스로 연결하면, 클래스별로 독립적인 프로그래밍이 가능하다.

[정리]

자바에서 인터페이스는 다형성을 극대화하고 코드 재사용성을 높여준다. 또한 클래스의 기본틀을 제공해 표준화된 개발을 가능하게하여 프로그램의 유지보수성을 높여준다.

[Reference]
TCP SCHOOL
azderica

0개의 댓글