Java

인터페이스(interface)

ryeonng 2024. 4. 25. 16:43

인터페이스

  • 모든 메서드가 추상 메서드로 선언됨 ( public abstract )
  • 모든 변수는 상수로 선언됨 ( public static final )

 

 

package basic.ch22;

interface Animal {
	// 추상 메서드만 선언 가능 
	// public abstract void eat();
	// public abstract void move();
	
	// 축약 가능 
	void eat();
	void move();
}

// implements - 구현하다 
class Dog implements Animal {

	@Override
	public void eat() {
		System.out.println("먹이를 먹다");
	}

	@Override
	public void move() {
		System.out.println("촐랑촐랑 다닌다");
	}
	
}

class Bird implements Animal {

	@Override
	public void eat() {
		System.out.println("모이를 먹다");
		
	}

	@Override
	public void move() {
		System.out.println("날아 다니다");
	}
	
}

 

package basic.ch22;

public class AnimalTest {

	public static void main(String[] args) {

		// Animal animal = new Animal(); 인터페이스는 기본으로 new 할수없다.
		Animal dog = new Dog(); // dog 는 animal 로 바라볼수 있다. (다형성적용됨)(업캐스팅된상태)
		Animal bird = new Bird();

		dog.eat();
		dog.move();

		bird.eat();
		bird.move();

	}//

}//

 


 

인터페이스의 특징

  • 추상 메서드 : 인터페이스는 추상 메서드 (구현부가 없는 메서드) 만을 가질 수 있다. JAVA8 부터는 default 메서드와 static 메서드를 가질 수 있게 되었다.
  • 다중 상속 : 클래스는 여러 인터페이스를 구현할 수 있으므로, 다중 상속의 효과를 낼 수 있다.
  • 구현 : 클래스가 인터페이스를 구현할 때는 implements 키워드를 사용한다.
package basic.ch22;

public abstract class HomeAppliances {

	int width; 
	int height; 
	String color;
	
}

 

package basic.ch22;

public interface RemoteController {
	
	// 모든 변수는 --> public static final 
	// 모든 메서드 --> 추상 메서드 public abstract 
	
	public abstract void turnOn(); 
	void turnOff(); // 축약 가능 
	
}

 

package basic.ch22;

public interface SoundEffect {
	
	// public abstract void soundOn();
	void soundOn();
}

 

package basic.ch22;

public class Refrigerator extends HomeAppliances 
						implements RemoteController, SoundEffect {

	
	@Override
	public void turnOn() {
		System.out.println("냉장고를 켭니다.");
	}

	@Override
	public void turnOff() {
		System.out.println("냉장고를 끕니다.");
	}

	@Override
	public void soundOn() {
		System.out.println("띠리링");
	}

	
}

 

package basic.ch22;

public class Televsion extends HomeAppliances implements RemoteController {

	@Override
	public void turnOn() {
		System.out.println("TV를 켭니다");
	}

	@Override
	public void turnOff() {
		System.out.println("TV를 끕니다");
	}

}

 

package basic.ch22;

public class ToyRobot implements RemoteController, SoundEffect  {

	int width; 
	int height; 
	String color;
	
	@Override
	public void turnOn() {
		System.out.println("장남감 로봇을 켭니다.");
	}
	
	@Override
	public void turnOff() {
		System.out.println("장남감 로봇을 끕니다.");
	}
	
	@Override
	public void soundOn() {
		System.out.println("두두둥");
	}

	
}

 


 

인터페이스와 추상클래스를 사용해서 코드 작성해보기

이탤릭 : 추상클래스  점선 : 인터페이스로 구현

 

 

package basic.ch22;

public interface Calc {

	public abstract int add(int n1, int n2);
	public abstract int substract(int n1, int n2);
	public abstract int times(int n1, int n2);
	public abstract double divide(int n1, int n2);
	
}

 

package basic.ch22;

