인터페이스(Interface)
(1) 사전적 의미
하나의 시스템을 구성하는 두 개의 요소 또는
서로 다른 시스템 간의 상호 작용을 이루는 경계
하드웨어/소프트웨어/조건/규약 등을 포괄적으로 칭함
(2) Java에서의 인터페이스
프로그램과 프로그램을 연결하는 것
한 마디로 요약하면 [규제]
특정한 규약에 의해 개발하도록 하는 목적
클래스가 인터페이스를 이용하려면 "반드시"
인터페이스가 규정한 메서드들을 다 만들어야 함
인터페이스의 메서드를 구현하지 않으면 컴파일 실패
(3) 왜 만들었을까?
계산기 프로그램 개발 프로젝트
계산기 클래스는 A 개발자가 개발
응용 프로그램 클래스는 B 개발자가 개발
동시에 개발을 하다보니 B는 A가 개발할
모습을 예측하여 개발 진행
그런데 나중에 통합테스트 때 보니.....
A는 add(a, b)라고 개발했는데,
B는 add(a[])라고 개발
=> 폭망
=> Tomas Wujec : Build a Tower, Build a Team
(4) 사용법
[public] interface 인터페이스명 {
[public][static][final] 자료형 상수명 = 값;
[public] 리턴타입 메서드명(인자);
[public] default 리턴타입 메서드명(인자){
메서드 내용;
}
[public] static 리턴타입 메서드명(인자){
메서드 내용;
}
}
class 클래스명 implements 인터페이스명 {
}
* 클래스 생성 시 가장 복잡한 형태
class 클래스명 extends 부모 implements 인터1, 인터2, ...
throws Exception {
}
(5) 예제
interface Interface1 {
public void myMethod1();
}
class Class1 implements Interface1 {
public void myMethod1(){
}
}
(6) 인터페이스의 특징
- 상속과 구현은 완전히 다르다.
- 상속은 부모 클래스의 기능을 자식이 물려받는 것
구현은 자식이 반드시 만들도록 강제
- 클래스 선언은 class
인터페이스 선언은 interface
- 클래스 상속은 extends
인터페이스 구현은 implements
(7) 인터페이스 구현 특이사항
1) 하나의 클래스가 여러 인터페이스 구현 가능
interface I1 { void x(); }
interface I2 { void y(); }
class C1 implements I1, I2 {
void x(){ }
void y(){ }
}
2) 인터페이스도 상속이 된다.
interface I3 { void x(); }
interface I4 extends I3 {
void y();
}
class C2 implements I4 {
void x(){ }
void y(){ }
}
(8) HeadAches
1) default, static : Java8 부터 만들어짐
2) default : 메서드를 인터페이스가 만듬
static : 구현한 클래스의 객체화 없이 호출 가능
3) default와 static는 왜 만들어졌을까?
* 예) 메서드 선언이 600개가 있던 인터페이스
많은 기업들이 이를 가지고 구축 완료
Java가 업데이트가 되면서 400개 메서드 추가
=> 아무도 업데이트 안함
=> 개발 끝나고 이미 운영 중
=> 불만도 없고 인력도 없고 => 개발 왜함?
=> 400개의 메서드를 java 회사가 만듬
=> 바꿀려면 바꿀 수 있음
(9) 인터페이스의 사용
클래스와의 사용 불분명(모호함)으로 혼란
Spring에서 부활함
Spring에서는 java와 sql(mapper) 역할 분리
java에서는 인터페이스를 만들고 메서드 이름 부여
sql xml에서 이름에 매핑되는 SQL을 작성함
=> Java에서는 구현하지 않았기 때문에
interface의 기본 사상에 완벽하게 맞음
☆ Code
★ CalApp
import util.MyUtil;
public class CalApp {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyUtil.cp(MyUtil.BOLD + "Super Calculator De Jesus");
// CalculatorDummy c = new CalculatorDummy();
Calculator c = new Calculator();
c.setOperand(10, 20, 31);
MyUtil.p("합계는 " + c.sum());
MyUtil.p("평균은 " + c.avg());
}
}
class CalculatorDummy implements CalculatorI {
public void setOperand(int aaa, int bbb, int ccc) {
}
public int sum() {
return 100;
}
public double avg() {
return 30.0;
}
}
★ CalculatorI
public interface CalculatorI {
void setOperand(int first, int second, int third);
int sum();
double avg();
}
★ Calculator
public class Calculator implements CalculatorI {
int left, right, center;
public void setOperand(int f, int s, int t) {
left = f;
right = s;
center = t;
}
public int sum() {
return left + right + center;
}
public double avg() {
return (int)(sum() / 3D * 1000) / 1000.;
}
}
★ InterMain
import util.MyUtil;
public class InterMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyClass mc = new MyClass();
MyUtil.p("mc.aaa = " + mc.aaa);
MyUtil.p("MyInterface.aaa = " + MyInterface.aaa);
mc.dMethod();
mc.dMethod2();
MyInterface.sMethod();
MyInterface mi = new MyClass();
mi.dMethod2();
}
}
★ MyInterface
import util.MyUtil;
public interface MyInterface {
int aaa = 500; // 인터페이스에서 변수를 정의하면 자동으로 static이 된다.
void myMethod();
default void dMethod() { // default는 인터페이스가 메서드를 구현한다.
MyUtil.p("[dMethod] Called");
}
default void dMethod2() {
MyUtil.p("[dMethod2] Called");
}
static void sMethod() { // static 함수는 구현되지 않는다.
MyUtil.p("[sMethod] 누가 날 부르셨어요?");
}
}
★ MyClass
import util.MyUtil;
public class MyClass implements MyInterface {
public int aaa = 1000;
public void myMethod() {
}
public void dMethod2() { // 인터페이스의 default 메서드를 새롭게 정의하면, 기존 default는 사라진다.
MyUtil.p("[dMethod2] 난 베끼지 않는다 새롭게 정의할 뿐");
}
}
'JAVA' 카테고리의 다른 글
JAVA 예외 (2) | 2024.11.16 |
---|---|
JAVA base class (3) | 2024.11.15 |
JAVA string class (0) | 2024.11.15 |
JAVA 상속2 (0) | 2024.11.14 |
JAVA 상속1 (2) | 2024.11.14 |