관리 메뉴

나만을 위한 블로그

[JAVA] 인터페이스란? 본문

JAVA

[JAVA] 인터페이스란?

참깨빵위에참깨빵 2019. 11. 25. 00:27
728x90
반응형

20.10.06 - 코드블럭에 코드 삽입

 

인터페이스 사전적 정의 : 접속기, 접점(두 가지 주제시스템 등이 서로 만나서 영향을 주고받는 영역)

지식백과 : 사물과 사물 사이 또는 사물과 인간 사이의 경계에서 상호 간의 의사소통을 위해 만들어진 물리적 매개체나 프로토콜

 

자바의 인터페이스 : 구현된 것은 없는 밑그림만 가진 기본 설계도, 일반 메서드나 멤버 변수를 가질 수 없고 오직 추상 메서드와 상수만을 멤버로 가질 수 있다. 추상 클래스보다 추상화 수준이 더 높다.

기능에 대해 선언만 한 상태, 모든 기능을 추상화로 정의한 상태. 즉, 모든 메서드의 선언만 정의하고 그 기능에 대해 주석만 써둔 상태, 추상 클래스처럼 구현되지 않은 멤버를 포함하므로 객체화를 시킬 수 없고, 인터페이스를 상속받은 클래스에서 멤버를 구현한 뒤 자식 클래스를 객체화해 사용한다.

 

인터페이스를 쓰는 이유 : 코드의 가독성 때문 - 추상 클래스는 필드를 가질 수 있어 코드를 볼 때 봐야 할 것이 여러가지지만, 인터페이스는 어떤 기능을 하는지 간략하게 볼 수 있기 때문.

완벽한 추상화를 달성하기 위함, 다중상속 기능 지원 가능, 약한 결합 이룰 수 있게 함, 다형성 사용 가능

 

정리 : 인터페이스는 추상화 정도가 추상 클래스보다 높은 개념으로, 몸통이 있는 일반 메서드나 멤버변수를 가질 수 없다. 오직 추상 메서드와 상수만을 멤버로 가질 수 있다.

 

- 인터페이스 작성 방법

 

예약어로 interface를 사용하며 접근 제어자로 public or default를 사용한다. 나는 public을 주로 사용한다.

모든 멤버 변수는 public static final이어야 하며 이를 생략할 수 있다.

모든 메서드는 public abstract여야 하며 이를 생략할 수 있다.

코드로 쓰면 이런 느낌일 것 같다.

 

public interface 인터페이스명 {

    public static final 자료형 SANGSU = 값;

    public abstract 메서드명(매개변수목록);

}

 

클래스 만드는 거랑 별 다를 게 없다. 내용물만 좀 다를 뿐.

 

- 인터페이스 사용법

 

1. 클래스는 클래스를 extends해서 사용하지만, 클래스는 인터페이스를 implements(뜻 : 구현)해서 사용한다.

2. 인터페이스는 인터페이스로부터만 상속받을 수 있다. 클래스와 달리 여러 인터페이스로부터 상속받는 다중 상속이 가능하다.(A extends B, C {})

 

※ 구현하는 인터페이스의 메서드 중 일부만 구현한다면 abstract를 붙여서 추상 클래스로 선언해야 한다.

 

abstract class Human implements Coding {

    public void moving(int x, int y) { 내용 }

}

 

인터페이스 이름 중에는 주로 '~able'이 붙는 경우가 많은데, 이유는 어떤 기능 or 행위를 하는데 필요한 메서드를 제공한다는 의미를 강조하기 위해서다. 그렇다고 모든 인터페이스 이름이 ~able로 끝나야 하는 건 아니다.

 

 

- 인터페이스 예제

 

interface Animal
{
	// cry()라는 메서드명만 정의해놓은 Animal 인터페이스를 만든다
	public abstract void cry();
}

// Cat 클래스에서 Animal 인터페이스를 implements해서 cry()를 쓸 수 있도록 한다
class Cat implements Animal
{

	@Override
	public void cry()
	{
		// cry()가 수행할 작업 내용을 작성한다. Cat 클래스의  cry()는 냐옹냐옹이라는 문장을 print한다.
		System.out.println("냐옹냐옹!");
	}
	
}

//마찬가지로 Dog 클래스에도 Animal 인터페이스를 implements한다
class Dog implements Animal
{

	@Override
	public void cry()
	{
		// Dog 클래스의 cry()는 멍멍이라는 문장을 출력하도록 한다
		System.out.println("멍멍!");
	}
	
}

public class Polymorphism03 {
	
	public static void main(String[] args) {
		
		// Cat, Dog 클래스의 객체를 각각 생성 후
		Cat cat = new Cat();
		Dog dog = new Dog();
		
		// 각 객체를 참조해 클래스 별 cry()를 호출한다
		cat.cry();
		dog.cry();
		
	}

}

 

위 예제의 실행 결과는

 

이라는 결과가 나온다. cat이 dog보다 위에 있기 때문에 냐옹냐옹이 먼저 나오고 그 밑에 멍멍이 나오며, Cat 클래스와 Dog 클래스에 있는 cry()의 작업 내용이 다르기 때문에 각각 다른 결과값이 나오는 걸 볼 수 있다.

실제로 사용할 때는 다른 내용이나 좀 더 복잡한 메서드 내용을 써서 사용하면 될 것 같다.

반응형
Comments