Rev Notebook

[Java] 인터페이스(Interface)

by Rev_

인터페이스란?

자바에는 클래스 외에 인터페이스가 있다. 이는 자바에서 클래스들이 구현 해야하는 동작을 지정하는 용도로 사용되는 추상 자료형이다.

class 대신에 interface라는 키워드를 이용하여 선언할 수 있으며 메소드 시그니처상수 선언, default method 정의 가능

* 메소드 시그니처: 메소드명, 타입, 변수명을 명시한 것

클래스에서 인터페이스를 구현하기 위해서는 implements 키워드를 사용하여 구현하며, 하나의 클래스는 여러개의 인터페이스를 상속받아 구현할 수 있다.

public interface MemberRepository {
    Member save(Member member);  // 회원 저장
    Optional<Member> findById(Long id);  // ID
    Optional<Member> findByName(String name);  // 이름
    List<Member> findAll();  // 모든 회원 list
}

위처럼 인터페이스를 정의할 수 있다.

public class MemoryMemberRepository implements MemberRepository{
	...
}

클래스에서 사용할 때는 implements 활용

 

장점

1. 메소드 사전 정의 가능

개개인마다 사용하는 메서드와 변수명이 다르다면 개발에 혼란이 올 것이다.

이럴 때 인터페이스를 정의한다면 미리 메소드를 정할 수 있고, 동일한 기능에 동일한 함수명을 사용할 수 있을 것이다.

 

2. 상속을 통한 이점

자식 클래스가 여러 부모 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다는 장점을 가지게 될 것이다. 하지만 클래스를 이용하여 다중 상속을 할 경우 여러 문제가 발생할 수 있어 자바에서는 클래스를 통한 다중 상속은 지원하지 않는다.

하지만 다중 상속의 이점을 버릴 수는 없기에 자바에서는 인터페이스를 이용해 다중 상속을 지원하고 있다.

 

3. 대규모 프로젝트 개발 시 일관되고 정형화된 개발을 위한 표준화 가능

4. 클래스의 작성과 인터페이스의 구현을 동시에 진행할 수 있으므로, 개발 시간을 단축 가능

5. 클래스와 클래스 간의 관계를 인터페이스로 연결하면, 클래스마다 독립적인 프로그래밍이 가능

 

예시

public interface Animal {
    public abstract void cry();  // 추상 메소드 구현
}
public interface Pet {
    public abstract void play();
}

Animal과 Pet 두 인터페이스를 정의하였다.

public class Cat implements Animal, Pet {
    @Override
    public void cry() {
        System.out.println("cat!");
    }

    @Override
    public void play() {
        System.out.println("catch rat");
    }
}
public class Dog implements Animal, Pet {
    @Override
    public void cry() {
        System.out.println("dog!");
    }

    @Override
    public void play() {
        System.out.println("walk");
    }
}

Cat 클래스와 Dog 클래스는 인터페이스의 cry(), play() 메소드를 오버라이드 하여 사용하였다. 

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

        c.cry();
        c.play();
        d.cry();
        d.play();
    }
}


위처럼 메인메소드를 통해 구현해 사용할 수 있다.

'Language > Java' 카테고리의 다른 글

[Java] Stack 클래스  (0) 2022.10.11
[Java] HashSet  (0) 2022.08.05
[Java] Scanner 클래스  (0) 2022.07.25

블로그의 정보

Hi Rev

Rev_

활동하기