[인프런워밍업스터디_BE_2기] 1주차 발자국!
Readable Code: 읽기 좋은 코드를 작성하는 사고법 수강 후 작성한 글입니다.
1주차 정리
1주차에는 추상 섹션에서 추상과 구체에 대한 개념 정리, 이름짓기 등 간단한 부분을 배웠다. 이중에서 한 클래스 또는 메서드 내에서 추상화 레벨을 맞추는 부분은 기존에 생각하지 못하던 부분이라 해당 섹션의 내용 중 가장 인상 깊었다.
다음 섹션3 논리, 사고의 흐름에서는 사고의 depth를 줄이는 부분이 기억에 남았다. 기존에 중첩된 for문이나 if문 등을 보면 강박적으로 이를 해소하고자 했던 것 같은데, 눈에 보이는 depth가 아니라 사고 과정을 줄이는 것이 중요하다는 것을 듣고 실무에서 이 부분을 놓치지 않도록 계속 신경 써야겠다는 생각이 들었다.
섹션 4에서는 객체를 설계할 때 생각할 것과 SOLID에 대해 배웠다. 1주차 내용중 가장 와닿았던 내용이 있었는데, 그것은 'getter은 굉장히 폭력적'이라는 것이다. 객체 지향에 대해 공부하면서 이를 실무에 적용했을 때 'A.getAA().getAAA()..'와 같이 연속된 getter를 사용하여 비교하거나하는 등 뭔가 가독성이 떨어진다는 느낌을 받을 때가 많았다. 그런데 이렇게 무작정 getter를 쓰기보다는 다른 방법을 생각해보고 적용해보면서 이렇게 해결할 수도 있구나! 하면서 클래스를 만들면 습관적으로 getter를 만들던 내 자신을 돌아보게 되었다.
섹션 5에서는 본격적으로 객체 지향을 적용한 다양한 리팩터링을 진행하였는데, 평소 존재는 알고 있었지만 활용하지 못했던 일급컬렉션과 같은 개념을 잘 알 수 있게 되었고, ValuObject나 Enum 처럼 사용하고 있었음에도 충분히 활용하지 못한 부분이 있다는 것을 알 수 있어 굉장히 유익했다.
1주차 과제 정리
1주차 Day2 과제
"추상과 구체" 강의를 듣고, 생각나는 추상과 구체의 예시가 있다면 한번 3~5문장 정도로 적어봅시다. 일상 생활, 자연 현상, 혹은 알고 있는 개발 지식 등 어느 것이든 상관 없습니다. 추상에서 구체로, 또는 구체에서 추상으로 방향은 상관 없으나, 어떤 것이 추상이고 어떤 것이 구체 레벨인지 잘 드러나게 작성해 보아요 :)
ex) 우리가 상대방에게 소리를 내어 말을 하고 듣는 과정을 구체 레벨에서 표현한다면? - 폐에서 나온 공기가 성대를 통과한다. - 이는 나의 입술을 통해 외부로 방출되고, 상대방과 나 사이에 있는 공기를 진동시킨다. - 공기를 통해 전달된 진동은 고막, 달팽이관 등을 거쳐 청각세포, 청신경을 통해 뇌로 전달된다.
추상: 총을 쏜다.
구체:
약실에 탄약을 넣는다.
총의 방아쇠를 당긴다.
공이치기가 공이를 때린다.
뇌관이 폭발하며 탄약 내 화약을 연소시킨다.
화약이 연소되며 발생한 가스가 탄환을 밀어낸다.
1주차 Day4 과제
아래 코드와 설명을 보고, [섹션 3. 논리, 사고의 흐름]에서 이야기하는 내용을 중심으로 읽기 좋은 코드로 리팩토링해 봅시다.
public boolean validateOrder(Order order) {
if (order.getItems().size() == 0) {
log.info("주문 항목이 없습니다.");
return false;
} else {
if (order.getTotalPrice() > 0) {
if (!order.hasCustomerInfo()) {
log.info("사용자 정보가 없습니다.");
return false;
} else {
return true;
}
} else if (!(order.getTotalPrice() > 0)) {
log.info("올바르지 않은 총 가격입니다.");
return false;
}
}
return true;
}
https://github.com/HyeongSeop-Kim/readable-code/tree/main/src/main/java/cleancode/day4/tobe
SOLID에 대하여 자기만의 언어로 정리해 봅시다.
저는 SOLID 원칙을 파인만 기법을 적용해서 초등학생에게 설명할 수 있도록 최대한 간단한 비유를 들어서 정리해봤습니다.
단일 책임 원칙 (Single Responsibility Principle)
-> 프로그램에서 하나의 클래스나 함수는 한 가지 책임을 져야해.
-> 장난감을 정리할 때 각자 한 가지 역할만 맡는 거야. 한 사람은 로봇 장난감을 모으고, 또 다른 사람은 자동차 장난감을 정리해. 그러면 일이 더 깔끔하고 빠르게 끝날 수 있겠지?
개방-폐쇄 원칙 (Open-Closed Principle)
-> 프로그램은 쉽게 확장할 수 있어야 하지만, 기존 코드를 고치지 않아도 새 기능을 추가할 수 있어야해.
-> 게임을 만들 때, 새로운 사냥터를 추가하고 싶어. 그런데 게임 자체를 다시 만들 필요가 있을까? 그냥 새로운 사냥터를 추가할 수 있게 하면 만들면 돼.
리스코프 치환 원칙 (Liskov Substitution Principle)
-> 부모 클래스를 사용하는 곳에 자식 클래스를 넣어도 문제없이 작동해야 해.
-> 청소기는 로봇 청소기도 있고, 일반 청소기도 있고, 작은 손청소기도 있잖아? 어떤 청소기를 사용하더라도 청소기라면 다 청소를 해줄 수 있어.
인터페이스 분리 원칙 (Interface Segregation Principle)
-> 하나의 큰 인터페이스를 여러 개로 나눠서 필요한 것만 사용할 수 있게 하는 거야.
-> 학교에서 준비물을 챙길 때, 매번 모든 준비물을 챙겨두는 것보다 미술 시간이 있는 날에는 미술 도구만 챙기고, 체육 시간이 있는 날에는 체육복만 챙기는 게 더 가볍고 좋겠지?
의존성 역전 원칙 (Dependency Inversion Principle)
-> 프로그램에서 높은 수준의 클래스가 낮은 수준의 세부 사항에 의존하지 않게 해야 해.
-> 핸드폰 충전기가 핸드폰마다 전부 다르면 너무 불편하겠지? 한 가지 충전기로 모든 핸드폰을 충전하게 하면 핸드폰을 바꾸더라도 기존에 사용하던 충전기를 사용할 수 있겠지?
1주차를 마치며
이번 인프런 워밍업 스터디 2기의 소식을 들었을 때 기존에 듣고 있었던 테스트 코드에 대한 강의와 더불어 관심을 가지고 있던 Readable Code에 대한 내용이 있어 신청을 하고 싶었다. 하지만 현재 실무에서 맡고 있는 프로젝트 일정이 빠듯해서 계속 고민을 하게 되었는데, 이번 기회를 놓치면 다음에는 기회가 없을 수도 있을 것 같고, 0기에서의 좋은 기억도 있어 신청을하였다.
아쉬웠던 점
역시 업무가 바쁘다보니 퇴근 이후 강의를 듣는 것도 빠듯했다. 그래서 과제를 기한에 맞춰 제출하긴 하였지만 시간이 부족하다보니 깊은 고민을 해보지 못한 것이 가장 아쉬웠던 것 같다.
칭찬할 점
시간이 없는 와중에도 일정표에 따라 진도를 맞춰간 것은 칭찬할 점이라고 생각한다.
보완할 점
주말을 조금 더 활용하여 시간이 부족한 부분을 채워야할 것 같다.
댓글을 작성해보세요.