Section 1. 인터페이스
1. 인터페이스 (Interface)
모든 메서드가 추상 메서드로 선언되고 모든 변수가 상수로 선언되는 것
- 추상 메서드 -> public abstract
- 상수 -> public static final
2. 인터페이스 정의
- class 가 아닌 interface 지정
- 자동으로 변수를 상수로 선언하고 메서드를 추상 메서드로 지정
- 포함된 모든 메서드가 구현되지 않은 추상 메서드임
public interface Calc { # 계산기의 기능을 명세하는 인터페이스
# 계산기를 이용하고 싶으면 아래의 메서드로 접근하여 사용해야 함
# 결과만 올바르다면 계산 방법은 알아서 구현해라.
double PI = 3.14;
int ERROR = -99999999;
int add(int num1, int num2); # 덧셈 기능
int substract(int num1, int num2); # 뺄셈 기능
int times(int num1, int num2); # 곱셈 기능
int divide(int num1, int num2); # 나눗셈 기능
}
3. 인터페이스 구현
- implements 키워드를 이용해 상속이 아닌 구현
public abstract class Calculator implements Calc{
@Override
public int add(int num1, int num2) { # 덧셈 기능 구현
return num1 + num2;
}
@Override
public int substract(int num1, int num2) { # 뺄셈 기능 구현
return num1 - num2;
}
@Override
public int times(int num1, int num2) { # 곱셈 기능 구현
return num1 * num2;
}
@Override
public int divide(int num1, int num2) { # 나눗셈 기능 구현
if( num2 == 0 )
return ERROR;
else
return num1 / num2;
}
}
3. 인터페이스 구현과 형변환
- 인터페이스를 구현한 클래스는 인터페이스 타입으로 선언된 변수로 형변환 될 수 있음 (업캐스팅)
Calc calc = new CompleteCalc();
- 클래스 상속과 달리 구현 코드가 없으므로 여러 인터페이스를 구현할 수 있음
- 형변환되는 경우 인터페이스 타입의 범위에만 접근 가능 (메서드 등)
4. 인터페이스의 사용 이유
- 클래스나 프로그램이 제공하는 기능을 명시적으로 선언(정의)한 명세서 (specification)
- 클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스를 사용할 수 있음
- 개발 코드를 직접 수정하지 않고도, 사용하고 있는 객체만 변경할 수 있도록 하기 위함
- 인터페이스를 구현한 다양한 객체를 상위 타입으로 핸들링 가능하고 각 객체의 기능을 사용할 수 있음
예) JDBC 인터페이스를 통해 Oralce, MySql, MS-sql 에 각각 접근 가능
- java 측 : JDBC 인터페이스에 선언(정의)된 대로 DB에 접근하면 되는데 방법은 알아서해.
- 각 DB 업체 측 : 명세서에 맞게 각자의 DB에 접근할 수 있도록 구현하고 jar 형식으로 배포
- 클라이언트 측 : 명세서대로 구현된 클래스를 사용
Section 2. 인터페이스 요소
1. 상수
- 모든 변수는 상수로 변환 됨 public static final
double PI = 3.14;
int ERROR = -999999999;
2. 추상 메서드
- 모든 선언된 메서드는 추상 메서드 public abstract
3. 디폴트 메서드 (Defualt Method)
- default 키워드 사용
- 구현된 메서드로써 인터페이스를 구현하는 클래스들에서 공통으로 사용할 수 있는 기본 메서드
- 인터페이스를 구현한 클래스의 인스턴스가 생성 되어야 사용 가능함
- 인터페이스를 구현한 모든 클래스에서 공통으로 구현되는 방식이 존재한다면 코드의 중복을 제거하기 위해서 최소한의 디폴트 메서드를 제공
default void description() {
System.out.println("정수 계산기를 구현합니다.");
myMethod();
}
@Override
public void description() {
System.out.println("CompleteCalc에서 재정의한 default 메서드");
//super.description();
}
4. 정적 메서드 (Static Method)
- 인스턴스 생성과 상관 없이 인터페이스 타입으로 사용할 수 있는 메서드
5. Private Method
- 인터페이스를 구현한 클래스에서 사용하거나 재정의 할 수 없음
- 인터페이스 내부에서만 사용하기 위해 구현하는 메서드
- default 메서드나 static 메서드에서 사용함
Section 3. 추상클래스와 인터페이스
1. 추상 클래스와 인터페이스의 공통점
- 상위의 개념 (상위 클래스 역할)
- 하위에서 상위의 추상 메서드를 구현함
2. 추상 클래스와 인터페이스의 차이점
- 추상 클래스 - 상위 클래스를 상속 받아 기능을 그대로 사용하고 추가적으로 확장하는 개념
- 갑부인 아버지가 아들에게 돈, 빌딩, 집, 자동차를 그대로 물려주고 (상속) , 유튜브, 비트코인, 부동산, 사업 등을 하면 돈을 벌 수 있다고 알려주지만 유튜브를 어떻게 하는지, 비트코인 어떤 종목을 사는지, 어떤 사업을 어떻게 하는지는 알려주지 않음 (추상 메서드). 그러면 아들은 자동차를 그대로 타거나 집을 리모델링 (오버라이딩) 하거나 자기만의 방식으로 먹방 유튜브, 도지 코인, 의류 사업 등을 통해 돈을 벌어서 부를 확장함(구현). 하지만 다른 집 아빠한테는 상속 받을 수 없음 (단일 상속의 원칙). 이 처럼 어느정도 기반을 갖은 채로 시작해서 확장하는 개념
- 상위 클래스에서 좀 더 세분화 및 확장되는 개념
(생물 -> 동물 -> 포유류 -> 사람 -> 남자)
- 인터페이스 - 인터페이스에 선언된 추상메서드들을 모두 처음부터 끝까지 구현
- 갑부인 아버지가 아들에게 아무것도 주지않고 단지 유튜브, 비트코인, 부동산, 사업 등을 하면 돈을 벌 수 있다고만 알려 줌 (추상메서드). 그러면 아들은 자기만의 방식으로 밑바닥 부터 시작해서 무에서 유를 창조하는 자수성가형으로 부를 생성함(구현). 또한 돈을 버는 방법은 유튜브나 지인을 통해서 추가적으로 또 들을 수 있음 (다중 인터페이스 구현 가능). 이 처럼 명세서만 보고 모든 걸 자신만의 방식으로 구현하는 개념
- 클래스나 프로그램이 제공하는 정해진 기능을 여러 방식(전략)으로 구현하는 개념
( 정렬 기능 - 선택정렬 / 삽입정렬 / 버블정렬 ... 등등)