목표
자바의 인터페이스에 대해 학습하세요.
학습할 것 (필수)
- 인터페이스 정의하는 방법
- 인터페이스 구현하는 방법
- 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
- 인터페이스 상속
- 인터페이스의 기본 메소드 (Default Method), 자바 8
- 인터페이스의 static 메소드, 자바 8
- 인터페이스의 private 메소드, 자바 9
인터페이스 정의하는 방법
인터페이스는 추상클래스를 더 추상화한 것으로 공통적인 기능을 규격화하는 역할을 한다
인터페이스는 class 대신에 interface 키워드를 사용한다
public interface Item {
}
기존 인터페이스는 상수와 추상메소드만 가지는데 자바8부터 디폴트 메소드, 정적 메소드도 추가되었다
public interface Item {
// 상수
int MAX_QUALITY = 100;
int MIX_QUALITY = 0;
// 추상 메소드
void updateQuality(int sellIn);
int getQuality();
// default 메소드
default void saleOut() {
System.out.println("sale out");
}
// static 메소드
static void clearItem() {
System.out.println("clear item");
}
}
인터페이스를 구현하는 방법
상속과 비슷하지만 implements 키워드를 이용한다
인터페이스에 정의된 추상 메소드를 강제적으로 구현해야한다
public class Book implements Item{
private int sellIn = 0;
private int quality = 0;
@Override
public void updateQuality(int sellIn) {
this.sellIn = sellIn;
}
@Override
public int getQuality() {
return this.quality;
}
}
디폴트 메소드는 재구현이 선택적이다.
인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
인터페이스는 레퍼런스 타입이기에 구현체를 대입할 경우 구현 객체의 레퍼런스를 저장한다
이를 활용해 다형성을 이용할 수 있다
간단한 인터페이스와 이를 구현하는 클래스를 2개 선언해보자
public interface Animal {
void cry();
void age();
}
class Dog implements Animal {
@Override
public void cry() {
System.out.println("멍멍멍멍멍 왈오랑롸와와오아롸롸와왕왈");
}
@Override
public void age() {
System.out.println("1살");
}
}
class Cat implements Animal {
@Override
public void cry() {
System.out.println("야옹야오야오야오야");
}
@Override
public void age() {
System.out.println("5살");
}
}
이제 다음과 같이 사용해보자
public class StudyMain {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
action(dog);
action(cat);
}
// 인터페이스 Animal 구현 객체가 실행된다.
public static void action(Animal animal) {
animal.cry();
animal.age();
}
}
인터페이스 상속
일반적인 상속과 다르게 인터페이스는 다중상속을 받을 수 있다.
public interface Father {
void print();
}
interface Mom {
void play();
}
// , 로 다중 상속이 가능하다
interface child extends Father, Mom {
void study();
}
하위 인터페이스를 구현을 한다면 해당 클래스는 상위 인터페이스 메소드까지 모두 구현해야한다
class Java implements Child{
// 상위 인터페이스 Father 메소드
@Override
public void print() {
}
// 상위 인터페이스 Mom 메소드
@Override
public void play() {
}
@Override
public void study() {
}
}
인터페이스의 기본 메소드 (Default Method), 자바 8
자바8 도입되면서 인터페이스에 변화가 찾아왔다
바로 인터페이스에 구현부를 가진 디폴트 메소드가 생긴 것이다
디폴트 메소드는 하위호환성을 보존하기 위해 추가된 것으로 기존 인터페이스에 메소드가 추가되면
해당 인터페이스를 구현하는 모든 하위 클래스에 해당 메소드를 구현해야하는 불편함이 있었지만
디폴트 메소드를 추가되면서 하위 클래스는 그대로 인터페이스의 디폴트 메소드를 사용해도 되는 장점이 생겼고
필요에 따라 재구현도 가능하다
public interface Animal {
void cry();
void age();
default void move() {
System.out.println("움직인다");
}
}
class Dog implements Animal {
@Override
public void cry() {
System.out.println("멍멍멍멍멍 왈오랑롸와와오아롸롸와왕왈");
}
@Override
public void age() {
System.out.println("1살");
}
}
class Cat implements Animal {
@Override
public void cry() {
System.out.println("야옹야오야오야오야");
}
@Override
public void age() {
System.out.println("5살");
}
}
(생략)....
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
action(dog);
action(cat);
}
// 인터페이스 Animal 구현 객체가 실행된다.
public static void action(Animal animal) {
animal.move();
}
인터페이스의 static 메소드, 자바 8
디폴트 메소드와 마찬가지로 추가된 static 메소드다
구현 객체 없이 인터페이스.메서드명 으로 호출이 가능해졌다
public interface Animal {
.....
static void call() {
System.out.println("구현 객체가 필요없다");
}
}
public static void main(String[] args) {
// 인터페이스.메소드명으로 호출 가능.
Animal.call();
}
인터페이스의 private 메소드, 자바 9
자바9 부터 인터페이스에서 캡슐화를 사용할 수 있게 private 메소드 선언이 가능해졌다
만약에 static 메소드에서 사용하려면 private 도 static 로 선언되어야 한다
public interface Animal {
....
default void move() {
nomalCap();
System.out.println("움직인다");
}
static void call() {
staticCap();
System.out.println("구현 객체가 필요없다");
}
private void nomalCap() {
System.out.println("private method");
}
// static 메소드에서 사용하려면 static을 붙여야한다.
private static void staticCap() {
System.out.println("private static method");
}
}
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
action(dog);
action(cat);
Animal.call();
}
// 인터페이스 Animal 구현 객체가 실행된다.
public static void action(Animal animal) {
animal.move();
}
이것이자바다, 신용권 [한빛미디어]
'개발 & 방법론 > Java' 카테고리의 다른 글
10주차 과제 : 멀티쓰레드 프로그래밍 (0) | 2021.02.18 |
---|---|
9주차 : 예외처리 (0) | 2021.02.14 |
7주차 : 패키지 (0) | 2021.01.01 |
6주차 : 상속 (0) | 2020.12.30 |
5주차 : 클래스(Class) (0) | 2020.12.21 |