public static final
public abstract
_
밑줄로 연결final
, static
이 자동으로 추가abstract
생략해도 컴파일 시점에 자동으로 추가interface 인터페이스이름 {
// 상수
public static final float pi = 3.14F;
static final int GAME_LEVEL = 10;
// 추상 메서드
public void makeSomething(); // public abstract
}
상수만 사용하므로, 다중 상속 가능
Calc
)는 Calculator
가 구현Calculator
안에 일부만 추상메소드, 일부는 구현 메소드 할 것CompleteCalc
는 인스턴스화 될 수 있는 클래스(기존에 쓰던 클래스)public class CompleteCalc extends Calculator { . . . }
Calculator
를 **상속받고, Calc
를 타입상속 받음CompleteCalc
)는 해당 인터페이스(Calc
)의 타입이다implements
할 수 있음상속 구조에서 최상위 부모
하나의 인터페이스를 여러 객체가 구현하게 되면?
→
클라이언트 프로그램은 인터페이스의 메서드를 활용하여
여러 객체의 구현을 사용할 수 있음(바꿔가면서 사용가능)
👉 다형성
부모-자식 클래스간의 관계가 is a
관계가 성립되지 않는 경우
👉 인터페이스로 만들기
is a, has a 관계는 자바 시리즈 16번의 논리적 포함관계를 참고해주세요
실무(시니어)에서 핵심
→ 해당 인터페이스를 어떻게 설계해야 clinet프로그램에서 유용하게 쓸 수 있는가?
하이라키(Hierarchy) 구조를 잘 설계
→ 계층 구조를 뜻함 (아래 패키지들)
클래스나 프로그램이 제공하는 기능을 명시적으로 선언
일종의 클라이언트 코드와의 약속이며,
클래스나 프로그램이 제공하는 명세(specification)
클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고
이를 구현한 클래스를 사용할 수 있음
어떤 객체가 하나의 인터페이스 타입이라는 것은
그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미
인터페이스를 구현한 다양한 객체를 사용할 수 있음 → 다형성
(ex) JDBC 인터페이스
_
public static final
double PI = 3.14;
int ERROR = -999999999;
public abstract
default
메서드 (자바 8이후)default
키워드 사용// Calc.java 최상위 인터페이스
default void description() {
System.out.println("정수 계산기를 구현합니다.");
myMethod();
}
// CompleteCalc.java
@Override
public void description() {
System.out.println("CompleteCalc overriding");
//super.description();
}
CompleteCalc calc2 = new CompleteCalc();
// CompleteCalc의 description()이 Calc의 description()을 오버라이딩 해서 출력
// 출력 결과 CompleteCalc overriding
calc2.description();
static
메서드 (자바 8이후)implement
하는 클래스가 인스터스화(new
)되었을 때, 호출해서 사용**static** int total(int[] arr) { // **static** 있어서, 인터페이스타입으로 바로 사용가능
int total = 0;
for(int i: arr) {
total += i;
}
mystaticMethod();
return total;
}
// 출력 15
// 정적메소드 total 호출 => static 메소드 이기때문에 인터페이스 이름으로 바로 호출 가능
int[] arr = {1,2,3,4,5};
System.out.println(Calc.total(arr));
private
메서드 (자바 9이후)default
메서드나 static
메서드에서 사용함// Calc.java
default void description() {
System.out.println("정수의 사칙연산을 제공합니다.");
myMethod(); // private 메소드 => default 메소드에서 사용 가능
}
// 정적메서드
static int total(int[] arr) {
int total = 0;
for(int num : arr) {
total += num;
}
myStaticMethod(); // private 메소드 => static 메소드에서 사용 가능
return total;
}
// private 메소드 => 인터페이스 내부에서만 사용, 구현 메소드에서는 재정의 및 사용 불가
**private** void myMethod() {
System.out.println("myMethod");
}
**private static** void mystaticMethod() {
System.out.println("myStaticMethod");
}
출력결과
정수의 사칙연산을 제공합니다.
myMethod
myStaticMethod
15