/ JAVA

객체지향 프로그래밍 복습 (7) Interface

[JAVA] 객체지향 프로그래밍 복습 (7) Interface

자바

자바(Java)는 C언어에 객체 지향적 기능을 추가하여 만든 C++과는 달리, 처음부터 객체 지향 언어로 개발된 프로그래밍 언어입니다. 자바는 자바 가상 머신(JVM, Java Virtual Machine)을 사용하여, 운영체제와는 독립적으로 동작할 수 있습니다. 따라서 자바는 어느 운영체제에서나 같은 형태로 실행될 수 있습니다. 바로 이러한 점이 수많은 개발자로 하여금 자바를 사용하게 하는 원동력이 되고 있습니다. 현재 자바는 전 세계에서 가장 많이 사용하는 프로그래밍 언어 중 하나입니다.

인터페이스 Interface

자식 클래스가 여러 부모 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다는 장점을 가지게 될 것입니다. 하지만 클래스를 이용하여 다중 상속을 할 경우 메소드 출처의 모호성 등 여러 가지 문제가 발생할 수 있어 자바에서는 클래스를 통한 다중 상속은 지원하지 않습니다. 하지만 다중 상속의 이점을 버릴 수는 없기에 자바에서는 인터페이스라는 것을 통해 다중 상속을 지원하고 있습니다. 인터페이스(interface)란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미합니다. 자바에서 추상 클래스는 추상 메소드뿐만 아니라 생성자, 필드, 일반 메소드도 포함할 수 있습니다. 하지만 인터페이스(interface)는 오로지 추상 메소드와 상수만을 포함할 수 있습니다.

iSensor 인터페이스

다음과 같은 구조의 인터페이스와 클래스에서 iProximitySensor를 구현합니다.

  • iProximitySensor 인터페이스
    • boolean 형의 start, stop 함수
    • 센서 종류 반환 함수
    • 센서 정보 출력 함수
    • 레이저 거리 반환 함수

레이저 종류 별로 각각 다른 발사거리를 갖습니다.

  • Laser 클래스
  • Inductive 클래스(전기 유도)
  • InfraredRat 클래스(적외선)

iProximitySensor.java

public interface iProximitySensor {
	public boolean start();
	public boolean stop();
	public String getSensorType();
	public void printInfo();
	public float getDistance();
}

Laser.java

import java.util.Random;

public class Laser implements iProximitySensor{
	public Laser() {
		System.out.println("A laser sensor is created");
	}
	
	public boolean start() {
		return true;
	}
	
	public boolean stop() {
		return true;
	}
	
	public String getSensorType() {
		return "Laser Sensor";
	}
	
	public void printInfo() {
		System.out.println("Laser Proximity Sensor");
	}
	
	public float getDistance() {
		Random random = new Random();
		return random.nextInt(699) + 2;
	}
}

Inductive. java

import java.util.Random;

public class Inductive implements iProximitySensor{
	public Inductive() {
		System.out.println("A inductive sensor is created");
	}
	
	public boolean start() {
		return true;
	}
	
	public boolean stop() {
		return true;
	}
	
	public String getSensorType() {
		return "Inductive Sensor";
	}
	
	public void printInfo() {
		System.out.println("Inductive Proximity Sensor");
	}
	
	public float getDistance() {
		Random random = new Random();
		return random.nextInt(6);
	}
}

InfraredRay.java

import java.util.Random;

public class InfraredRay implements iProximitySensor{
	public InfraredRay() {
		System.out.println("A ray sensor is created");
	}
	
	public boolean start() {
		return true;
	}
	
	public boolean stop() {
		return true;
	}
	
	public String getSensorType() {
		return "Ray Sensor";
	}
	
	public void printInfo() {
		System.out.println("Ray Proximity Sensor");
	}
	
	public float getDistance() {
		Random random = new Random();
		return random.nextInt(11);
	}
}

RangeFinder.java

public class RangeFinder {
	public RangeFinder(iProximitySensor a) {
		System.out.println("A range sensor is created, and its sensor type is " + a.getSensorType());
	}
	
	public void printInfo(iProximitySensor a) {
		System.out.print("This is range finder, using ");
		a.printInfo();
	}
	
	public float getDistance(iProximitySensor a) {
		return a.getDistance();
	}
	
	public static void main(String[] args) {
		Laser laser = new Laser();
		Inductive inductive = new Inductive();
		InfraredRay ray = new InfraredRay();
		
		System.out.println("\n");
		RangeFinder rg1 = new RangeFinder(laser);
		RangeFinder rg2 = new RangeFinder(inductive);
		RangeFinder rg3 = new RangeFinder(ray);
		
		System.out.println("\n");
		rg1.printInfo(laser);
		System.out.println(rg1.getDistance(laser) + "m");
		
		rg2.printInfo(inductive);
		System.out.println(rg2.getDistance(inductive) + "m");
		
		rg3.printInfo(ray);
		System.out.println(rg3.getDistance(ray) + "m");
	}

}

결과