워밍업 클럽 2기 BE 1주차 발자국
1주차 배운 내용 요약
클린코드의 중요성 알아가기
가독성 -> 글이 잘 읽히는 것이 중요하다. 나 뿐만 아닌 다름 사람이 코드를 읽었을 때 얼마나 잘 이해할 수 있을까?
회사에서 일을 할 때 코드를 읽는 것이 대부분
유지보수성 -> 추상이란? 추상에 대해서 생각해보기
추상이란 무엇일까?
구체화 된 어떤 것들을 중에서 중요한 것만 추출하여 파악하는 것.
어떤 일면만을 추상화하고, 다른 측면은 버린다.
컴퓨터 측면에서 추상화
8 byte -> 1bit, 4bit -> int 자료형
추상화 레벨 - 고수준 언어, 저수준 언어
고수준 언어는 레벨이 높다
저수준은 언어는 레벨이 낮다.
적절한 추상화는 복잡한 데이터와 로직을 단순화 한다.
잘못된 추상화는 Side-effect를 야기시킨다. 그러기 때문에 추상화를 잘 알고 사용해야 한다.
이름을 잘 지어야 한다.
이름짓기
단수 복수 구분하기
이름 줄이지 않기
은어/방언 사용하지 않기
좋은 코드를 보고 습득하기
메서드와 추상화
메서드 내부는 구체화된 내용
메서드의 시그니쳐(반환타입, 메서드명, 파라미터)는 추상화된 레벨
메서드 내부의 추상화 레벨을 잘 확인한다. -> 더 구체화 된 레벨이 있을 경우 메서드로 추출하여 레벨을 맞춘다.
메서드명, 반환 값, 파라미터를 잘 확인한다.
구체화 된 내용들을 적절하게 담기 이름
void 대신 충분히 반환할 만한 값이 있는지 고민하기
파라미터 타임, 개수, 순서를 통해 의미를 전달할 수 있다.
매직 넘버, 매직 스트링
의미를 갖고 있으나, 상수로 추출되지 않는 숫자와 문자열 등 -> 상수 추출로 이름을 짓고 의미를 부여한다
가독성, 유지보수성 증가
논리 사고의 흐름
Early Return
return 문을 사용하여 else 사용을 줄인다.
사고의 depth 줄이기
1. 중첩 if, for
중첩된 반복문 또는 조건문을 없앨 수 있도록 구체화된 내용을 메서드로 추출하는 등 추상화하여 중첩을 줄인다.
무조건 1depth로 만드는 게 아닌, 추상화를 통한 사고 과정의 depth임을 알아야 한다.
2. 사용할 변수는 가깝게 선언
변수는 사용하는 곳과 가깝지 않으면 잊어버린다.
3. 공백 라인도 의미를 가진다.
4. 부정어 줄이기
부정어는 생각을 한번 더 거치게 한다.
반대를 뜻하는 이름으로 바꾸기
메서드 이름에 부정어 넣기
5. 해피케이스와 예외 처리
예외 발생 가능성 낮추기
검증이 필요한 부분은 외부 데이터가 대부분이다
사용자 입력, 객체 생성자, 외부 서버의 요청 등
의도한 예외와 의도하지 않은 예외를 구분한다.
사용자 예외와, 개발자 확인 예외
NullPointerException 방지
return null 사용 자제
Optional 사용 고민
Optional은 비싼 객체임으로 사용할 때 고민해야 한다.
파라미터로 사용하는 객체는 아니다.
Optional로 받은 반환 값은 빨리 해소한다.
Optional을 해소하는 방법
분기문을 만드는 isPresent()-get() 대신 풍부한 API 사용
orElseGet, orelseThrow, ifPresent, ifPresentOrElse
orElse(), orElseGet(), orElseThrow()의 차이 숙지
orElse() : 항상 실행, 확정된 값일 때 사용
orElseGet() : null인 겨우 실행, 값을 제공하는 동작(supplier) 정의
orElseThrow() : null인 경우 에러 객체 throw
객체 지향
객체 설계
비공개 필드 (데이터), 비공개 로직(코드)
공개 메서드 선언부를 통해 외부 세계와 소통 → 각 메서드의 기능은 객체의 책임을 드러내는 창구
객체의 책임이 나뉨에 따라 객체 간 협력이 발생
주의점
1개의 관심사로 명확하게 책임이 정의되었는지 확인
생성자, 정적 팩토리 메서드에서 유효성 검증이 가능하다.
setter 사용 자제
getter 사용 자제
필드의 수는 적을수록 좋다.
도메인 지식은 만드는 것이 아니라 발견하는 것이다.
상속과 조합
상속보다 조합을 사용하자
상속은 부모와 자식의 결합도를 높인다.
상속을 통한 코드의 중복 제거가 주는 이점보다, 중복이 생기더라도 유연한 구조 설계가 주는 이점이 더 크다.
Value Object
도메인의 어떤 개념을 추상화하여 표현한 값 객체
값으로취급하기 위해서, 불변성, 동등성, 유효성 검증 등을 보장해야 한다.
불변성 : final 필드, setter 금지
동등성 : 서로 다른 인스턴스여도 내부의 값이 같으면 같은 값 객체로 취급한다. equals() & hashCode() 재정의가 필요
유효성 검증 : 객체가 생성되는 시점에 값에 대한 유효성을 보장
일급 컬렉션 - 일급 함수
다른 요소에게 사용 가능한 모든 연산을 지원하는 요소
변수, 파라미터, 함수 리턴 값으로 사용
컬렉션만 유일하게 필드로 갖는 객체
getter 생성시 새로운 컬렉션으로 반환해야 한다.
Enum
Enum은 상수의 집합이며, 상수와 관련된 로직을 담을 수 있는 공간이다.
특정 도메인 개념에 대해 그 종류와 기능을 명시적으로 표현해줄 수 있다.
다형성 활용하기
if문 줄이기
어떤 조건을 만족하면, 그 조건에 해당하는 행위를 수행한다.
변하는 것 → 조건, 행위
변하지 않는 것 → 조건을 만족하는 가?, 행위를 수행한다.
DAY2 미션 - 추상과 구체
아기에게 우유를 따르라고 했을 때 아기는 제대로 우유를 따르지 못한다는 그런 내용이 생각이 떠올랐던 미션이었다. 컴퓨터적 사고에 대한 내용인데 아기는 우유를 따르라고 했을 때
컵을 가져와라
우유를 가져와라
우유팩 뚜껑을 열어라
우유팩을 들어라
우유를 컵에 따라라
이런 구체화 된 내용을 말하지 않으면 할 수 없다는 내용이다. 이렇듯 컴퓨터적 사고는 모듈을 개발할 때 모든 논리 과정을 생각하지 않으면 만들 수 없다. 그런데 우리의 뇌는 이런 모든 구체화 된 내용을 기억할 수 없기 때문에 추상화하지 않으면 기억하기 힘들다.
일상 생활에서 자연스럽게 사용하고 있었지만, 이것을 다시 개발에 적용하는 것이 쉽진 않은 것 같다. 미션은 최근에 일어났던 일로 하긴 했지만 일을 할 때 코드가 하나도 추상화되어있지 않아 읽기 힘들고 기억하기가 힘들었는데 이번에 강의를 들으면서 배웠던 내용으로 추상화하려고 노력하니 많이 발전된 모습을 보일 수 있어서 좋았다.
DAY4 미션 - SOLID 정의
자바와 스프링을 하면서 너무 많이 들었던 내용이었다. 또한 면접을 볼 때도 엄청 외우고 다녔었는데 다시 보니 리마인드 되고 미션을 하면서 다시 내가 재 정의를 하려니 쉽지 않았지만 새롭게 배울 수 있었다. 학습은 타인에게 설명할 수 있는 단계 까지이다. 나도 이렇게 항상 생각하고 학습해왔기 때문에 이번에도 내가 타인에게 설명하는 것을 생각하며 SOLID를 다시 정의했다.
1주차 회고
최근에 책을 읽는 독서법을 바꾸려고 노력하고 있다. 전에는 빨리 읽으려고 노력했던 반면 요새는 책 내용 중 인상 깊었던 것들은 실천하려고 노력한다. 그렇지 않으면 읽었던 내용들을 다 잊어버린다. 그 좋은 내용들을 잊기 싫었다. 강의 내용도 그랬다. 사실 읽었던 책에 나온 내용들이긴 하지만 책은 이해하기 쉽지 않았다. 그런데 강의는 그것을 잘 이해할 수 있도록 강사님이 잘 설명해 주시기도 했고, 직접 해볼 수 있는 실습이 있어서 강의 내용을 이해하기 더 수월했다. 이론도 중요하지만 이론을 적용할 실습이 동반되지 않으면 말짱 도루묵이다. 그런면에서 얻을 수 있는 것이 많아서 좋았다.
그리고 책에서 배웠던 내용을 리마인드 한다고 생각하면서 이번 1주차를 보냈다. 강의 내용도 좋고 중간 중간 미션과 회고를 쓰게 하는 것도 좋았다. 시간이 지남에 따라 해이해지는 정신을 잘 잡아주는 커리큘럼 구성이 좋았다.
마지막으로 하나 반성을 하자면, 시간 투자를 많이 못했다. 강의를 듣고 공부하는 데에 시간을 많이 못쓰고.. 강의가 밀리기도 했다. 다행이 휴일이 많아서 따라왔지만, 다음 주부터는 이렇게 하다간 힘들 거라는 생각이 들었다. 시간을 많이 투자하고 관련된 책들도 다시 읽고, 미션도 열심히 수행해야겠다고 반성했다.
댓글을 작성해보세요.