16. 인터페이스(Interface) [ JAVA ]

duck-ach·2022년 8월 3일
1

JAVA

목록 보기
16/27

인터페이스(Interface)

인터페이스란 클래스가 구현해야 할 메소드를 선언해 둔 자바 파일이다.

  • 특징
    • 작업지시서 역할을 수행한다.
    • 극단적으로 동일한 목적 하에 동일한 기능을 수행하게끔 강제한다.
    • 인터페이스 구현을 할때는 상속을 할때 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 클래스가 인터페이스를 구현하고 있지 않기 때문에 코드를 적을때부터 오류가 난다.

profile
자몽 허니 블랙티와 아메리카노 사이 그 어딘가

0개의 댓글