인터페이스는 클라이언트 프로그램에 어떤 메서드를 제공하는지 미리 알려주는 명세 또는 약속의 역할을 한다.
예를들어, Abc 인터페이스를 구현한 A 클래스가 있다고 가정하자. 이 인터페이스에는 구현할 추상 메서드가 모두 선언되어 있고, 어떤 매개변수가 사용되는지, 어떤 자료형 값이 반환되는지 선언되어 있다. 즉, Z프로그램에서 A 클래스의 구현 코드 전체를 살펴보지 않고도 A 클래스를 어떻게 사용하는지 알 수 있다는 것이다.
인터페이스를 구현하면 다형성을 구현하여 확장성 있는 프로그램을 만들 수 있다. 즉, 클라이언트 프로그램을 많이 수정하지 않고 기능을 추가하거나 다른 기능을 추가할 수 있다.
인터페이스(Interface)란?
자바에서 인터페이스는 클래스들이 필수로 구현해야 하는 추상 자료형이다.
객체의 사용방법을 가이드라인 하는 것이라고 생각하시면 이해가 쉽다. 자바의 인터페이스는 추상 메서드와 상수로만 이루어져 있다. 구현된 코드가 없기 때문에 당연히 인터페이스로 인스턴스도 사용할 수 없다.
인터페이스 특징
다중 상속 가능
-> 인터페이스는 껍데기만 존재하여 클래스 상속 시 발생했던 모호함이 없다. 다중 상속이 가능
추상 메서드와 상수만 사용 가능
-> 인터페이스에는 구현 소스를 생성할 수 없다. 상수와 추상 메서드만 가질 수 있다.
생성자 사용 불가
-> 인터페이스 객체가 아니므로 생성자를 사용할 수 없다.
메서드 오버라이딩 필수
-> 자식클래스는 부모 인터페이스의 추상 메서드를 모두 오버라이딩해야 한다.
인터페이스는 대체 왜 쓸까?
- 추상 클래스를 통해 객체들 간의 네이밍을 통일할 수 있고 소스의 가독성과 유지보수가 향상된다.
- 확장에는 열려있고 변경에는 닫혀있는 객체 간 결합도(코드 종속성)를 낮춘 유연한 방식의 개발이 가능하다.
인터페이스는 코드와 인터페이스로 생성된 객체들을 중간에 중계해주는 역할을 한다. 개발 코드가 먼저 인터페이스의 메서드를 호출하면 인터페이스는 객체의 메서드를 호출시키는 형식이다.
인터페이스로 구현된 객체는 인터페이스에서 정의된 추상 메서드와 동일한 메소드 이름, 매개 타입, 리턴 타입을 가진 실체 메서드를 필수로 가지고 있어야 한다. 이러한 과정을 통해 클래스 간의 결합도(코드 종속성을) 낮춘 효율적인 프로그래밍을 할 수 있다.
인터페이스가 코드 종속성을 낮춘다는 게 무슨 말일까?
코드 종속성은 각각의 메서드 간의 결합도를 의미하며 인터페이스를 활용하면 한 메서드를 수정하였을 때, 다른 메서드도 수정해야 하는 상황을 줄여준다는 의미이다.
인터페이스로 추상 메서드를 지정하면 메서드의 input값과 output값이 고정되어 있다.. 예를 들자면 public abstract String myName(String name) 이라는 메서드는 input값, output값 모두 String으로 고정되어 있다. 이 메서드를 구현하는 객체에서 아무리 수정하더라도 input값과 output 값은 String으로 고정되어 있어 변경에 대한 영향도가 작다. 그래서 인터페이스는 "변경에 강하다", "확장에는 열려있고 변경에는 닫혀있다" 라고 말하는 것이다.
자바 인터페이스 사용법
자바에서 인터페이스를 선언할 때는 interface라는 키워드를 붙여서 만들면 된다. 단 이렇게 interface라는 키워드를 붙여 인터페이스로 만들게 되면 오직 implements라는 키워드를 통해 객체들을 구현하는 용도로만 사용이 가능하다.
또한 인터페이스에는 구체적인 대상을 생성할 수 없고 오로지 상수와 추상 메서드만 사용할 수 있다. 이 메서드는 추상 클래스에서 껍데기만 생성하고, 상속하는 자식 클래스에서 오버라이딩하여 사용한다.
인터페이스 사용 예제
package Example;
public interface Animal {
public static final String name = "동물";
public abstract void move();
public abstract void eat();
public abstract void bark();
}
인터페이스에는 static, final로 생성할 수 있는 상수와 abstract로 생성할 수 있는 추상 메서드만 가질 수 있습니다.
package Example;
public class Dog implements Animal{
@Override
public void move() {
System.out.println("슥슥~~");
}
@Override
public void bark() {
System.out.println("멍멍!");
}
}
개 클래스를 생성합니다. Animal 인터페이스를 implements 키워드로 구현하고 인터페이스의 추상 메서드들을 모두 재정의합니다.
package Example;
public class Cat implements Animal{
@Override
public void move() {
System.out.println("사뿐사뿐~~");
}
@Override
public void bark() {
System.out.println("야옹~~");
}
}
고양이 클래스를 생성합니다. 마찬가지로 인터페이스의 추상 메서드들을 오버라이드 합니다.
package Example;
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
dog.move();
dog.bark();
cat.move();
cat.bark();
}
}
인터페이스끼리의 상속
인터페이스끼리도 상속을 통해서 확장을 시켜나갈 수 있고 하위 인터페이스에서 네이밍을 강제하여 객체 간의 통일성을 추구할 수 있다.
인터페이스로 객체를 구현할 때는 implements라는 키워드를 쓰지만 인터페이스끼리 상속을 할 때는 클래스와 마찬가지로 extneds 키워드를 사용한다.
'공부 STUDY > JAVA' 카테고리의 다른 글
[JAVA] 예외처리 (Exception) -(1) (0) | 2023.01.14 |
---|---|
[JAVA] 가상 메서드(virtual method) (0) | 2023.01.13 |
[JAVA] 다운캐스팅 (DownCasting) (0) | 2023.01.09 |
[JAVA] ArrayList 사용법 (0) | 2023.01.09 |
[JAVA] 상속 | 다형성(Polymorphism) (0) | 2023.01.08 |