[내일배움캠프] 계산기 구현 - level.03(2)

2024. 9. 8. 01:54내일배움캠프

 'Generics' 를 구현 중인 'level03' 계산기에 적용하였다. 기존에는 이전 'level02' 계산기에 사용했던 'level02/calculate/Calculator' 클래스를 재사용하였지만 요구사항을 적용하기 위해 'level03/calculate/Calculator' 를 추가 생성하였다.

 

1. Generics 적용

 'Generics' 는 왜 사용할까? 개인적으로 내린 결론은 "타입별로 클래스를 구현하는 것은 매우 비효율적이기 때문" 이라 생각한다. 물론 구현 당시에는 사용될 법한 타입을 사용한 클래스를 여럿 만들어 두는 것은 그리 어렵지 않을 수 있다. 하지만 구현 후 사용될 타입 외에 타입들이 사용자들의 요구나 개인적으로 늘어난다면? 그런 경우가 생길 때 마다 배번 해당 타입을 클래스를 만들어야하고 필요가 없다면 삭제할 것이다(와...너무 귀찮...).

 

하지만 'Generics' 를 사용해 클래스를 만들면 하나의 클래스만을 구현해두고 필요에 따라 객체 타입을 바꾸어 주면 되기에 위와 같은 상황을 방지할 수 있다. 아래의 이미지는 'Genercis' 를 사용해 생성한 'level03/calculate/Calculator.class' 의 일부이다.

Generics 를 적용한 Calculator 클래스

 

요구사항은 앞으로 입력될 값이 '자연수 or 0' 에서 '실수' 로 입력 범위가 늘어난 것이다. 그래서 실수 값을 받기 위해 double 타입을 사용해야 하는데, 이를 위해 클래스의 필드 변수 타입을 직접 바꿔주어도 되지만 만약 이전으로 되돌려야 하는 경우 같은 작업을 또 다시해야 하는 번거로움이 발생한다. 하지만 위 이미지처럼 Generics 를 사용해 클래스를 생성하면 다시 자연수 및 0 만 입력 받을 경우엔 'Calculator<Integer>' 타입의 객체를 생성하면 될 것이고, 현재 요구사항처럼 입력 값을 실수도 받을 경우에는 'Calculator<Double>' 타입의 객체를 생성하면 되기에 편리하다.

 

연산 역할을 수행하는 Calculator 가 바뀌었으니 연산 수행 메서드를 가진 구현 클래스(Operation 인터페이스 구현)와 상속받은 인터페이스 또한 바뀌어야 한다. 기존 코드를 남기고 싶어서 추가 구현을 하였는데 구현 코드의 일부는 아래와 같다.

level03/calculate 패키지의 Operation 과 AddOperation

 

AddOperation 클래스는 Opertaion 인터페이스를 구현한 클래스이다. 구현한 메서드 calculate() 를 보면 'doubleValue()' 라는 메서드를 사용했다. 해당 메서드는 Number 클래스에 구현된 메서드이다. 해당 메서드를 사용한 이유는 현재 파라미터에 있는 값은 기본 데이터가 아닌 객체이기 때문이다. 객체는 기본적으로 산술연산이 불가능하다(추가 구현 필요). 그렇기에 해당 객체에서 기본 데이터 값을 적절한 기본형 타입으로 변환해 반환받은 값으로 연산을 수행해야 하는 것이다.

 

요구사항에 따르면 Integer 또는 Double 타입의 객체를 사용하게 될 것이다. 두 래퍼 클래스가 상속하는 Number 클래스로 객체 타입 지정을 제한해 두었다 . 그래서 'T' 타입의 파라미터는 'Number' 클래스의 메서드를 사용할 수 있는 것이다. 뺄셈, 곱셈, 나눗셈 연산을 수행하는 메서드를 가진 구현 클래스들도 각각 추가로 구현해 두었다.

 

이후 Level03 클래스에, 구현한 'level03/calculate/Calculator' 클래스 객체를 추가(이전 'level02' 계산기의 Calculator 는 제거)해 계산기를 실행해 수행이 정상적으로 되는지 확인하였다. 추가적으로 'level02' 계산기에도 Integer 타입의 Calculator 객체를 생성하여 다른 타입의 경우도 잘 수행되는지 확인을 마쳤다(확인 이후 'level02' 계산기는 원상복구).

 

 

2. enum 클래스 추가

 이전에는 'level02' 패키지의 Calculator 클래스를 재사용 했기에 사용하지 않았지만 이번에 추가로 'level03' 에 Calculator 를 구현하면서 연산 기호에 대한 값을 관리할 Enum 클래스를 추가 생성하였다.

연산자 값(연산기호)을 설정하는 Operator 클래스
연산자 값(연산기호)에 따라 연산 객체를 생성하는 setOperation() 메서드

 

 

3. 정리

 Generics 를 적용한 클래스를 추가해 적절한 타입의 객체를 생성할 수 있게 되었다. 또한 연산을 구분하거나 연산에 필요한 연산기호도 이제 직접 문자열을 입력해 수정하지 않고 Operator 클래스에서 한 번에 관리할 수 있게 되었다.