public abstract class Calculator implements Calc {
	
	// 예상 테스트 값 n1 - 10 , n2 - 0 
	@Override
	public double divide(int n1, int n2) {
		if(n1 == 0 || n2 == 0) {
			System.out.println("어떤 수를 0으로 나눌 수 없습니다");
			return 0.0;
		}
		return n1 / n2;
	}
	
}

 

package basic.ch22;

public class CompleteCalc extends Calculator  {

	
	@Override
	public int add(int n1, int n2) {
		return n1 + n2;
	}

	@Override
	public int substract(int n1, int n2) {
		return n1 - n2;
	}

	@Override
	public int times(int n1, int n2) {
		return n1 * n2;
	}
	
	public void showInfo() {
		System.out.println("계산 완료");
	}
	
	// 코드 테스트 메인 함수 
	public static void main(String[] args) {
		Calc calc = new CompleteCalc(); // 업캐스팅된 상태 
		
		System.out.println(calc.add(10, 10));
		System.out.println(calc.divide(10, 0));
		System.out.println("--------------------");
		
		((CompleteCalc)calc).showInfo();
		// 반복문, 제어문 활용한다면 instanceof 연산자를 기억하자
		if( calc instanceof CompleteCalc ) {
			((CompleteCalc) calc).showInfo();
		}
			
	}
	
	
}

 


인터페이스에 대한 고찰

인터페이스를 통한 동물 경주 게임 설계 해보기

여기에 거북이, 토끼 클래스가 존재한다. 
어느 날 둘이 경주 게임에 참가하자고 합의를 하였다.
단, 참가를 하기 위해서는 본인의 이름과 경주 속도를 알려주는 장치를 달아야 한다고 한다.
이 상황을 코드로 작성해보아라.

 

package basic.ch22;

public interface RaceParticipant {
	
	String getName();
	int getSpeed();
}

 

package basic.ch22;

public class Turtle implements RaceParticipant {
	
	private final int speed = 2;

	@Override
	public String getName() {
		return "깡총깡총거북이";
	}

	@Override
	public int getSpeed() {
		return speed;
	} 
	
}

 

package basic.ch22;

public class Rabbit implements RaceParticipant {

	private final int speed = 10;

	@Override
	public String getName() {
		return "엉금엉금토끼";
	}

	@Override
	public int getSpeed() {
		return speed;
	}
}

 

 

연극의 로미오라는 역할, 그리고 배우1과 배우2

더블 캐스팅(Double Casting) : 주연 역할을 두 명의 배우가 번갈아 가며 연기하여, 공연의 분담을 분담하거나 다양한 해석을 관객에게 제공할 수 있다는 장점이 있다.

 

package basic.ch22;

public interface Romeo {
	
	void performAsRomeo();
}

 

package basic.ch22;

public class Actor implements Romeo{

	String name;
	
	public Actor(String name) {
		this.name = name;
	}

	@Override
	public void performAsRomeo() {
		System.out.println(name + " 가 줄리엣 연극을 합니다");
	}
	
}

 

package basic.ch22;

public class Student implements Romeo {

	String name; 
	
	public Student(String name) {
		this.name = name;
	}
	
	@Override
	public void performAsRomeo() {
		System.out.println("학교 축제에서 " + name + " 이 연극을 합니다");
	}
	
	
}

 

package basic.ch22;

public class RomeoTest {

	public static void main(String[] args) {

		Actor actor = new Actor("배우1");
		actor.performAsRomeo();
		
		Student student = new Student ("학생1");
		student.performAsRomeo();
		
	} // end of main

} // end of class

'Java' 카테고리의 다른 글

String, StringBuffer 클래스  (1) 2024.04.29
Object 클래스  (0) 2024.04.29
추상 클래스(abstract class)  (0) 2024.04.25
다형성(Polymorphism)  (1) 2024.04.25
연관, 의존 관계  (0) 2024.04.24