객체 지향의 특징과 개념에 대해 알아봤다면, 이를 적용한 실습을 통해 객체 지향에 한발 더 다가가는 시간을 가졌다.
사칙연산 계산기
요구사항
• 간단한 사칙 연산을 할 수 있다.
• 양수로만 계산할 수 있다.
• 나눗셈에서 0을 나누는 경우 IllegalArgument 예외를 발생시킨다.
• MVC패턴(Model-View-Controller) 기반으로 구현한다.
프로젝트 구성
패스워드 검증기 코드(password)와 사칙 연산 계산기(calcurator)의 코드를 개별 관리하기 위해 새 패키지를 생성한다.
항상 프로덕션 코드의 패키지(main)와 테스트 코드의 패키지(test)의 경로를 일치시켜야 한다.
테스트 코드를 작성하다가 새로운 객체를 생성하기 위해 단축키를 입력하면 해당 객체를 저장할 위치를 지정할 수 있다.
이 때, 프로덕션 코드와 테스트 코드의 경로가 일치하지 않으면 테스트 코드(test 폴더)만 목록에 나타나게 된다.
Alt + Enter > Create class '객체명' : 코드를 작성하다가 새로운 객체를 생성하는 방법
Alt + Enter > Create method '메서드명' in '객체명' : 코드를 작성하다가 새로운 메서드를 생성하는 방법
테스트 코드 작성(+, -, *, /)
연산을 수행할 테스트 코드를 작성한다.
연산을 하려면 연산의 대상인 피연산자와 연산자가 필요하다. 예 : 1(피연산자) +(연산자) 2(피연산자)
절차지향 : 연산을 수행하기 위해 메서드안에 직접 피연산자와 연산자를 넣어 연산을 수행한다.
객체지향 : 하나의 객체안에 연산에 필요한 상태(피연산자, 연산자)를 넣고, 이를 통해 수행해야 할 행동들을 넣는다.
● 덧셈 연산을 수행한다.
● 뺄셈 연산을 수행한다.
● 곱셈 연산을 수행한다.
● 나눗셈 연산을 수행한다.
① 테스트 코드 : Calculator에게 피연산자, 연산자, 피연산자를 전달하여 연산 작업을 위임한다.
② Calculator : 연산에 대한 결과를 반환하도록 구현한다.
연산자(+, -, *, /)만 변경하여 그에 따른 연산을 수행하도록 작성한다.
③ 테스트 코드 : Calculator의 연산 결과와 기대값이 일치하는지 확인한다.
코드 앞 부분 > Alt + Enter > Introduce local variable : 메서드가 수행한 결과를 저장할 변수를 생성하는 방법
한글이 깨지는 문제
테스트는 성공했지만, 한글이 깨져 출력되는 문제점이 발생했다.
Edit Custom VM Options... 에 진입하여 해당 문장을 넣고 IntelliJ를 재실행하면 해결된다.
Help > Edit Custom VM Options...
-Dfile.encoding=UTF-8
-Dconsole.encoding=UTF-8
테스트 코드 작성(사칙 연산)
● 사칙 연산을 수행한다.● 덧셈 연산을 수행한다.● 뺄셈 연산을 수행한다.● 곱셈 연산을 수행한다.● 나눗셈 연산을 수행한다.
① 테스트 코드 : 애너테이션 변경(@Test → @ParameterizedTest)
② 테스트 코드 : Stream 메서드를 생성하여 arguments()에 피연산자, 연산자, 피연산자를 넣는다.
③ 테스트 코드 : Stream 메서드를 @MethodSource의 대상으로 지정한다.
④ 테스트 코드 : arguments()를 사칙 연산 테스트 메서드의 인자로 받는다.(arguments() 내 문장이 순차적으로 수행된다.)
⑤ 테스트 코드 : Calculator의 연산 결과와 기대값이 일치하는지 확인한다.
@MethodSource : 하나의 테스트 코드로 n가지의 경우를 한꺼번에 처리 가능
테스트 코드 리팩토링(Enum)
테스트 코드 → (연산 요청) → Calculator → (연산 요청) → Enum
Enum → (결과 전달) → Calculator → (결과 전달) → 테스트 코드
① Enum : 연산자(+, -, *, /)를 Enum 형태로 리팩토링한다.
연산을 수행할 추상 메서드를 정의하고, 정의한 추상 메서드를 연산자마다 구현한다.
② Calculator : 테스트 코드에게 연산을 요청 받으면 연산을 수행하는 Enum의 추상 메서드를 호출하여 작업을 위임한다.
③ Enum : Enum의 연산자와 인자의 연산자가 일치하는지 확인한다.
일치 : 해당하는 값을 가져온다. > 연산자에 해당하는 추상 메서드를 호출한다.
일치하지 않음 : 일치하는 연산자가 없으면 예외를 발생시킨다.
④ 테스트 코드 : Calculator의 반환 결과와 기대값이 일치하는지 확인한다.
테스트 코드 리팩토링(Interface)
테스트 코드 → (연산 요청) → Calculator → (연산 요청) → Interface → (연산 요청) → 구현체
구현체 → (결과 전달) → Interface → (결과 전달) → Calculator → (결과 전달) → 테스트 코드
① Interface : 인터페이스를 선언한 다음 이를 구현하는 연산자 객체(+, -, *, /)를 생성한다.
② Calculator : 연산 작업을 Enum에서 인터페이스로 위임한다(Enum → Interface).
각각의 구현체들을 상위 인터페이스를 통해 전달 받는다.
구현체의 연산자와 인자의 연산자가 일치하는지 확인한 후 해당 구현체에게 연산 작업을 위임한다.
일치 : 해당하는 값을 가져온다.
일치하지 않음 : 일치하는 구현체가 없으면 예외를 발생시킨다.
③ 테스트 코드 : Calculator의 반환 결과와 기대값이 일치하는지 확인한다.
오늘 공부한 실습 프로젝트는 자바를 공부할 때 접해 본터라 익숙하지만, 혼자서 구현해 본 적은 없다.
빈 백지 상태에서 실습한 내용을 복습하려고 구현 흐름을 적어놓았다.
● 테스트 코드는 1:1로만 작성해야 되는 줄 알았다.
● @ParameterizedTest, @MethodSource를 사용하면 하나의 테스트 코드로 n가지의 경우를 한꺼번에 처리 가능하다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
#패스트캠퍼스 #포트폴리오 #직장인자기계발 #환급챌린지 #포트폴리오챌린지 #패스트캠퍼스후기 #초격차패키지 #오공완
'Java > [패스트캠퍼스] 50일 포트폴리오 챌린지' 카테고리의 다른 글
[6일차] 10개 프로젝트로 완성하는 백엔드 웹개발(Java/Spring) (0) | 2023.08.13 |
---|---|
[5일차] 10개 프로젝트로 완성하는 백엔드 웹개발(Java/Spring) (0) | 2023.08.12 |
[3일차] 10개 프로젝트로 완성하는 백엔드 웹개발(Java/Spring) (0) | 2023.08.10 |
[2일차] 10개 프로젝트로 완성하는 백엔드 웹개발(Java/Spring) (0) | 2023.08.09 |
[1일차] 10개 프로젝트로 완성하는 백엔드 웹개발(Java/Spring) (0) | 2023.08.08 |