Java

2024.04.25 인터페이스(interface)

정훈5 2024. 4. 25. 09:09

다형성

데이터 타입을 다양한 형태로 바라볼 수 있는 개념

추상 클래스

추상 메서드가 단 하나라도 있으면 반드시 추상 클래스가 되어야 한다.

 

학습 목표 

1. 인터페이스에 개념을 이해하자. 
2. 인터페이스와 추상클래스를 사용해서 코드 작성해보기

 

인터페이스 개념

모든 메서드가 추상 메서드로 선언됨 public abstract

모든 변수는 상수로 선언됨 public static final

 

package basic.ch22;

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

	// 축약 가능
	void eat();

	void move();

} // end of interface Animal

// implements - 구현하다.
class Dog implements Animal {
	// class 앞에 abstract를 붙이거나 , Animal의 메서드를 @oOverride 하거나

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

	@Override
	public void move() {
		System.out.println("촐랑촐랑 다닌다.");
	}
} // end of Dog class

class Bird implements Animal {
	@Override
	public void eat() {
		System.out.println("모이를 먹다.");
	}
	
	@Override
	public void move() {
		System.out.println("날라 다닌다.");
	}
} // end of Bird class

 

package basic.ch22;

public class AnimalTest {

	public static void main(String[] args) {
		
		// Animal animal = new Animal(); // 인터페이스는 기본적으로 new 할 수 없다.
		Animal dog = new Dog(); // 다형성, 업캐스팅 된 상태
		Animal bird = new Bird();
		
		dog.eat();
		dog.move();
		
		bird.eat();
		bird.move();
	}
}

 

인터페이스의 특징

  • 추상 메서드: 인터페이스는 추상 메서드(구현부가 없는 메서드)만을 가질 수 있습니다.
    자바 8부터는 default 메서드와 staitc 메서드를 가질 수 있게 되었습니다.
  • 다중 상속: 클래스는 여러 인터페이스를 구현할 수 있으므로, 다중 상속의 효과를 낼 수 있습니다.
  • 구현: 클래스가 인터페이스를 구현할 때는 implements 키워드를 사용합니다.

 

package basic.ch22;

public abstract class HomeAppliances {

	int width;
	int height;
	String color;

}

 

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 Refrigerator extends HomeAppliances implements RemoteController, SoundEffect {
	
	// 클래스 뒤에 abstract를 붙이거나 HomeAppliances의 메서드를 @Override 하던가
	
	@Override
	public void turnOn() {
		System.out.println("냉장고를 켭니다.");
	}
	
	@Override
	public void turnOff() {
		System.out.println("냉장고를 끕니다.");
	}
	
	@Override
	public void soundOn() {
		System.out.println("띠리링 ~~~");
	}
	
	@Override
	public void soundOff() {
		System.out.println("띠리링");
	}
}

 

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();
	
	// public abstract void soundOff();
	void soundOff();
}

 

package basic.ch22;

import basic.exercise.toy.ToyMachineTest;

public class ToyRobot implements RemoteController, SoundEffect{
	
	int width;
	int height;
	String color;
	
	// 공통기능 설계
	// turn On
	// turn Off
	
	@Override
	public void turnOn() {
		System.out.println("장난감 로봇을 켭니다.");
	}
	
	@Override
	public void turnOff() {
		System.out.println("장난감 로봇을 끕니다.");
	}
	
	@Override
	public void soundOn() {
		System.out.println("두두르르르 ~~~ 크악~");
	}
	
	@Override
	public void soundOff() {
		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 div(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();
		}
			
	}
	
	
}