JAVA/Interface

Interface의 개념

DesignatedRoom 2020. 10. 11. 00:59

Interface
   - 추상 메소드로만 이루어져 있다."{}"가 없다. 

   - 아래처럼 중괄호가 없고 메소드의 프로토타입만 선언되어 있으면 추상 메소드이다. 
     예) public abstract void speedDown(int speed);

   - 추상메소드를 사용하는 이유는 앞으로 추가되거나 구현되어야하는 기능의 설계 역할을 하며
     실제 기능은 구현하지 않고 메소드 프로토타입만 구현하는 것을 말한다.

   - 추상 메소드는 건축물에서 구조를 이루는 철근과도 같고 설계도와 같은 역할을 한다.
   
   - 외부에 공개할 메소드를 등록하는 목적으로도 사용된다.

   - 하나의 컴포넌트가 다양한 형태로 구현되어야 할 경우 인터페이스를 이용하면 콤포넌트의
     사용법이 상당히 단순해진다.

   - 인터페이스를 구현한 클래스는 인터페이스 상에 있는 추상 메소드를 전부 구현해야 한다.

   - 인터페이스상에 있는 메소드를 하나라도 구현하지 않으면 인터페이스를 상속받은 클래스는 
     추상클래스가 된다.
   
   - A a_obj = new A(); 인터페이스는 객체를 만들 수 없다. 따라서 반드시 그 인터페이스를
                              구현한 클래스의 객체를 받아 사용하게 되어 있다.
 
     A memo;            //  A인터페이스 형 참조 변수 memo 선언
     memo = new C1();   // C1은 A라는 인터페이스를 전부 구현한 클래스이다.
   
   - 인터페이스에 선언된 메소드를 호출하면 그 인터페이스를 구현한 클래스의 메소드가 
     자동으로 호출된다.

   - 인터페이스를 이용하면 인터페이스를 구현하는 클래스들은 메소드의 형태가 같기 때문에 
     같은 메소드명을 이용하면서 다양한 구현을 할 수 있다.
     이것은 마치 My-SQL용으로 개발된 프로그램을 Oracle 용으로 변경시에 JDBC 드라이버만
     변경하면 프로그램이 작동하는 것과 같은 이치이다.

 

1. Interface의 구현

Inter.java

InterImpl.java

프로그램 실행결과

소스 파일

Inter.java
0.00MB
InterImpl.java
0.00MB

 

 

2 - (1). 인터페이스의 참조
   - 인터페이스를 이용하여 메소드만 호출하는 경우는 인터페이스 타입을 그대로 사용한다.
   - 각 클래스의 멤버 변수에 접근하는 경우는 그 클래스 타입으로 형 변환을 해주어야 한다.
   - 인터페이스에 변수를 선언한다면 주로 상수를 선언한다.
   - 메소드만 선언되는 경우가 대부분이다.
   - 인터페이스 타입  객체 = new 인터페이스 구현 클래스 

프로그램 실행결과

소스 파일

IR2.java
0.00MB

 

 

2 - (2). 인터페이스의 참조 

Myinfointer.java

Myinfo.java

Myinfouse.java

프로그램 실행결과

소스 파일

Myinfo.java
0.00MB
Myinfointer.java
0.00MB
Myinfouse.java
0.00MB

 

 

2 - (2). 인터페이스의 참조 

인터페이스에도 abstract를 쓸 수 있지만 안쓰는 것이 일반적이다.
① 직접 객체생성 불가
② 미구현 함수는 모두 구현해야 한다.
③ 구현 함수는 앞에 반드시 퍼블릭 붙인다.

 

 

 

 

인터페이스를 사용하면, 권한 등에 제한을 줄 수 있다.

아래의 예제를 보자.

프로그램 실행결과

소스 코드

더보기
//	관리자 인터페이스
interface MainAdmin
{
	public void AdminA();
	public void AdminB();
	public void AdminC();
	public void AdminD();
}

interface ASite{public void AdminA();}	//	A지점 관리자 인터페이스
interface BSite{public void AdminB();}	//	B지점 관리자 인터페이스
interface CSite{public void AdminC();}	//	C지점 관리자 인터페이스
interface DSite{public void AdminD();}	//	D지점 관리자 인터페이스

class ASite1 extends Franchise implements ASite {}
class BSite1 extends Franchise implements BSite {}
class CSite1 extends Franchise implements CSite {}
class DSite1 extends Franchise implements DSite {}

class Franchise implements MainAdmin
{
	public void AdminA()
	{
		System.out.println("A지점 관리자 입니다.");
	}
	public void AdminB()
	{
		System.out.println("B지점 관리자 입니다.");
	}
	public void AdminC()
	{
		System.out.println("C지점 관리자 입니다.");
	}
	public void AdminD()
	{
		System.out.println("D지점 관리자 입니다.");
	}
}

public class AdminInterfaceTest {
	public static void main(String[] args) {
		
		ASite a1 = new ASite1();
		a1.AdminA();
		//a1.AdminB();	//	호출 불가. 에러 발생
		//a1.AdminC();	//	호출 불가. 에러 발생
		//a1.AdminD();	//	호출 불가. 에러 발생
	}
}