인터페이스란 클래스가 구현해야 할 메소드를 선언해 둔 자바 파일이다.
- 특징
- 작업지시서 역할을 수행한다.
- 극단적으로 동일한 목적 하에 동일한 기능을 수행하게끔 강제한다.
- 인터페이스 구현을 할때는 상속을 할때
extends
를 하는 것처럼implements
키워드를 이용한다.- 인터페이스를 구현한느 클래스는 반드시 인터페이스의 모든 추상메소드를 오버라이드(override)해야한다.
- 인터페이스에 작성하는 추상메소드는 abstract키워드를 생략할 수 있다.
메인메소드
public class Main {
public static void main(String[] args) {
Shape s = new Circle(1);
System.out.println(s.getArea());
}
}
인터페이스
인터페이스는 접근제어자(public, private 등) 뒤에 class대신 interface를 명시한다.
public interface Shape {
// final 상수
public final static double PI = 3.141592;
// static 생략 가능
// 추상 메소드
public double getArea();
// public, abstract 생략가능(하지만 public은 웬만하면 생략안함)
// default 메소드(본문이 있는 메소드)
public default void message() {
System.out.println("나는 도형이다.");
}
}
인터페이스를 구현하는 클래스
public class Circle implements Shape {
public double radius;
public Circle(double radius) {
super();
this.radius = radius;
}
@Override
public double getArea() {
return PI * Math.pow(radius, 2);
}
}
인터페이스와 클래스, 상속클래스 간의 메소드 호출을 해보겠다.
추상클래스
public abstract class Phone {
public abstract void call();
public abstract void sms();
}
인터페이스
public interface Computer {
public void game();
public void internet();
}
상속클래스(자식클래스)
// 상속(extends) 먼저, 구현(implements) 나중
public class SmartPhone extends Phone implements Computer {
@Override
public void call() {
// TODO Auto-generated method stub
}
@Override
public void sms() {
// TODO Auto-generated method stub
}
@Override
public void game() {
// TODO Auto-generated method stub
}
@Override
public void internet() {
// TODO Auto-generated method stub
}
}
인터페이스를 구현(implements)
하면 인터페이스의 요소들을 모두 오버라이드(Override) 해주어야 한다.
이제 메인클래스에서 각 클래스와 인터페이스의 메소드들을 호출해보겠다.
메인 클래스
public class Main {
public static void main(String[] args) {
// 메소드 호출 연습
Phone p1 = new SmartPhone();
p1.call();
p1.sms();
((Computer) p1).game(); // Down-Casting
((Computer) p1).internet(); // Down-Casting
Computer p2 = new SmartPhone();
((Phone) p2).call(); // Down-Casting
((Phone) p2).sms(); // Down-Casting
p2.game();
p2.internet();
SmartPhone p3 = new SmartPhone();
p3.call();
p3.sms();
p3.game();
p3.internet();
}
}
추상메소드 Phone
에서는 Cumputer
인터페이스를 implements
해주지 않았으므로, Computer에 속한 메소드들을 호출할 때에는 다운캐스팅(Down-Casting)
해주어야 한다.
인터페이스 Computer
에서도 Phone
에 있는 요소들을 불러오기 위해서는 다운캐스팅(Down-Casting)
해주어야 한다.
public interface Walkable {
}
간혹 이렇게 비어있는 인터페이스를 사용하기도 한다고 한다.
- 수많은 동등한 레벨의 객체들 중에 특정한 객체들만 뽑아서 메소드를 동작시키려고 할 때 주로 사용한다.
- 생성한 객체를 파일로 저장할 때 사용한다.
- 저장한 객체를 읽거나 다른 서버에서 객체를 받을 때 사용한다.
예제로 설명을 해보겠다.
강아지와 고양이, 뱀에게 먹이를 주고, 강아지와 고양이는 산책을 시키는 코드를 구현하라.
강아지, 고양이, 뱀
public class Dog extends Pet implements Walkable { // 인터페이스를 구현한다.
public Dog(String petName) {
super(petName);
}
}
public class Cat extends Pet implements Walkable { // 인터페이스를 구현한다.
public Cat(String petName) {
super(petName);
}
}
public class Snake extends Pet {
public Snake(String petName) {
super(petName);
}
}
강아지, 고양이, 뱀의 부모클래스인 Pet 클래스
public class Pet {
// 필드
private String petName;
// 생성자
public Pet(String petName) {
super();
this.petName = petName;
}
// 메소드
public String getPetName() {
return petName;
}
public void setPetName(String petName) {
this.petName = petName;
}
}
먹이를 주는 사람 클래스
public class Person {
private String food;
public void foodFeed(Pet pet, String food) {
System.out.println( pet.getPetName() + "에게 " + food + "주기");
}
public void walk(Walkable pet) {
System.out.println(((Pet) pet).getPetName() + "와 산책");
}
}
인터페이스
public interface Walkable {
}
메인클래스
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("백구");
Cat cat = new Cat("냥냥이");
Snake snake = new Snake("낼름이");
Person person = new Person();
person.foodFeed(dog, "개껌"); // 백구에게 개껌주기
person.foodFeed(cat, "츄르"); // 냥냥이에게 츄르주기
person.foodFeed(snake, "쥐"); // 낼름이에게 쥐주기
person.walk(dog); // 백구와 산책
person.walk(cat); // 냥냥이와 산책
// person.walk(snake); // 실행을 못하게 막고 싶다.
}
}
이렇게 하면 뱀은 산책을 안시킬 수 있다. Snake 클래스가 인터페이스를 구현하고 있지 않기 때문에 코드를 적을때부터 오류가 난다.