[whiteship_java_study]8주차. 인터페이스
목표
자바의 인터페이스에 대해 학습하세요.
학습내용
인터페이스 정의하는 방법
인터페이스 구현하는 방법
인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
인터페이스 상속
인터페이스의 기본 메소드 (Default Method), 자바 8
인터페이스의 static 메소드, 자바 8
인터페이스의 private 메소드, 자바 9
인터페이스(Interface)
영어의 뜻을 해석하면 대면부, 결합부이다. 두개 이상의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면이다.
자바에서 인터페이스란 다른 클래스를 작성할때 기본이 되는 틀을 제고하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미한다.
또한, 인터페이스는 일반적인 추상클래스와 다르게 다중 상속을 지원한다.
단, 추상클래스와 다르게 추상 메소드와 상수만을 포함할 수 있다.
인터페이스 정의
인터페이스는 클래스를 작성하는 방법과 동일하다.
단 접근제어자와 함께 class 대신 interface 키워드를 사용한다.
인터페이스 구현
인터페이스는 추상 클래스와 마찬가지로 자신이 직접 인스턴스를 생성할 수 없다.
따라서 인터페이스가 포함하고 있는 추상 메소드를 구현해 줄 클래스를 작성해야한다.
인터페이스의 장점
- 대규모 프로젝트 개발 시 일관되고 정형화된 개발을 위한 표준화가 가능하다.
- 클래스의 작성과 인터페이스의 구현을 동시에 진행할 수 있으므로, 개발 시간을 단축할 수 있다.
- 클래스와 클래스 간의 관계를 인터페이스로 연결하면, 클래스마다 독립적인 프로그래밍이 가능하다.
package week.eight;
public interface DefineInterface {
public static final String CHICKEN_BRAND="KYOCHON";
int CHICHEN_MOO_PRICE = 500; //public static final 생략
public abstract void order(String chickenType);
int getPrice(); //public abstract 생략
}
접근 제어자 interface 인터페이스 이름 {
public static final 타입상수이름 = 값;
public abstract 메소드이름(매개변수 목록);
//public abstract 생략 가능
메소드이름(매개변수 목록);
}
인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
구현한 인터페이스는 다른 클래스에서 참조하여 사용 가능하다.
추상클래스는 extends를 사용하여 해당 클래스를 상속 받았다. 인터페이스는 implements 를 통해 상속받아 사용한다.
위의 구현한 인터페이스를 참조하여 구현체를 만들었다.
package week.eight;
public class ImplementInterface implements DefineInterface{
//인터페이스를 상속받으면 무조건 주어진 추상 메소드들은 정의해주어야한다.
private int price;
public ImplementInterface() {
//우리집 치킨 기본 가격은 8000원 이다.
price = 8000;
}
@Override
public void order(String chickenType) {
switch (chickenType) {
case "hot":
//매운소스는 1000원을 더 받는다.
price+=1000;
break;
case "black":
//블랙소스는 1500원이다.
price+=1500;
break;
default:
//나머지는 기본가격이다.
break;
}
}
@Override
public int getPrice() {
//가격을 반환한다.
return price;
}
public void takeOut() {
//테이크아웃은 치킨무 가격 만큼 할인해준다.
price -= CHICHEN_MOO_PRICE;
}
public void delivery(String member) {
//배송 업체에 따라 가격을 추가한다.
switch(member) {
case "baemin":
price += 2000;
break;
case "coupang":
price += 3000;
break;
case "baemin-1":
price += 3000;
break;
case "yogiyo":
price += 1900;
break;
default:
price +=1500;
}
}
}
인터페이스 상속
추상클래스와 다르게 다중상속을 받을 수 있다.
package week.eight;
interface Delivery {
void setDelivery(String member);
}
public class ImplementInterface implements DefineInterface, Delivery{
//인터페이스를 상속받으면 무조건 주어진 추상 메소드들은 정의해주어야한다.
private int price;
public ImplementInterface() {
//우리집 치킨 기본 가격은 8000원 이다.
price = 8000;
}
@Override
public void order(String chickenType) {
switch (chickenType) {
case "hot":
//매운소스는 1000원을 더 받는다.
price+=1000;
break;
case "black":
//블랙소스는 1500원이다.
price+=1500;
break;
default:
//나머지는 기본가격이다.
break;
}
}
@Override
public int getPrice() {
//가격을 반환한다.
return price;
}
public void takeOut() {
//테이크아웃은 치킨무 가격 만큼 할인해준다.
price -= CHICHEN_MOO_PRICE;
}
@Override
public void setDelivery(String member) {
//배송 업체에 따라 가격을 추가한다.
switch(member) {
case "baemin":
price += 2000;
break;
case "coupang":
price += 3000;
break;
case "baemin-1":
price += 3000;
break;
case "yogiyo":
price += 1900;
break;
default:
price +=1500;
}
}
}
인터페이스의 기본메소드, 자바8
기본메소드(default Method)를 인터페이스 내에 선언하여 구현할 수 있게되었다.
package week.eight;
public class DefaultMethod implements Car{
int price;
public DefaultMethod() {
price = 20000000;
}
@Override
public int getPrice() {
return price;
}
@Override
public void addOption(String option) {
if(!option.isEmpty()) {
price += 200000;
}
}
//default 메소드도 오버라이드 가능
@Override
public double discount(int percent) {
//우리가게는 기본에서 10만원 더 깎아줄거야
return Car.super.discount(percent) - 100000;
}
}
interface Car {
public int getPrice();
public void addOption(String option);
//default로 선언하여 메소드 구현
default double discount(int percent) {
return getPrice() * (1- (percent * 0.01));
}
}
인터페이스의 static 메소드, 자바 8
정적 메소드(static method)
인스턴스의 생성과 상관 없이 인터페이스 타입으로 호출하는 메소드이다. static 예약어를 사용하고 public 을 접근제어자로 사용한다. 이는 기존의 인터페이스에서 상수를 선언하는것과 동일하다.
default 메소드와 다르게 프로그램이 실행될때 메모리에 들어가기 때문에 이후에 수정이 불가능하다.
default method는 getprice() 메소드를 사용할 수 있지만 static 메소드에서는 불가능하다.
오버라이딩을 할 수 없다.
interface Car {
public int getPrice();
public void addOption(String option);
//default로 선언하여 메소드 구현
default double discount(int percent) {
return getPrice() * (1- (percent * 0.01));
}
public static int bagagi(int hoguLevel) {
return hoguLevel * 20000;
}
}
인터페이스의 private 메소드, 자바 9
인터페이스 내에서만 사용가능한 메서드이다. 디폴트 메소드나 정적메소드에 사용되기 위해 작성되는 메소드이다.
인터페이스를 구현할때 재정의 할 수 없다.(@override 불가)
디폴트/정적메소드를 통해서만 사용이 가능하다
interface Car {
public int getPrice();
public void addOption(String option);
//default로 선언하여 메소드 구현
default double discount(int percent) {
return getPrice() * (1- (percent * 0.01));
}
public static int bagagi(int hoguLevel) {
shout();
return hoguLevel * 20000;
}
private void shout() {
System.out.println("호구야!");
}
}