개발자 미니민의 개발스터디

[JAVA] 자바 - 인터페이스 (interface) 정의 (1)

by mini_min

[JAVA]
자바 - 인터페이스 (interface) 

 

✔️ 인터페이스란?

클래스를 위한 템플릿으로 기능을 수행하는 추상 클래스의 한 종류다. 인터페이스는 interface 키워드 사용한다.

선언만 있고 정의는 없는 것이 특징이다. 인터페이스 내의 필드는 상수 선언만 가능하다. (상수: 한 번 정해지면 절대 변하지 않는 값) 

❌ 필드값 절대 변경불가(final)

 

🏷️ 인터페이스 특징

- 인터페이스 필드는public static final 만 가능하다! public static final 을 생략해도 알아서 public static final 로 취급한다.

- 인터페이스의 메소드는 public abstract 만 가능하다! 마찬가지로 생략해도 알아서 public abstract 취급한다.

- 클래스 간의 결합도를 낮출 수 있다.

- 표준화가 가능하다.

- 개발 시간을 단축할 수 있다.

 

 

 

✔️ 인터페이스 구현하기

인터페이스를 구현한 클래스가 추상 클래스가 아닌 경우인터페이스의 모든 메소드를 정의해야한다. 인터페이스를 구현한 클래스와 구현 클래스는 상하 관계이다. 

⭕ 반대로 인터페이스 구현한 클래스가 추상 클래스이면 모든 메소드를 정의할 필요가 없다!

 

// 인터페이스 작성
interface Demo1 {
	// 인터페이스 필드는 public static final 만 가능
	public static final int A = 10;
	int B = 20; // 필드는 public static final 을 붙이지 않아도 public static final
				
	// 인터페이스 메소드는 public abstract 만 가능
	public abstract void disp();
	void print(); // public abstract 안붙여도 public abstract
	
	// public void write() { } // 컴오류. 메소드를 구현하면 오류 발생

}


// 인터페이스 구현
// 인터페이스 구현한 클래스에서는 추상클래스가 아닌 경우 인터페이스의 모든 메소드를 정의해야 한다.
// 인터페이스를 구현한 경우 인터페이스와 구현 클래스는 상하관계이다. 
class Test1 implements Demo1 {		//2개의 추상 메소드를 구현 안하면 오류가 발생

	@Override
	public void disp() {
		System.out.println("disp - 인터페이스 메소드 재정의");
	}

	@Override
	public void print() {
		System.out.println("print - 인터페이스 메소드 재정의");
	}
	
	public void sub() {
		System.out.println("클래스에 정의된 메소드");
	}
	
}

 

💡 인터페이스 메소드를 재정의한 것 뿐만 아니라 구현한 클래스(하위클래스) 자신만의 메소드도 존재할 수 있다.

 

//Demo1 dd = new Demo1(); // 컴파일 오류
	//인터페이스는 추상클래스의 일종으로 객체 생성이 불가능

Demo1 obj = new Test1();	//up-casting Demo가 아버지꼴
	// 인터페이스는 구현클래스의 상위클래스와 유사하다.

// obj.sub(); // 컴오류. Demo1 에 sub() 메소드가 없으므로
	((Test1)obj).sub(); //다운 캐스팅하면 Test 메소드로 사용이 가능

 

💡 인터페이스는 객체 생성이 불가하다! 꼭 하위클래스를 통해 구현해야하며, 구현 클래스의 상위클래스와 유사하다. (up-casting)

Demo1 obj = new Test1();
sub() 메소드를 호출하고 싶어도 up-casting 한 상태에서 Demo1에 없는 sub() 메소드를 호출할 수 없다. 이럴 땐 다운 캐스팅해서 Test1 에 있는 sbu() 메소드를 호출할 수 있다.

 

 

 

✔️ 2개 이상의 인터페이스 구현

클래스는 2개 이상의 인터페이스를 받아서 구현할 수 있다!

ex) class DemoImpl2 implements Ademo2, Bdemo2 {}

 

- 당연하게도 2개 이상의 인터페이스를 구현한 클래스의 객체를 생성하면, 재정의된 메소드를 호출한다. 

 

interface Ademo2 {
	public void disp();
}

interface Bdemo2 {
	public void write();
}


// 클래스는 2개 이상의 인터페이스를 구현할 수 있다.
// 다중상속이 되지 않는 것을 보완.

class DemoImpl2 implements Ademo2, Bdemo2 {

	@Override
	public void write() {
		System.out.println("Bdemo2 메소드 구현");
		
	}

	@Override
	public void disp() {
		System.out.println("Ademo2 메소드 구현");
		
	}
	
	public void sub() {
		System.out.println("클래스에 정의된 메소드");
	}
}

 

 

 

✔️ up-casting !

인터페이스를 구현한 클래스 -> 인터페이스로 up-casting 도 가능하다.

아래와 같이 up-casting 해서 인터페이스A 의 메소드를 호출할 경우, 재정의된 메소드가 호출된다. (이미 인터페이스를 구현한 클래스가 객체 생성되며 메소드가 정의됐기 때문에)

 

다만, up-casting 하는 경우, 인터페이스를 구현한 하위 클래스의 메소드는 호출할 수 없다. 호출하기 위해서는 다시 down-casting 하여 원래대로 돌려야한다.

 

DemoImpl2 ob = new DemoImpl2();
		ob.disp();
		ob.write();
		ob.sub();
		
		Ademo2 ob2 = new DemoImpl2();	//업캐스팅
		Bdemo2 ob3 = new DemoImpl2();	//업캐스팅
		
		ob2.disp();
		// ob2.sub(); //컴오류. 다운캐스팅 해야함
		
		((DemoImpl2)ob2).sub();
		
		// ob3.disp(); // 데모 B 에는 디스플레이가 없어서 사용 못한다.
		
		((Ademo2)ob3).disp();	//Ademo2 와 Bdemo2 모두 구현되어 있기 때문에 가능은 하다. 
		
	}

 

💡 2개 이상의 인터페이스를 구현한 클래스도 당연히. 자기 자신의 메소드를 가질 수 있다. 하지만, up-casting 했을 때 구현한 클래스의 메소드는 사용할 수 없으니, down-casting이 필요하다.

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기