[TIL] 2025-01-08_계산기3_트러블슈팅

Yuri·2025년 1월 8일

TIL

목록 보기
24/59

🔫 계산기 과제 Lv3 구현하며 겪은 문제점과 해결방법, 새로 알게된 점을 기록합니다.

피연산자를 여러 타입의 매개변수로 전달받아 연산을 수행하는 계산기의 기능을 확장. 단, 단순히 기존의 int 타입을 double 타입으로 바꾸는 게 아니라 제네릭을 적용하여 구현하기

문제점

  1. 제네릭 적용으로 파생된 문제
    제네릭을 적용함으로써 매개변수로 다양한 타입 인자를 받을 수 있다.
    단, 그로 인해 피연산자(숫자)와 전혀 관계없는 타입까지도 인자로 전달받을 수 있는 문제가 발생했다.

  2. 제네릭 타입 vs 제네릭 메서드
    제네릭은 클래스인터페이스에 적용할 수 있으며 메서드 단위로도 제네릭을 적용할 수 있다. 계산기 구현을 위한 제네릭을 어디에 적용하는 것이 적절한지 고민됐다.

원인

  1. 타입 매개변수의 제한
    타입 매개변수를 제한하지 않았기 때문에 피연산자(숫자)와 상관없는 Object와 같은 타입도 타입 인자로 전달 받는 것이 가능하다.

  2. 타입 결정 시점의 차이
    제네릭 타입은 사용할 타입을 미리 결정하지 않고 실제 사용하는 생성 시점에 타입을 결정한다. 따라서 매개변수의 타입은 ArithmeticCalculator 인스턴스를 생성하는 시점에 결정된다.
    제네릭 메서드는 메서드를 호출하는 시점에 타입 인자를 전달하고 메서드에서 어떤 타입을 사용할지 결정한다. calculator 메서드를 호출하는 시점에 결정된다.

해결 방법

  1. Number 를 상한으로 타입 매개변수를 제한
    Number는 추상 클래스로 숫자와 관련된 클래스는 모두 Number를 상속받고 있다. 타입 매개변수에 <T extends Number>로 상한 제한을 두어 숫자와 관련된 타입만 인자로 받을 수 있게 되었다.

    ▶︎ Integer
    ▶︎ Double
    ▶︎ Number를 상한으로 제한한 ArithmeticCalculator
    ▶︎ Number를 상한으로 제한한 caculate 메서드

  2. 제네릭 메서드로 구현
    제네릭 타입과 제네릭 메서드는 타입 결정 시점의 차이일 뿐 사실 두 가지 방법으로 모두 구현이 가능하다.
    왼쪽 코드는 제네릭 타입을 적용한 코드이고, 오른쪽 코드는 제네릭 메서드를 적용한 코드이다.

    ArithmeticCalculator 클래스 에서 타입 매개변수 T를 데이터 타입으로 하는 필드가 존재하지 않고 사용자에게 숫자를 입력받아 처리하는 메서드에서만 타입 매개변수를 사용하기 때문에 제네릭이 사실상 "메서드"에서만 활용되고 있어 제네릭 메서드를 적용했다.

배운 점

  • 타입 매개변수 T 에는 extends 를 사용하여 부모 클래스와 그 하위 클래스만 허용하는 상한 제한을 걸 수 있다.
  • 제네릭 타입과 제네릭 메서드는 스코프를 고려하여 선택하자.

제네릭을 코드에 적용했지만 완벽하게 활용했다고 보기에는 어렵지만 이번 과제를 수행하면서 제네릭을 직접 사용하면서 읽고 이해하는 데 크게 도움이 되었다.

profile
안녕하세요 :)

0개의 댓글