Deperecated/JAVA

JAVA - 인터페이스

누알라리 2020. 1. 9. 18:44

1. C++에서의 인터페이스

- C++에서는 클래스의 메소드 하나를 virtual로 붙여서 선언하고 {} 를 하면 순수 가상함수로 그 메소드가 속한 클래스는 추상 클래스가 된다.

- JAVA의 인터페이스는 C++에서 배운 추상 클래스의 상위개념이라고 볼 수 있다.

 

2. 인터페이스의 역할

- 객체 사용 설명서

- 인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 한다.

            

개발     ----메소드 호출----> 인터   ---메소드 호출---> 객

코드     <--- 리턴값 --------  페이스 <----리턴값------   체

 

- 다형성을 극대화 하기 위해 만들어진 개념.

- 개발 코드에서 직접 메소드 호출하면 되는데, 중간에 인터페이스를 두눈 이유는 개발 코드를 수정하지 않고, 사용하는 객체를 변경할 수 있도록 하기 위해서이다.

- 개발 코드 측면에서는 코드 변경 없이 실행 내용과 리턴값을 다양화할 수 있다는 장점을 갖고 있다.

 

3. 인터페이스 선언

public interface HyunndyInt
{
    // 상수 필드
    public int MAX_AGE = 100;
    
    // 추상 메소드 -> 선언부만 작성
    public void WakeUp();
    
    // 디폴트 메소드
    default void EatSomething() {}
    
    // 정적 메소드
    static void PlayGame() {}
}

- 인터페이스는 상수, 메소드만 구성멤버로 가진다.

- 인터페이스는 객체로 생성할 수 없기 때문에 생성자가 없다.

 

구성 멤버 설명
상수 필드

인터페이스는 객체 사용 설명서로,

런타임 시 데이터를 저장할 수 있는 필드는 만들 수 없다.

대신 고정된 상수 필드는 선언할 수 있다.

추상 메소드

객체가 가지고있는 메소드를 설명한 것.

실제 실행부는 객체가 갖고 있다.

디폴트 메소드

인터페이스에 선언되지만 객체가 가지고있는 인스턴스 메소드. 

인터페이스에 실행부가 있지만, 구현 객체가 있어야 사용 가능하다.

 

기존 인터페이스를 확장해서 새로운 기능을 추가하기 위해 허용됨.

Ex)

디폴트 메소드가 없었을 때 기존 MyInterface1와 이를 구현한 MyClass가 있었다.

시간이 흘러 MyInterface를 업데이트해야할 때, 추상 메소드를 추가하면

MyInterface와 MyClass를 둘 다 업데이트 해야한다. 이는 매우 비효율적이다.

따라서 인터페이스에 실행부가 있고, 구현 클래스를 수정할 필요가 없는 디폴트 메소드가 등장.

정적 메소드

객체가 없어도 인터페이스만으로 호출이 가능하다.

실행부가 있다.

4. 구현 클래스 생성 및 객체 생성

// 인터페이스

package Hyunndy_Toy_Package;

public interface HyunndyInt {

	int MAX_AGE = 20;
	
	void EatSomething();
}
// 구현 클래스

package Hyunndy_Toy_Package;

// 클래스 뒤에 implements [인터페이스이름]을 붙인다.
public class Hyunndy implements HyunndyInt{
	
	public void Run()
	{
		System.out.println("현디");
	}

	// 인터페이스의 추상클래스를 재정의하지 않으면 Hyunndy 클래스는 자동으로 추상 클래스가 된다.
	@Override
	public void EatSomething() {
		// TODO Auto-generated method stub
		System.out.println("김치볶음밥먹는당");
	}
	
	public static void main(String[] args)
	{
    	// ******* //
        인터페이스 구현 객체를 사용하려면
        1. 인터페이스 변수를 선언한다.
        2. 구현 객체를 대입 한다.
        이 방법을 따라야 한다. 
        인터페이스 변수는 "참조타입"이기 때문에 구현 객체가 대입될 경우 구현 객체의 번지를 저장한다.
    	// ******* //
        
        HyunndyInt H1;
		
        H1 = new Hyunndy();
		
        H1.EatSomething();
	}
}

5. 다중 인터페이스 구현 클래스

- 하나의 객체를 여러개의 인터페이스 타입으로 사용할 수 있다.

- 다중 인터페이스를 구현할 경우, 구현 클래스는 모든 인터페이스의 추상 메소드에 대해 실체 메소드를 작성해야 한다.

 

6. 인터페이스의 다형성

상속 인터페이스
같은 종류의 하위 클래스를 만드는 개념 사용 방법이 동일한 클래스를 만드는 개념

- 인터페이스를 이용해 다형성을 쓰면 프로그램 소스 코드는 변함이 없는데, 구현 객체를 교체함으로써 프로그램의 실행 결과가 다양해진다는것이 있다.

 

7. 인터페이스 상속

- 클래스와는 달리 인터페이스는 다중상속이 가능하다.

public interface HyunndyInt extends 상위인터페이스1, 상위인터페이스2 { ... }

하위인터페이스 변수 = new 구현클래스(..);
상위인터페이스1 변수 = new 구현클래스(..);

8. 익명 구현 객체 사용 예시

package Hyunndy_Toy_Package;

public class Hyunndy{
	public static void main(String[] agrs)
	{
		Soundable s = new Soundable()
				{
					public String Sound()
					{
						return "꽥";
					}
				};
		
		System.out.println(s.Sound());
	}
}

'Deperecated > JAVA' 카테고리의 다른 글

JAVA - 예외 처리  (0) 2020.01.10
JAVA - 익명 구현 객체, 람다식  (0) 2020.01.09
JAVA - 어노테이션  (0) 2020.01.09
JAVA 기본서 공부 5 - 클래스  (0) 2020.01.05
JAVA - 열거 타입  (0) 2020.01.04