상수 / 추상 메서드 | 별도 선언 없어도 상수 / 추상 메서드로 선언됨 |
디폴트 메서드 / 정적 메서드 / | defalut 메서드 / static 메서드 |
private 메서드 | private / private static 메서드 |
상수
- 모든 변수는 상수로 변환됨 public static final 별도의 선언 없어도 자동으로
double PI = 3.14;
int ERROR = -999999999;
추상 메서드
- 모든 선언된 메서드는 추상 메서드 public abstract 별도의 선언 없어도 자동으로
디폴트 메서드 (자바 8 이후)
- 구현을 가지는 메서드, 인터페이스를 구현하는 클래스들에서 공통으로 사용할 수 있는 기본 메서드
- default 키워드 사용
- 클래스가 implements 했을 때 사용할 수 있다.
default void description() {
System.out.println("정수 계산기를 구현합니다.");
myMethod();
}
- 구현하는 (implements 하는) 클래스에서 재정의 할 수 있음
@Override
public void description() {
System.out.println("CompleteCalc에서 재정의한 default 메서드");
//super.description();
}
- 인터페이스를 구현한 클래스의 인스턴스가 생성되어야 사용 가능함 ( 정적 메서드와의 차이점 )
정적 메서드 (자바 8 이후)
- 인스턴스 생성과 상관없이 인터페이스 타입으로 사용할 수 있는 메서드
- static 키워드 사용
- interface 타입으로 직접 호출해서 사용 가능/ 인스턴스 생성 여부와 상관없음
static int total(int[] arr) {
int total = 0;
for(int i: arr) {
total += i;
}
mystaticMethod();
return total;
}
interface에 default 메서드와 static 메서드 구현
private 메서드 (자바 9 이후)
- 인터페이스를 구현한 클래스에서 사용하거나 재정의 할 수 없음
- 인터페이스 내부에서만 사용하기 위해 구현하는 메서드
- default 메서드나 static 메서드에서 사용함
private void myMethod() {
System.out.println("private method");
}
private static void mystaticMethod() {
System.out.println("private static method");
}
interface에 static 메서드 구현
java - 다중 상속 안 되는 이유 - 다이아몬드 프로블럼
여러 인터페이스 구현
- 자바의 인터페이스는 구현 코드가 없으므로 하나의 클래스가 여러 인터페이스는 구현할 수 있음
- 디폴트 메서드가 중복되는 경우는 구현하는 클래스에서 재정의 하여야 함
- 여러 인터페이스를 구현한 클래스는 / 인터페이스 타입으로 형 변환되는 경우 / 해당 인터페이스에 선언된 메서드만 사용 가능함
buy와 sell 인터페이스 생성
여러 개의 인터페이스를 구현할 수 있다.
default 메서드가 중복될 경우 재정의 필요. 여기서는 order 메서드 중복
buy를 가져다가 그대로 쓸 수도 있고, sell을 가져다가 그대로 쓸 수도 있고, 새롭게 재정의도 가능하다.
buy와 sell 인터페이스를 구현한 Customer class
테스트 클래스 ---
여러 개의 인터페이스로 구현한 Customer 클래스 - 인터페이스에서
buy / sell / order / hello 메서드 잘 적용되어 출력되는 것을 확인
order 메서드에서 인터페이스에 구현된 sellorder 나 buyorder 가아닌
Customer 인터페이스에서 재정의한 customer order로 출력됨을 확인
추가해준 hello 메서드도 잘 출력됨을 확인
GOOD :)
인터페이스 타입 사용하는 법과 주의사항
여러 인터페이스를 구현한 클래스는 / 인터페이스 타입으로 형 변환되는 경우 /
해당 인터페이스에 선언된 메서드만 사용 가능함
어떤 인터페이스를 제공해주느냐에 따라 사용자 클라이언트 쪽에서 사용할 수 있는 기능 제한할 수 있다.
인터페이스의 상속
- 인터페이스 사이에도 상속을 사용할 수 있음
- extends 키워드를 사용
- 인터페이스는 다중 상속이 가능하고 구현 코드의 상속이 아니므로 타입 상속이라고 함
X.java -
public interface X {
void x();
}
Y.java
public interface Y {
void y();
}
MyInterface.java
인터페이스 X, Y 있을 때 둘 다 상속을 받는다 extends 키워드
- 의미 - MyInterface 여기에서 X, Y 메서드들을 다 선언하겠다는 의미
- extends 키워드를 썼지만 뒤에 여러 개가 오면 인터페이스 간의 상속이구나 이해
public interface MyInterface extends X, Y{
void myMethod();
}
MyClass.java
- MyInterface implements 한 클래스는 X, Y, myMethod 3가지 메서드 모두 구현해야 된다.
public class MyClass implements MyInterface{
@Override
public void x() {
System.out.println("x()");
}
@Override
public void y() {
System.out.println("y()");
}
@Override
public void myMethod() {
System.out.println("myMethod()");
}
}
MyClassTest.java
- X로 선언되면 X 메서드만, Y로 선언되면 Y 메서드만
- 모든 메서드 사용하려면 MyClass타입형으로 선언
어떤 인터페이스 타입으로 선언했느냐에 따라 사용할 수 있는 메서드 달라짐
public class MyClassTest {
public static void main(String[] args) {
MyClass mClass = new MyClass();
X xClass = mClass;
xClass.x();
Y yClass = mClass;
yClass.y();
MyClass iClass = mClass;
iClass.x();
iClass.y();
iClass.myMethod();
}
}
review
인터페이스의 구현 메서드
디폴트 / 정적 / private
default / static / private
하나의 클래스가 여러 인터페이스를 구현할 수 있다.
인터페이스 디폴트 메서드 중복 시 재정의 필요
어떤 인터페이스 형을 주느냐에 따라 클라이언트가 사용할 수 있는 기능들을 제한할 수 있다.
인터페이스 사이에도 상속을 할 수 있다. extends
전 시간에 인터페이스는 구현 메서드도 구현 코드도 없다고 배웠는데...
구현할 수 있는 것이 나왔다 ㅎㅎ
하긴 인터페이스에 메서드 구현해놓지 못한다면
구현하는 클래스마다 똑같은 메서드를 넣어줘야 할 때
작업이 복잡하고 힘들 거 같다.
후후. 인터페이스가 복잡해지면 클라이언트가 사용하기 힘들어지는 부분은 있는 건가?
사용방법이 너무 복잡해지지 않게 만드는 것도 중요할 거 같다.
'JAVA 웹 개발 패키지 - 패스트캠퍼스 > Chapter3' 카테고리의 다른 글
인터페이스 - 클래스 상속과 인터페이스 구현 함께 쓰기+복습예제 (0) | 2022.01.09 |
---|---|
인터페이스(interface) (0) | 2022.01.04 |
추상 클래스(abstract class) 와 템플릿 메서드 패턴 (0) | 2022.01.04 |
다운 캐스팅과 instanceof (0) | 2022.01.04 |
다형성과 다형성을 사용하는 이유 (0) | 2022.01.03 |