코딩 기록들
객체지향 프로그래밍 15. 인터페이스 (interface) 본문
인터페이스
- 기본적으로 메서드를 선언을 하면 : public abstract로 모든 메서드가 선언됨
- 모든 변수는 : 상수로 선언됨 public static final (구현코드가 하나도없기때문에 그 안에서 멤버변수를 가질 수 없음)
interface 인터페이스 이름{
public static final float pi = 3.14F;
public void makeSomething();
}
- 구현되어있는 코드를 -> 상속받는것 ex추상클래스
- 인터페이스는 구현코드가 없으므로 -> (하위의 상속받는 클래스가) 인터페이스를 상속이 아닌, '구현'한다(implement라고 표현함)
인터페이스 정의와 구현 예제
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);
}
//calc의 4개메서드가 아닌, 2개메서드만 구현하므로 abstract메서드로 표현해야됨
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;
}
}
//Calculator에서 구현하지 않은 2개메소드를 마저 구현
public class CompleteCalc extends Calculator{
@Override
public int times(int num1, int num2) {
return num1 * num2;
}
@Override
public int divide(int num1, int num2) {
if( num2 == 0 ) //부모가 0이면 에러코드(-99999999) 발생
return ERROR;
else
return num1 / num2;
}
public void showInfo() {
System.out.println("모두 구현하였습니다.");
}
}
public class CalculatorTest {
public static void main(String[] args) {
//Calc'타입' 상속을 한 것. CompleteCalc만 생성할 수 있음.(Calcualtor은 abstract이기 때문에 생성)
Calc calc = new CompleteCalc(); //타입을 calc로 했기때문에 calc. 가 쓸수있는 메서드는 calc메서드에 있는것뿐임
int num1 = 10;
int num2 = 2;
System.out.println(num1 + "+" + num2 + "=" + calc.add(num1, num2));
System.out.println(num1 + "-" + num2 + "=" +calc.substract(num1, num2));
System.out.println(num1 + "*" + num2 + "=" +calc.times(num1, num2));
System.out.println(num1 + "/" + num2 + "=" +calc.divide(num1, num2));
}
}
//구현상속 : 구현 코드르 받은것
//타입상속 : 인터페이스 타입 상속받은것
// 인터페이스는 구현코드가 없기때문에 다중상속을 해도 모호성이 발생하지 않음. -> 여러개 타입을 상속받을 수 있음
인터페이스 구현과 형 변환
- 인터페이스를 구현한 클래스는 인터페이스 형으로 선언한 변수로 형 변환 할 수 있음
- Calc calc = new CompleteCalc();
- 상속에서의 형 변환과 동일한 의미
- 클래스 상속과 달리 구현 코드가 없으므로 여러 인터페이스를 구현할 수 있음 ( cf. extends)
- 형 변환되는 경우 인터페이스에 선언된 메서드만을 사용가능함
인터페이스가 하는 일
-> 모듈이 무슨일을 해야하는지 명세 + 쓰는입장에서는 : 인터페이스만 보고 설계할수 있도록 함
- 클래스나 프로그램이 제공하는 기능을 명시적으로 선언
- 일종의 클라이언트(코드를 사용하는 쪽) 코드와의 약속이며 클래스나 프로그램이 제공하는 명세(specification)
- 클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스를 사용할 수 있음
- 어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미임
- 인터페이스를 구현한 다양한 객체를 사용함 - 다형성
- 예) JDBC 인터페이스 (DB) - Java - connection - (Oracle, Ms-SQL, MySQL) 로 연결됨 -> connection인터페이스를 구현하는 회사들(Oracle, Ms-SQL, MySQL) 이 구현해서 jar파일(DB드라이버=라이브러리)제공함