JAVA 웹 개발 패키지 - 패스트캠퍼스/Chapter3

인터페이스 - 메서드, 구현, 상속

giggs 2022. 1. 4. 21:03

 

 

상수 / 추상 메서드 별도 선언 없어도 상수 / 추상 메서드로 선언됨
디폴트 메서드 / 정적 메서드 / defalut 메서드 / static 메서드
private 메서드 private / private static 메서드

 

 


 

상수

  • 모든 변수는 상수로 변환됨 public static final 별도의 선언 없어도 자동으로
double PI = 3.14;
int ERROR = -999999999;
	

 

추상 메서드

  • 모든 선언된 메서드는 추상 메서드 public abstract 별도의 선언 없어도 자동으로

 


 

디폴트 메서드 (자바 8 이후)

  • 구현을 가지는 메서드, 인터페이스를 구현하는 클래스들에서 공통으로 사용할 수 있는 기본 메서드
  • default 키워드 사용
  • 클래스가 implements 했을 때 사용할 수 있다.
default void description() {
	System.out.println("정수 계산기를 구현합니다.");
	myMethod();
}
  • 구현하는 (implements 하는) 클래스에서 재정의 할 수 있음
@Override
public void description() {
	System.out.println("CompleteCalc에서 재정의한 default 메서드");
	//super.description();
}
  • 인터페이스를 구현한 클래스의 인스턴스가 생성되어야 사용 가능함 ( 정적 메서드와의 차이점 )

 


 

정적 메서드 (자바 8 이후)

  • 인스턴스 생성과 상관없이 인터페이스 타입으로 사용할 수 있는 메서드
  • static 키워드 사용
  • interface 타입으로 직접 호출해서 사용 가능/ 인스턴스 생성 여부와 상관없음
static int total(int[] arr) {
	int total = 0;
		
	for(int i: arr) {
		total += i;
	}
	mystaticMethod();
	return total;
}

 

 

interface에 default 메서드와 static 메서드 구현

 

 

 


 

private 메서드 (자바 9 이후)

  • 인터페이스를 구현한 클래스에서 사용하거나 재정의 할 수 없음
  • 인터페이스 내부에서만 사용하기 위해 구현하는 메서드
  • default 메서드나 static 메서드에서 사용함
private void myMethod() {
	System.out.println("private method");
}
	
private static void mystaticMethod() {
	System.out.println("private static method");
}

 

interface에 static 메서드 구현

 

 

 

 


 

 

 

java - 다중 상속 안 되는 이유 - 다이아몬드 프로블럼

 

여러 인터페이스 구현

  • 자바의 인터페이스는 구현 코드가 없으므로 하나의 클래스가 여러 인터페이스는 구현할 수 있음
  • 디폴트 메서드가 중복되는 경우는 구현하는 클래스에서 재정의 하여야 함
  • 여러 인터페이스를 구현한 클래스는 / 인터페이스 타입으로 형 변환되는 경우 / 해당 인터페이스에 선언된 메서드만 사용 가능함

 

 

buy와 sell 인터페이스 생성

 

 

여러 개의 인터페이스를 구현할 수 있다.

default 메서드가 중복될 경우 재정의 필요. 여기서는 order 메서드 중복

buy를 가져다가 그대로 쓸 수도 있고, sell을 가져다가 그대로 쓸 수도 있고, 새롭게 재정의도 가능하다.

 


 

buy와 sell 인터페이스를 구현한 Customer class 

 

중복되는 디폴트 메서드 재정의 필요하다

 

 

테스트 클래스 ---

 

여러 개의 인터페이스로 구현한 Customer 클래스 - 인터페이스에서

buy / sell / order / hello 메서드 잘 적용되어 출력되는 것을 확인 

 

order 메서드에서 인터페이스에 구현된 sellorder 나 buyorder 가아닌

Customer 인터페이스에서 재정의한 customer order로 출력됨을 확인 

 

추가해준 hello 메서드도 잘 출력됨을 확인 

 

GOOD :)

 


 

인터페이스 타입 사용하는 법과 주의사항

 

여러 인터페이스를 구현한 클래스는 / 인터페이스 타입으로 형 변환되는 경우 /

해당 인터페이스에 선언된 메서드만 사용 가능함

 

어떤 인터페이스를 제공해주느냐에 따라 사용자 클라이언트 쪽에서 사용할 수 있는 기능 제한할 수 있다.


 

인터페이스의 상속

  • 인터페이스 사이에도 상속을 사용할 수 있음
  • extends 키워드를 사용
  • 인터페이스는 다중 상속이 가능하고 구현 코드의 상속이 아니므로 타입 상속이라고 함

 

 

X.java - 

public interface X {

	void x();
}

Y.java

public interface Y {

	void y();
}

 

 

MyInterface.java

인터페이스 X, Y 있을 때 둘 다 상속을 받는다 extends 키워드

- 의미 - MyInterface 여기에서 X, Y 메서드들을 다 선언하겠다는 의미 

- extends 키워드를 썼지만 뒤에 여러 개가 오면 인터페이스 간의 상속이구나 이해

public interface MyInterface extends X, Y{

	void myMethod();
}

MyClass.java

- MyInterface implements 한 클래스는 X, Y, myMethod 3가지 메서드 모두 구현해야 된다.

public class MyClass implements MyInterface{

	@Override
	public void x() {
		System.out.println("x()");
	}

	@Override
	public void y() {
		System.out.println("y()");		
	}

	@Override
	public void myMethod() {
		System.out.println("myMethod()");		
	}
}

MyClassTest.java

- X로 선언되면 X 메서드만, Y로 선언되면 Y 메서드만 

- 모든 메서드 사용하려면 MyClass타입형으로 선언

어떤 인터페이스 타입으로 선언했느냐에 따라 사용할 수 있는 메서드 달라짐

public class MyClassTest {

	public static void main(String[] args) {

		MyClass mClass = new MyClass();
		
		X xClass = mClass;
		xClass.x();
		
		
		Y yClass = mClass;
		yClass.y();
		
		MyClass iClass = mClass;
		iClass.x();
		iClass.y();
		iClass.myMethod();
	}

}

 


 

 

 

review


인터페이스의 구현 메서드
디폴트 / 정적 / private
default / static / private

하나의 클래스가 여러 인터페이스를 구현할 수 있다.
인터페이스 디폴트 메서드 중복 시 재정의 필요
어떤 인터페이스 형을 주느냐에 따라 클라이언트가 사용할 수 있는 기능들을 제한할 수 있다.
인터페이스 사이에도 상속을 할 수 있다. extends

전 시간에 인터페이스는 구현 메서드도 구현 코드도 없다고 배웠는데...
구현할 수 있는 것이 나왔다 ㅎㅎ
하긴 인터페이스에 메서드 구현해놓지 못한다면
구현하는 클래스마다 똑같은 메서드를 넣어줘야 할 때
작업이 복잡하고 힘들 거 같다.
후후. 인터페이스가 복잡해지면 클라이언트가 사용하기 힘들어지는 부분은 있는 건가?
사용방법이 너무 복잡해지지 않게 만드는 것도 중요할 거 같다.