인터페이스(interface) :
자바에서 다중 상속이 되지 않는 이유는 메소드 출처의 모호성 등 여러 가지 문제가 발생할 수 있기 때문이다. 하지만 다중상속의 이점을 버릴 순 없어 자바에서는 인터페이스 라는 것을 통한 다중 상속을 지원하고 있다.
인터페이스란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미한다. 그러나 추상 클래스는 추상 메소드뿐만 아니라 생성자, 필드, 일반 메소드도 포함할 수 있는 반면, 인터페이스는 오로지 추상 메소드와 상수만을 포함할 수 있다. 만약 모든 메소드를 추상 메소드로 구현하지 않는다면, abstract 키워드를 사용하여 추상 클래스로 선언해야 한다.
인터페이스 장점
- 대규모 프로젝트 개발 시 일관되고 정형화된 개발을 위한 표준화가 가능하다.
- 클래스의 작성과 인터페이스의 구현을 동시에 진행할 수 있으므로, 개발 시간을 단축 시킨다.
- 클래스와 클래스 간의 관계를 인터페이스로 연결 하면 클래스마다 독립적인 프로그래밍이 가능하다.
① 인터페이스 기본 문법
→ 추상 메서드로만 구성 되어 있어서 객체를 가질 수 없기 때문에 class 키워드를 쓰지 않는다.
interface 인터페이스이름 {
. . .
}
② 인터페이스 구현 문법
class 클래스이름 implements 인터페이스이름 {
...
}
③ 인터페이스의 상속과 구현을 동시에 하는 문법
class 클래스이름 extend 상위클래스이름 implements 인터페이스이름 {
...
}
예제 1) 여러 인터페이스를 한번에 상속 받는 클래스
interface A {
public void f1();
}
interface B {
public void f2();
}
interface C {
public void f3();
}
class InterfaceTest2 implements A,B,C { //쉼표로 연결 해주면 다 상속 받을 수 있다.
@Override
public void f2() {
// TODO Auto-generated method stub
}
@Override
public void f1() {
// TODO Auto-generated method stub
}
@Override
public void f3() {
// TODO Auto-generated method stub
}
}
예제 2) 인터페이스를 상속 받은 클래스를 main 클래스에 구현 하기
package Interface_test;
interface InterTest { // 완전 추상이라 abstract 키워드 사용하지 않는다.
int MAX = 100; // 상수
// int a; // 오류 나는 이유 : 상수는 선언할때 초기회 해야 하는데 선언만 했기 때문에
// public void f2() {} //이렇게 구현 된 메서드를 사용하면 오류가 생긴다.
// public abstract void f3(); //public abstract 없어도 자동으로 붙여줌. 왜? 인터페이스라서~
void f1();
void f2();
void f3();
}
class InterTestImpl implements InterTest {
@Override
public void f1() {
// TODO Auto-generated method stub
System.out.println("f1()");
}
@Override
public void f2() {
// TODO Auto-generated method stub
System.out.println("f2()");
}
@Override
public void f3() {
// TODO Auto-generated method stub
System.out.println("f3()");
}
}
public class InterfaceTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
InterTest t = new InterTestImpl();// 업캐스팅으로 인터페이스 타입으로 지정 해줬다.
System.out.println(InterTest.MAX);// 객체를 지정해서 상위클래스에서 생성 된 값도 쓰고
t.f1(); // 자식 객체에 있는 것도 써줌
t.f2();
t.f3();
}
}
예제 3) 상속과 구현을 동시에 하기
package Interface_test;
import java.awt.Frame; //Frame이 API라서 따로
//Frame 창을 하나 만들어주는 클래스 Runnable 을 Thread 로 만들어주는 클래스
//다중 상속이 안되서. 하나는 클래스 하나는 인터페이스 상속을 받을 수 있께 해준다.
class Test extends Frame implements Runnable {
// runnable 의 run이 구현 되어 있는 api
// Thread 멀티태스킹을 지원하는 프로그레스
@Override
public void run() { // Thread 실행 코드를 작성하는 메서드
// TODO Auto-generated method stub
for (int i = 1; i <= 10; i++) {
this.setTitle(i + "번째 타이틀"); // Frame (실행 했을 떄 나오는 윈도우 창)
// 하기 부터는 Thread
try { // try - catch 예외처리 하는 구문
Thread.sleep(1000);
// sleep은 잠 재우는것 (예외처리 꼭 해줘야 하는 것) 1000 =1 초
// 타이틀 한번 출력하고 1초 쉬고 바꾸라고
// 만약에 Thread.sleep(1000); 이거 안쓰면 그냥 for 문의 10만 보임 너무 빨라서
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class 인터페이스상속 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test t = new Test(); // 클래스 Test 객체생성
t.setSize(500, 200); // 윈도우 창의 가로세로 크기
t.setVisible(true); // 윈도우를 화면에 보이게 할 것이니?
Thread th = new Thread(t); // 쓰레드 생성
th.start(); // 쓰레드 실행
}
}
'JAVA' 카테고리의 다른 글
[JAVA] 예외처리 (1) | 2023.03.04 |
---|---|
[JAVA] 인터페이스 활용 (0) | 2023.03.04 |
[JAVA] 추상 클래스 (0) | 2023.03.04 |
[JAVA] 객체지향 - 상속을 이용한 포켓몬 키우기 게임 (0) | 2023.03.02 |
[JAVA] 객체지향 - 회원가입 만들기 (0) | 2023.03.02 |