| 백기선님의 자바 라이브 스터디 8주차 주제!!
인터페이스란?
추상클래스에 대해서 다뤘었죠. 인터페이스는 추상화를 극대화한 추상클래스라고 볼 수 있습니다.
추상클래스와의 차이점을 언급해볼게요.
추상클래스는 추상메서드 + 일반 메서드나 필드를 가진다면,
인터페이스는 Only 추상메서드, 상수만 가질 수 있습니다.
추상클래스는 "is-a : ~는 ~이다" 의 개념이고 인터페이스는 "has-a : ~는 ~를 할 수 있다." 라는 내용도 기억해두시면 좋습니다.
개인적으로 이 인터페이스는 자바의 다형성을 이용하는 방식으로 코드의 수정을 줄이고 유지보수성을 높인다고 생각합니다. (변경에는 닫혀있으며 확장에는 열려있다)
인터페이스 정의하는 방법
추상클래스랑 인터페이스랑 구분이 있어야 컴파일하는 과정에서 문제를 캐치하겠죠.
추상클래스는 class에 abstract 키워드를 붙여줬습니다.
아!! 그러면 인터페이스는 class 뒤에 interface 키워드를 붙여주면 되겠네요!!
나름 괜찮은 접근입니다만~
저는 인터페이스를 인터페이스 클래스라고 언급하지 않았습니다
이는 즉 인터페이스랑 클래스 자체가 구분이 된다는 거죠
class 자리 대신에 interface 키워드를 넣고 정의해주세요
interface 인터페이스 {
public static final 타입 필드이름 = 값; //상수만 가질 수 있으므로
public abstract 메서드(); //어차피 다 추상 메서드이므로 abstract 키워드는 생략 가능
}
인터페이스 구현하는 방법
추상 클래스는 extends를 이용해서 상속받을 수 있는데 인터페이스를 implements라는 키워드를 이용해야 합니다.
추가로 추상 클래스 상속과는 달리 여러 인터페이스를 받을 수 있습니다.
public interface Animal {
public void move();
}
public class Rabbit implements Animal {
@Override
public void move() {
System.out.println("깡총깡총");
}
}
public class Turtle implements Animal {
@Override
public void move() {
System.out.println("엉금엉금");
}
}
인터페이스 상속
인터페이스는 인터페이스를 상속받을 수 있습니다. 이때 다중 상속이 가능하다는 특징이 있습니다.
인터페이스 레퍼런스 이용
인스턴스 레퍼런스는 해당 인터페이스를 구현한 클래스 인스턴스를 가리킬 수 있고 해당 인터페이스에 선언된 메서드만 호출 가능합니다.
즉 A 인터페이스에 methodA methodB가 있고 그것을 구현한 클래스 B에 methodA methodB hello 메서드가 있다고 생각해볼게요.
//클래스 타입
B b = new B();
b.methodA();
b.methodB();
b.hello();
A a = new B();
a.methodA();
a.methodB();
a.hello();//는 불가능
이런 방식으로 사용가능합니다.
인터페이스의 기본 메소드 (Default Method), 자바 8
인터페이스는 항시 추상 메서드를 갖고 있다고 언급했습니다.
그런데, 이런 추상 메서드는 무조건적으로 구현이 되어야 하는 문제 때문에 불편이 있었다고 합니다.
이를 해결하기 위해 dafault method라는 개념이 등장합니다.
public interface Animal {
void move(); // 추상메서드
default void cry() {
System.out.println("울음소리를 냅니다. 그르릉");
}//일반 메서드
}
이 다음은 블로그마다 말이 다른데 어디서는 구현 클래스에서 재정의가 가능하다고 하시고 어떤 분은 안된다고 포스팅을 하셨어요.
오라클 공식 문서를 보면 Redefine the default method, which overrids it. 이라고 언급하고 있으니 재정의가 가능해 보이기도 하고.. 저게 지금 인터페이스 상속 파트에서 나온 문장이라 '구현체에서의 재정의'에 대해서는 자신이 없네요.
일단 Geeksforgeeks나 프로그래머스 강의에서 된다!라고 명시했기에 저는 되는 것으로 생각할게요.
www.geeksforgeeks.org/default-methods-java/
programmers.co.kr/learn/courses/5/lessons/241
인터페이스의 static 메소드, 자바 8
static 메서드는 default 메서드와는 달리! 재정의가 불가능합니다.
인터페이스명.메서드명(); 의 형식으로 호출해야 합니다.
//출처 : 프로그래머스 자바 입문 강의 예제
public interface Calculator {
public int plus(int i, int j);
public int multiple(int i, int j);
default int exec(int i, int j){
return i + j;
}
public static int exec2(int i, int j){ //static 메소드
return i * j;
}
}
//인터페이스에서 정의한 static메소드는 반드시 인터페이스명.메소드 형식으로 호출해야한다.
public class MyCalculatorExam {
public static void main(String[] args){
Calculator cal = new MyCalculator();
int value = cal.exec(5, 10);
System.out.println(value);
int value2 = Calculator.exec2(5, 10); //static메소드 호출
//default 메서드나 추상 메서드와는 다른 방식으로 호출
System.out.println(value2);
}
}
이렇게 일반 메서드를 사용할 수 있다면 인터페이스랑 추상 클래스의 구분이 없어지는 것처럼 보이지만 차이는 아직 존재합니다.
변수는 사용못하고 오직 상수만 사용 가능하다는 부분이 아직 남아있습니다.
인터페이스의 private 메소드, 자바 9
Java 9 이후부터는 인터페이스에서 private methods와 private static method를 사용할 수 있습니다.
위의 기능들은 항상 public 이기때문에 또 불편이 있었다고 합니다.
그래서 그걸 위해 또 private 메서드를 만든거죠.
불편은.. 제가 다 사용해본 경험이 없어서 공감은 못합니다.
그러나 코드의 중복을 피하고 interface에 대한 캡슐화를 유지할 수 있게 되었다는 장점을 다른 분들의 글을 통해서 얻을 수 있죠. 허허허
private 메서드의 네 가지 규칙
- private 메서드는 구현부를 가져야만 한다.
- 오직 인터페이스 내부에서만 사용할 수 있다.
- private static 메서드는 다른 static 또는 static이 아닌 메서드에서 사용할 수 있다.
- static이 아닌 private 메서드는 다른 private static 메서드에서 사용할 수 없다.
정리글
오늘 이렇게 자바 인터페이스에 대해서 정리해봤습니다.
스프링 강의를 들으면서 진짜 이 인터페이스를 잘 이용하면 결합도를 낮출 수 있다는 사실을 깨달았습니다.
오늘은 그 기본 베이스인 인터페이스를 다루게 되었는데 조금이라도 도움이 되셨으면 합니다.
'Java' 카테고리의 다른 글
[JAVA] 멀티쓰레드 프로그래밍 (0) | 2021.06.02 |
---|---|
[Java] 예외처리 (0) | 2021.05.18 |
[JAVA] 패키지 (0) | 2021.05.03 |
객체지향 프로그래밍이란? (0) | 2021.04.30 |
[JAVA] 자바 상속 (0) | 2021.04.26 |