본문으로 바로가기

[JAVA] 인터페이스 사용 방법

category 4. 프로그래밍 기초/4_1 JAVA 2018. 12. 25. 22:27

   

 

인터페이스는 일종의 추상클래스. 추상클래스보다 추상화 정도가 높다. 

일반 메서드와 변수를 가질 수 있었던 "추상 클래스"와 달리 
인터페이스는 추상메서드와 상수만을 구성멤버로 갖는다. 때문에 객체 생성이 불가능하다.
단지, 클래스 작성에 도움을 줄 목적

구조 
1)  class 대신 interface 
2) extends 대신 implements(구현하다)

		interface Test{
			public static final int A = 10;		//상수(final)
			public abstract void add();			//추상메서드
		}
		------------------------------------------------------
		class InterTest implements Test{
			public void add(){
				//오버라이딩
			}
		}

 

인터페이스 특징
1) 인터페이스 역시 상속관계에서 쓰이는데 이때 implements 키워드를 사용
2) 구현 받은 클래스는 반드시 상위 클래스의 추상메서드를 "오버라이딩" 해야 한다.
3) 일반적으로 클래스를 상속 받을 때 1:1만 가능하였으나 인터페이스는 다중 상속 가능

인터페이스 장점
1) 개발시간 단축
2) 표준화

예제)

package practice;

interface iVehicle // 인터페이스 선언
{
	void show(); //추상 메소드
}

class Carr implements iVehicle //인터페이스 구현
{
	private int num;
	private double gas;
	
	public Carr(int n, double g)
	{
		num = n;
		gas = g;
		System.out.println("차량번호 : " + num);
		System.out.println("연료 양   : " + gas);
		System.out.println("자동차가 만들어졌습니다.");
	}
	
	public void show() // 추상메소드 오버라이딩
	{
		System.out.println("차량번호 : " + num + "---- 연료 양 : " + gas);
	}
}

class Planee implements iVehicle // 인터페이스 구현
{
	private int flight;
	
	public Planee(int f)
	{
		flight = f;
		System.out.println("비행기 번호 : " + flight);
	}
	
	public void show() // 추상메소드 오버라이딩
	{
		System.out.println("비행기 번호 : " + flight + "입니다.");
	}
}

public class Practice02 {

	public static void main(String[] args) {

		iVehicle[] iv = new iVehicle[2]; // 인터페이스 배열 준비
		
		iv[0] = new Carr(1234, 50.5); //Carr클래스
		iv[1] = new Planee(500); /// Planee클래스
		
		for(int i=0; i<iv.length; i++)
		{
			iv[i].show();
		}
		

	}

}

 

인터페이스 확장
인터페이스는 클래스와 마찬가지로, 확장해서 새로운 인터페이스를 선언할 수 있다.
확장 되는 인터페이스를 슈퍼 인터페이스, 확장 하는 인터페이스를 서브 인터페이스라고 한다.
extends 키워드를 사용한다

package practice;

interface iVehicle // 인터페이스 선언
{
	void show(); //추상 메소드
}

class Carr implements iVehicle //인터페이스 구현
{
	private int num;
	private double gas;
	
	public Carr(int n, double g)
	{
		num = n;
		gas = g;
		System.out.println("차량번호 : " + num);
		System.out.println("연료 양   : " + gas);
		System.out.println("자동차가 만들어졌습니다.");
	}
	
	public void show() // 추상메소드 오버라이딩
	{
		System.out.println("차량번호 : " + num + "---- 연료 양 : " + gas);
	}
}

class Planee implements iVehicle // 인터페이스 구현
{
	private int flight;
	
	public Planee(int f)
	{
		flight = f;
		System.out.println("비행기 번호 : " + flight);
	}
	
	public void show() // 추상메소드 오버라이딩
	{
		System.out.println("비행기 번호 : " + flight + "입니다.");
	}
}

public class Practice02 {

	public static void main(String[] args) {

		iVehicle[] iv = new iVehicle[2]; // 인터페이스 배열 준비
		
		iv[0] = new Carr(1234, 50.5); //Carr클래스
		iv[1] = new Planee(500); /// Planee클래스
		
		for(int i=0; i<iv.length; i++)
		{
			iv[i].show();
		}
		

	}

}

 

인터페이스를 확장할 때에는 "extends"를 사용하지만, 이러한 인터페이스를 클래스로 구현할 경우에는 
"impleaments"를 사용한다.

강의 요약
● 인터페이스를 선언해서 클래스로 구현할 수 있다.
● 인터페이스 선언된 필드는 상수가 된다.
● 인터페이스의 메소드는 몸체 없는 추상 메소드입니다.
● 인터페이스를 확장해서 서브 인터페이스를 선언할 수 있습니다.


문제1)
다음 항목에 대해 O또는 X로 답하시오.
1. 추상 클래스 변수는 선언할 수 없다.
2. 추상 클래스 객체는 생성할 수 없다.
3. 인터페이스형 변수는 선언할 수 있다.
4. 인터페이스가 인터페이스를 상속받을 때에는 implements키워드를 사용한다.


답 : 
1.X 2.O 3.O 4.X 



문제2) 다음 코드를 보고 O또는 X로 답하시오.

1 클래스 A는 클래스 B를  확장한 서브 클래스이다.
2. 클래스 A는 인터페이스 C를 구현하고 있다.
3. 인터페이스 C는 클래스 D를 확장한 서브 인터페이스이다.

interface C extends D 
{
	....
}

interface A extends B implemnets C 
{
	....
}


답 : 1.O 2.O 3.X 

 

문제3) 다음 코드의 잘못된 점을 말해보자.
abstract class Vehicle
{
	protected int speed;
	public void setSpeed(int s)
	{
		speed = s;
		System.out.println("속도를 " + speed + "으로 변경했습니다.");
	}
	abstract void show();
}
public class Practice04 {

	public static void main(String[] args) {
	
		Vehicle vc = new Vehicle();
		vc.setSpeed(500);
		vc.show();
	}

}

답 : 추상클래스는 객체를 만들 수 없다. 또한 추상메서드를 오버라이딩해야한다.