[자바] 인터페이스(Interface)

컴공생의 코딩 일기·2021년 8월 3일
0

자바

목록 보기
7/10
post-thumbnail

목차

  • 인터페이스(interface)란?
  • 인터페이스(interface) 특징
  • 인터페이스(interface) 사용 방법
  • 인터페이스(interface) 상속

인터페이스(interface)란?

인터페이스(interface)란 동일한 목적에 기능을 가진 클래스들이 사용할 수 있게 정의만 해 놓은 것을 인터페이스(interface)라고 합니다.
추상 클래스는 속성을 묶어놓은 것이라면 인터페이스는 기능을 묶어놓은 것입니다. 예를 들어 '날다' 라는 기능이 있다고 가정해 봅시다. 새는 날 수 있습니다. 하지만 사람이 날다? 과연 맞는 말일까요? 만약 추상 메서드라면 당연히 속성에 어긋나는 일입니다. 하지만 인터페이스는 '날다' 라는 기능을 정의만 해주지 이 기능을 어떻게 사용하든 상관없습니다. 즉 사람이 날개라는 기계를 만들어 날든 발에 아이어 맨처럼 부스터를 사용해서 날든 그건 인터페이스를 상속받은 클래스 마음대로입니다. 인터페이스는 이렇게 이해하시면 좋을 거 같습니다.


인터페이스(interface) 특징

  1. 인터페이스는 인터페이스입니다. 클래스가 아닙니다.
  2. 추상 클래스에는 일반 변수나 일반 메서드도 정의할 수 있는 반면, 인터페이스는 오직 상수나 추상 메서드만 정의할 수 있습니다.
  3. 인터페이스 안에 추상 메서드를 정의할 때는 abstract 예약어를 생략할 수 있습니다. (인터페이스 안에 정의된 모든 메서드는 추상 메서드이기 때문에 자동으로 public abstract가 지정됩니다.)
  4. 인터페이스 안에 상수를 정의할 때도 자동으로 public static final이 지정되므로 public static final 예약어를 생략할 수 있습니다.
  5. 인터페이스(interface)는 다중 상속이 가능합니다. (부모가 여러 명 가능)

상수: 상수는 간단하게 말해서 변하지 않는 값이라고 생각하시면 됩니다. 즉 한번 메모리에 올라오면 값은 변할 수 없습니다. 상수는 반드시 값을 초기화해줘야 합니다.


인터페이스(interface) 사용 방법

interface 인터페이스명
{
     상수 정의
     추상 메서드 정의
}

예제)

interface Interface {

	int value = 10; // public static final 자동 지정, 상수이기 때문에 초기화를 해줘야 합니다.

	void interfaceMethod(); // public abstract 자동 지정
}

class InterfaceImpl implements Interface {

	public void interfaceMethod() {
		System.out.println("인터페이스 구현");
	}

}

public class InterfaceTest01 {

	public static void main(String[] args) {

		InterfaceImpl inl = new InterfaceImpl();

		inl.interfaceMethod();
	}

}

출력 결과:
인터페이스 구현

특정 인터페이스를 구현할 때는 implements 예약어를 사용합니다.
또한 인터페이스에 정의된 메서드는 무조건 public static abstract로 인식되기 때문에 인터페이스에 정의된 메서드를 구현 클래스에서 정의해 줄 때는 접근 제한자를 반드시 public으로 지정해야 합니다.

인터페이스(interface) 상속

인터페이스는 다중 상속이 가능합니다. 인터페이스 상속은 보통 클래스에 분산해서 상속하는 게 아니라 하나에 인터페이스에 모아서 상속하는 방법을 많이 사용합니다. 이해 안 되시죠? 예제 보면 바로 이해하실 겁니다!

예제)


interface Move {

	void move(int xPos, int yPos);
}

interface Shoot {
	void attak(String target);
}

//인터페이스는 다중 상속 가능
interface Fight extends Move, Shoot {

}

//추상화는 구현돼도 가능 안돼도 가능 그렇기 때문에 인터페이스를 추상화에서 구현 안해도 된다.
abstract class GroundUnit implements Fight {

	private String unitName;
	private int hp;
	private int xPos;
	private int yPos;
	private String weapone;

	public String getUnitName() {
		return unitName;
	}

	public void setUnitName(String unitName) {
		this.unitName = unitName;
	}

	public int getHp() {
		return hp;
	}

	public void setHp(int hp) {
		this.hp = hp;
	}

	public int getxPos() {
		return xPos;
	}

	public void setxPos(int xPos) {
		this.xPos = xPos;
	}

	public int getyPos() {
		return yPos;
	}

	public void setyPos(int yPos) {
		this.yPos = yPos;
	}

	public String getWeapone() {
		return weapone;
	}

	public void setWeapone(String weapone) {
		this.weapone = weapone;
	}

}

class Marine extends GroundUnit {

	public Marine(String unitName, int hp, int xPos, int yPos) {
		this.setUnitName(unitName);
		this.setHp(hp);
		this.setxPos(xPos);
		this.setyPos(yPos);
		this.setWeapone("광선검");
	}

	@Override
	public void move(int xPos, int yPos) {

		System.out.println(this.getxPos() + "," + this.getyPos() + "에서" + xPos + "," + yPos + "으로 이동합니다.");

		// 이동한 위치를 저장
		this.setxPos(xPos);
		this.setyPos(yPos);

	}

	@Override
	public void attak(String target) {

		System.out.println(this.getUnitName() + "이 " + this.getWeapone() + "으로 " + target + "을 공격합니다.");

	}

}

public class InterfaceTest01 {

	public static void main(String[] args) {
		Marine m = new Marine("마린 1", 100, 0, 0);

		m.move(100, 0);
		m.attak("질럿");

	}

}

위에 코드를 보시면 Move와 Shoot 인터페이스 두 개가 정의되어 있습니다. 이 두 인터페이스를 Fight라는 인터페이스에 상속을 합니다. 즉 이게 인터페이스에 다중 상속 기능입니다. 또한 제가 말한 여러 개의 인터페이스를 하나의 인터페이스에 묶어 놓은 형태입니다. 그리고 GroundUnit 추상 클래스와 인터페이스 간의 상속도 가능합니다. 그리고 마지막으로 추상 클래스와 일반 클래스 간의 상속도 가능합니다. 결국 클래스 -> 추상 클래스 -> 인터페이스 모두 상속이 가능합니다.

이상으로 인터페이스(interface)에 대해 알아봤습니다. 잘못된 부분이나 부족한 부분 있으면 피드백 감사하겠습니다!!!

profile
더 좋은 개발자가 되기위한 과정

0개의 댓글