tuter77

2023.01.13 본문

TIL

2023.01.13

tuter77 2023. 1. 13. 22:23

<목차>

  1. <공부계획표>
  2. Java
  3. Group Study

<공부계획표>

13:00 ~ 14:00 그룹스터디            

14:00 ~ 18:00 (3시간) 온라인강의 시청.

           14:00 ~ 15:00 java 강의 시청

           15:00 ~ 16:00 java 강의 시청

           17:00 ~ 18:00 java 강의 시청

18:00 ~ 19:00 식사시간

19:00 ~ 22:00 실시간 강의

           19:00 ~ 20:00 java 강의 시청

           20:00 ~ 21:00 java 강의 시청

           21:00 ~ 22:00 java 강의 시청

22:00 ~ 23:00 블로그 작성 및 프로그래머스 문제 풀기.


<Java>

● 인터페이스의 여러 요소

▷상수

- 모든 변수는 인터페이스에서 상수로 변환 된다.(public static final)

 

▷추상 메서드

- 모든 선언된 메서드는 추상 메서드가 된다.(public abstract)

 

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

- 구현을 가진느 메서드, 인터페이스를 구현하는 클래스들에서 공통으로 사용할 수 있는 기본 메서드이다.

- default 키워드를 사용한다.

- 구현하는 클래스에서 재정의할 수 있다.

- 인터페이스를 구현한 클래스의 인스턴스가 생성되어야 사용가능하다.

 

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

- 인스턴스 생성과 상관 없이 인터페이스 타입으로 사용할 수 있는 메서드이다.

 

▷ private 메서드(자바 9이후)

- 인터페이스를 구현한 클래스에서 사용하거나 재정의할 수 없다.

- 인터페이스 내부에서만 사용하기 위해 구현하는 메서드이다.

- default 메서드나 static 메서드에서 사용가능하다.

 

예시)

 

package ch14;

public interface Calc {

	double Pi = 3.14;
	int ERROR = -99999999;
	
	int add(int num1, int num2);
	int substarct(int num1, int num2);
	int times(int num1, int num2);
	int divide(int num1, int num2);
	
	//default 메서드 구현.
	default void description() {
		System.out.println("점수의 사칙연산을 제공합니다.");
	}
	
	//static 메서드 구현.
	static int total(int[] arr) {
		int total = 0;
		for(int num : arr) {
			total += num;
		}
		return total;
	}
}

저번 강의때 만들었던 인터페이스를 활용하여 디폴트 메서드와 정적 메서드를 구현했다.

 

 

package ch14;

public class Calctest {

