From 026b0314971813eff746c1156b96bb365428a88f Mon Sep 17 00:00:00 2001 From: 02ggang9 <02ggang9@gmail.com> Date: Tue, 14 Nov 2023 20:45:07 +0900 Subject: [PATCH] =?UTF-8?q?feat(=EC=9A=B0=ED=85=8C=EC=BD=944=EC=B0=A8?= =?UTF-8?q?=EC=86=8C=EA=B0=90=EB=AC=B8):=20=EC=9A=B0=ED=85=8C=EC=BD=94=204?= =?UTF-8?q?=EC=B0=A8=20=EC=86=8C=EA=B0=90=EB=AC=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\354\206\214\352\260\220\353\254\270.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 "_posts/wooteco/2023-11-14-\354\232\260\355\205\214\354\275\2244\354\260\250\354\206\214\352\260\220\353\254\270.md" diff --git "a/_posts/wooteco/2023-11-14-\354\232\260\355\205\214\354\275\2244\354\260\250\354\206\214\352\260\220\353\254\270.md" "b/_posts/wooteco/2023-11-14-\354\232\260\355\205\214\354\275\2244\354\260\250\354\206\214\352\260\220\353\254\270.md" new file mode 100644 index 00000000..eb167851 --- /dev/null +++ "b/_posts/wooteco/2023-11-14-\354\232\260\355\205\214\354\275\2244\354\260\250\354\206\214\352\260\220\353\254\270.md" @@ -0,0 +1,39 @@ +--- +published: false +title: "Wooteco - 4차 소감문" +categories: + - wooteco +--- + + +## 클래스 분리 연습 + +지난 주 미션을 진행하면서 공부한 '함수형 인터페이스'에 관한 내용을 블로그 글에 정리하면서 이번주 미션에는 '상속과 합성'에 대한 내용이 등장할 것 같다라는 글을 남겼는데 실제 주된 내용이 '상속과 합성'이라서 깜짝 놀랐습니다. 예측은 성공했지만 실제 추상 클래스와 인터페이스를 사용한 적이 손에 꼽을 정도라 처음 객체들을 설계할 때 상속을 고려하지 못했습니다. 일단 최종 코딩테스트를 진행하는 마음으로 일단 돌아가는 쓰레기를 만들도록 노력했습니다. + +1차 구현을 완성한 제 코드는 객체지향언어를 사용해서 완성했다라고는 도저히 믿어지지 않을 정도의 코드였습니다. 예를 들어, 크리스마스 할인, 주말 할인 클래스 등을 전부 다 따로 만들고 각각 할인 금액을 계산하도록 설계 했습니다. 전체적으로 맡은 책임은 같아 하는 행동은 같았지만 메서드의 이름은 서로 달랐기 때문에 구현을 하면서도 어떻게 상속으로 깔끔하게 처리하지? 의문이 들었지만 일단 주어진 5시간 이내에 완성하려고 노력했습니다. + +4시간이 지나고 주어진 테스트 케이스를 전부다 통과하는 코드를 완성했습니다. 이때부터는 마음을 차분히 가라 앉히고 현재 작성한 코드의 디펜던시를 그려보고 CRC CARD를 이용해 완성된 객체의 책임과 협력 관계를 A4용지에 그려보았습니다. 그려보니 객체와의 협력은 하나도 없었고 전체 할인 금액을 구할 때 파라미터의 수가 6개가 넘어가는 상황이 만들어졌습니다. 만약 할인 이벤트가 계속해서 추가된다면 파라미터의 수는 계속해서 증가할 것이고 이는 언제가는 터질 폭탄처럼 보이는 코드였습니다. + +위의 문제를 해결하기 위해 어김없이 '오브젝트'라는 책을 중심으로 학습했습니다. 이번 미션을 진행하면서 가장 인상 깊었던 내용은 '상속과 코드 재사용'입니다. 위에서 얘기드렸지만 해당하는 할인 정책에 맞는 금액을 계산하는 책임은 모든 클래스가 가지고 있었지만 메서드의 이름도 다르고 계산 과정이 달랐기 때문에 중복코드가 5개 이상이였습니다. '상속과 코드 재사용' Chapter를 읽으면서 어떻게 중복 코드를 제거하고 추상화에 의존시키는지 알게 되었습니다. 여러가지 할인 클래스를 Discount 클래스를 상속받게 하고 클라이언트가 Discount라는 추상화에 의존하도록 완성 시켰습니다. + +3차 구현으로는 오브젝트 책의 '차이를 메서드로 추출하라'의 내용을 적극적으로 반영했습니다. 2차 구현에서 추상화에 의존하도록 만들고 Discount를 상속받도록 만들었지만 여전히 큰 흐름의 로직이 중복되는 느낌을 받았습니다. 이를 해결하기 위해서 서로다른 계산 로직이 있는 부분만 메서드로 추출하고 중복이 되는 코드를 부모 클래스로 올렸습니다. 이렇게 함으로써 단일 책임 원칙을 준수하고 응집도가 높아지는 효과를 얻었습니다. 또, 다음에 있을 새해 이벤트에서도 주말 할인, 특별 할인 등의 클래스를 재사용할 수 있게 되었습니다. + +--- + +지난주 미션을 진행하면서 공부한 '함수형 인터페이스'에 관한 내용을 블로그 글에 정리하면서 이번 주 미션에는 '상속과 합성'에 대한 내용이 등장할 것 같다는 글을 남겼는데 실제 주된 내용이 '상속과 합성'이라서 깜짝 놀랐습니다. 예측은 성공했지만, 실제 추상 클래스와 인터페이스를 사용한 적이 손에 꼽을 정도라 처음 객체들을 설계할 때 상속을 고려하지 못했습니다. 일단 최종 코딩테스트를 진행하는 마음으로 일단 돌아가는 쓰레기를 만들도록 노력했습니다. + +1차 구현을 마친 코드는 객체지향 언어를 사용해 완성된 것이라고는 믿기 어려울 정도로 엉망이었습니다. 예를 들어, 크리스마스 할인, 주말 할인 클래스 등을 별로도 설계하고 각각의 할인 금액을 계산하는 방식은 전체적인 책임이 같고 행동도 같았지만 메서드 이름과 계산 방식이 달라 중복되는 코드가 많았습니다. 중복되는 코드가 많아짐으로써 인스턴스 변수의 수는 자연스럽게 증가하고 하나의 객체가 수많은 책임을 가지게 되었습니다. 3주 차 피드백 내용을 적극적으로 반영하지 못했다는 느낌이 들었고 리팩토링을 마음먹었습니다. + +리팩토링을 진행하기 위해서 일단 1차 구현 코드를 보면서 A4 용지에 디펜던시를 그려보고 CRC 카드를 이용해 완성된 객체의 책임과 협력 관계를 그렸습니다. 그림을 봤을 때 하나의 객체가 여러 객체(크리스마스 할인, 주말 할인 등)에 의존하고 있었고 아무런 협력 관계를 형성하지 않았습니다. 이 때문에 총 할인 금액을 계산할 때 매개변수가 5개 이상이고 할인 이벤트를 추가해달라는 요구사항이 들어온다면 매개변수의 개수가 끝없이 증가하는 코드였습니다. + +위의 문제를 해결하기 위해서 '오브젝트'라는 책의 '상속과 코드 재사용' 목차를 2번 정독했습니다. 이 목차에서는 중복 코드를 제거하고 추상화에 의존하는 방법을 설명하고 있습니다. 금액을 계산하는 책임은 모든 객체가 가지고 있지만 메서드의 이름이 다르고 세부 계산 로직이 다르기 때문에 중복코드가 많았습니다. 하지만 상속을 통해서 클라이언트의 코드가 Discount라는 추상화 클래스에 의존하도록 만들 수 있었습니다. + +리팩토링을 거치고 나서 추상화에 의존하는 좋은 코드를 완성했지만, 아직 코드를 재사용하지는 못했습니다. 그 이유는 할인 금액을 계산하는 로직이 달랐기 때문입니다. 이 문제점을 해결하기 위해서 변하지 않는 부분을 부모 클래스로 올리고 변하는 부분을 메서드로 추출하고 세부 로직을 자손 클래스가 구현하도록 만듦으로써 재사용 가능하고 추상화에 의존하는 코드를 완성할 수 있었습니다. 이렇게 함으로써 앞으로의 있을 새해 이벤트에도 주말 할인, 특별 할인 등의 클래스를 재사용할 수 있지 않을까 기대하는 마음입니다. + +개인적으로 존경하는 백기선님께서 '스프링보다 자바를 더 잘해야 한다'는 말씀을 하신적 있습니다. 프리코스를 진행하기 전에는 스프링 프레임워크에 대한 이해와 JPA 기술을 집중적으로 공부했습니다. 하지만 프로젝트를 진행할때마다 자바 언어에 대한 이해도가 너무 낮다는 느낌을 받았었습니다. 이번 프리코스를 진행함으로써 프레임워크 같은 부가적인 요소보다는 보다 근본적인 자바의 핵심에 대해 공부하고 발전하고 있다는 느낌을 받았습니다. 최종 코딩 테스트에 선발되고 통과하면 정말 행복하겠지만 떨어지더라도 정말 값진 경험을 했다고 생각합니다. + +과거 프로그래밍 학습 과정에서 백기선 님의 '스프링보다 자바를 더 잘해야 한다'는 말씀을 들었습니다. 처음 프리코스에 참여하기 전까지, 저는 스프링 프레임워크와 JPA 같은 부가적인 기술에만 집중했습니다. 하지만 프로젝트를 진행하면서 자바 언어 자체에 대한 이해가 부족했다는 것을 절실하게 깨달았고 성급하게 프로젝트를 진행한 것이 아닌가라는 생각을 했습니다. 이번 프리코스를 통해 4주 동안 자바 언어의 핵심을 공부하고, 근본적인 실력이 향상하고 있다는 느낌을 강력히 받았습니다. 최종 코딩 테스트에 선발되고 합격하면 정말 행복하겠지만 떨어지더라도 정말 값진 경험을 했다고 생각합니다. 또, 부트캠프와 같은 교육 프로그램을 한 번도 시도해 본 적이 없어 걱정되었지만 4주 동안 끝까지 완주했다는 경험이 저의 자신감을 올려주었습니다. 이런 기회를 만들어 주신 관계자님들께 정말 감사드립니다. + + + +