🔫 계산기 과제 Lv3 구현하며 겪은 문제점과 해결방법, 새로 알게된 점을 기록합니다.
피연산자를 여러 타입의 매개변수로 전달받아 연산을 수행하는 계산기의 기능을 확장. 단, 단순히 기존의 int 타입을 double 타입으로 바꾸는 게 아니라 제네릭을 적용하여 구현하기
제네릭 적용으로 파생된 문제
제네릭을 적용함으로써 매개변수로 다양한 타입 인자를 받을 수 있다.
단, 그로 인해 피연산자(숫자)와 전혀 관계없는 타입까지도 인자로 전달받을 수 있는 문제가 발생했다.
제네릭 타입 vs 제네릭 메서드
제네릭은 클래스나 인터페이스에 적용할 수 있으며 메서드 단위로도 제네릭을 적용할 수 있다. 계산기 구현을 위한 제네릭을 어디에 적용하는 것이 적절한지 고민됐다.
타입 매개변수의 제한
타입 매개변수를 제한하지 않았기 때문에 피연산자(숫자)와 상관없는 Object와 같은 타입도 타입 인자로 전달 받는 것이 가능하다.

타입 결정 시점의 차이
제네릭 타입은 사용할 타입을 미리 결정하지 않고 실제 사용하는 생성 시점에 타입을 결정한다. 따라서 매개변수의 타입은 ArithmeticCalculator 인스턴스를 생성하는 시점에 결정된다.
제네릭 메서드는 메서드를 호출하는 시점에 타입 인자를 전달하고 메서드에서 어떤 타입을 사용할지 결정한다. calculator 메서드를 호출하는 시점에 결정된다. 
Number 를 상한으로 타입 매개변수를 제한Number는 추상 클래스로 숫자와 관련된 클래스는 모두 Number를 상속받고 있다. 타입 매개변수에 <T extends Number>로 상한 제한을 두어 숫자와 관련된 타입만 인자로 받을 수 있게 되었다.

Number를 상한으로 제한한 ArithmeticCalculator 
Number를 상한으로 제한한 caculate 메서드 
왼쪽 코드는 제네릭 타입을 적용한 코드이고, 오른쪽 코드는 제네릭 메서드를 적용한 코드이다.ArithmeticCalculator 클래스 에서 타입 매개변수 T를 데이터 타입으로 하는 필드가 존재하지 않고 사용자에게 숫자를 입력받아 처리하는 메서드에서만 타입 매개변수를 사용하기 때문에 제네릭이 사실상 "메서드"에서만 활용되고 있어 제네릭 메서드를 적용했다.제네릭을 코드에 적용했지만 완벽하게 활용했다고 보기에는 어렵지만 이번 과제를 수행하면서 제네릭을 직접 사용하면서 읽고 이해하는 데 크게 도움이 되었다.