	public static void main(String[] args) {

		int num1 = 10;
		int num2 = 2;
		
		//인터페이스 타입 상속.
		Calc calc1 = new CompleteCalc();
		
		System.out.println(calc1.add(num1, num2));
		System.out.println(calc1.substarct(num1, num2));
		System.out.println(calc1.times(num1, num2));
		System.out.println(calc1.divide(num1, num2));
		
		CompleteCalc calc2 = new CompleteCalc();
		calc2.showInfo(); //타입이 CompleteCalc여야만 쓸 수 있는 메서드.
		
		//생성된 인스턴스로 default 메서드 실행.
		calc1.description();
		
		//생성자 없이 인터페이스로 호출해서 정적메서드 실행
		int[] arr = {1,2,3,4,5};
		System.out.println(Calc.total(arr));
	}

인터페이스를 implement하는 클래스와 그 클래스를 상속하는 클래스도 가져와서 테스트 클래스에서 디폴트 메서드와 정적 메서드를 실행해본다.

 

앞에서 공부한 바와 같이 디폴트메서드는 생성자를 통한 인스턴스가 있어야만 메서드를 실행할 수 있었고, 정적메서드는 인스턴스없이 인터페이스로 호출해서 사용할 수 있는 것을 볼 수 있다.

 

이처럼 정적메서드는 재정의해서 사용할 수 도 있다.

 

마지막으로 private 메서드는 인터페이스 내에서만 사용하는 메서드로 위 처럼 선언하여 디폴트 또는 스태틱메서드에서 사용할 수 있다.

이 메서드는 임플리먼트한 클래스에서 오버라이드할 수 없다.

 

●  인터페이스 상속

▷  여러 인터페이스 구현

- 자바의 인터페이스는 구현코드가 없으므로 하나의 클래스가 여러 인터페이스를 구현할 수 있다.

- 디폴트 메서드가 중복 되는 경우는 구현하는 클래스에서 재정의 해야한다.

- 여러 인터페이스를 구현한 클래스는 인터페이스 타입으로 형 변환 되는 경우 해당 인터페이스에 선언된 메서드만 사용이 가능하다.

 

- 다이아몬드 Problem. 

하나의 클래스(GrandFaher)를 두개의 클래스(Father1, Faher2)가 상속하고 두 개의 클래스를 하나의 자식 클래스(Child)가 상속하게 된다.

여기서 GF클래스의 a(); 라는 메서드가 각각 F1,F2에서 오버라이딩 된다면, Child 클래스의 인스턴스 c가 a(); 메서드를 가져오면 어떤 메서드가 호출이 되는가라는 문제다.

 

java에서는 이러한 문제를 해결하기위해 다중상속은 할 수 없고 단일 상속만 가능하게 해놓았다.

다중 상속의 장점은 하나의 클래스(위의 예시에선 Child)가 풍부한 기능을 갖게 되는 것이고, 단점은 모호성이다.

자바는 모호성을 없애서 안전한 방향으로 언어를 구성하고 있다고 한다.

 

예시) Customer클래스가 Buy와 Sell 두개의 인터페이스를 임플리먼트하는 상황.

 

Buy 인터페이스

package ch15;

public interface Buy {

	void buy();

	default void order() {
		System.out.println("buy order");
	}
	
}

 

Sell 인터페이스

package ch15;

public interface Sell {

	void sell();

	default void order() {
		System.out.println("sell order");
	}
}

 

이를 임플리먼트하는 customer 클래스

 

package ch15;

public class Customer implements Buy, Sell{

	@Override
	public void sell() {

		System.out.println("customer sell");
	}

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

	//buy도 sell도 아닌 customer 메서드로 재정의함
	@Override
	public void order() {
		System.out.println("customer order");	
	}
	
	public void hello() {
		System.out.println("hello");	
	}
	
	
}

 

아래는 테스트 클래스이다.

 

public class CustomerTest {

	public static void main(String[] args) {
		
		Customer customer = new Customer();
		customer.buy();
		customer.sell();
		customer.order();
		customer.hello();
		
		Buy buyer = customer;
		buyer.buy();
		buyer.order();
		
		Sell seller = customer;
		seller.sell();
		seller.order();
	}
}

 

결과물을 보면 오버라이드 된 메서드와 customer 고유의 메서드 모두 구현되는 걸 알 수 있고, 아래 인터페이스 타입으로 업캐스팅해도 각 메서드는 Customer에서 재정의된 메서드로 구현되는 것을 볼 수 있다.

 

 

▷ 인터페이스 상속

- 인터페이스 사이에도 상속을 사용할 수 있다.

- extends 키워드를 사용하며, 인터페이스는 다중 상속이 가능하고 구현 코드의 상속이 아니므로 타입 상속 이라고 한다.

 

▷ 클래스 상속과 인터페이스 구현 함께 쓰기

- 실무에서 프레임 워크나 오픈소스와 함께 연동되는 구현을 하게 되면, 클래스 상속과 인터페이스의 구현을 같이 사용하는 경우가 많다.

 

 

 


<Group Study>

● 피드백

없음.

오늘은 집중도 잘안되고, 배우는 게 머리에 안들어와서 적기도 힘들었다.. 다음주는 더 힘내야지!

 

'TIL' 카테고리의 다른 글

2023.01.17 TIL  (0) 2023.01.18
2023.01.16 TIL  (0) 2023.01.16
2023.01.12 TIL  (0) 2023.01.12
2023.01.11 TIL  (0) 2023.01.11
2023.01.10 TIL  (0) 2023.01.10