2024-07-24~2024-07-31 동안 단체 프로젝트를 시작하기 전 객체지향적 구조 인터페이스, 제네릭, 람다, 스트림, enum을 실제로 구현해 보는 연습을 진행했다.
1개의 클래스에서 기본적인 사칙연산 구현 -> 예외처리, 구현, 상속을 이용해서 단일 책임 원칙을 지키는 객체지향 프로그래밍 -> enum, 제네릭, 람다, 스트림을 통한 모던자바식 프로그래밍의 단계로 진행했다.
1단계는 기초적인 기능 (입출력, equals, 연산..) 등은 매우 매우 기초적인 거라 쉽게 구현이 가능했고,
2단계에서는 지금까지 코테 위주의 공부만 했던 나는 사실 if else를 이용해서 예외처리를 흉내만 냈지, throw나 try catch를 이용한 예외처리는 경험이 적다. 나는 건 핑계로.. 몇몇 예외처리가 약간 아쉬운 점이 있었다.
인터페이스나 부모 클래스로부터 상속받아 기능을 확장하는 것은 말이 어렵지 실제 코드에서는 어렵지 않기 때문에 금방 익숙해졌고, 코테에서는 한 메서드에 기능을 와장창 넣었다면, 프로젝트에서는 최대한 단일 기능을 보장해 주는 것이 좋기 때문에 여러 클래스로 분할하는 것도 연습할 수 있었다.
3단계에서는 enum형을 이용해서 연산자를 관리하는 식으로 바꾸거나, 제네릭을 통해서 입출력 형태를 좀 유동적으로 관리하거나, 람다/스트림을 이용해서 가독성을 높이는 리펙토링을 연습했다.
enum형은 특수한 클래스라고 생각한 후 작성을 진행해서 나쁘지 않게 코드작성을 했다고 생각하지만, 중요한 건 제네릭이었다. 인터페이스 -> 각 기능 구현체 -> 구현체들을 포함한 계산기 단계로 모양을 갖춘다고 생각했을 때, 나 나름대로 진행한 리펙토링은 사실 인터페이스에서 끝이었다.. 실제로는 인터페이스 -> 구현체 -> 계산기 모두 제네릭으로 교체해 주고, 그 중간에 타입을 찾아주는 클래스도 필요하다는 사실을 몰랐다. 이 정보를 갖고 수정을 진행하고 있으며, 빨리 이 문제를 알 수 있어서 다행이라고 생각한다.
람다, 스트림은 JS나 다른 언어에서 함수 사용이나 이런 식으로 경험을 조금 해봤어서 금방 적응할 수 있던 것 같다. 물론, 람다 함수를 위해서 함수형 인터페이스를 생성하는 거나, 이미 존재하는 람다식에 익숙지 못한 점은 있으나, 경험을 더 한다면 금방 능숙해질 수 있다고 생각한다.
이런 경험들이 쌓이면 좀 더 능숙한 개발자가 될 수 있음이 틀림없다고 믿으며, 일단 이 미미한 경험을 이용해서 내일부터 진행할 팀 프로젝트에서 1.2인분 이상을 하도록 해보겠다.