인프런 워밍업 클럽 3기 BE 클린코드 & 테스트 - 1주차
회고 ✨
1. 코드에 대한 태도의 변화
단순히 작동만 하는 코드가 아니라 읽기 쉽고 이해하기 좋은 코드의 중요성을 깨달았다.
추상화와 구체화를 통해 핵심적인 정보만 남기고 불필요한 정보는 제거하는 습관을 만들어야겠다.
2. 명확한 코드 작성
변수와 메서드의 이름을 축약하지 않고, 명확하고 의미 있게 짓는 연습을 해야겠다.
한 메서드가 반드시 하나의 기능만 수행하도록 구조화하는 습관을 만들어야겠다.
3. 논리적 흐름의 개선
중첩된 조건문과 반복문을 최소화하며, 사고의 깊이를 줄이는 방법을 익히게 되었다.
일찍 return 하거나 메서드를 나누면서 코드의 복잡성을 낮추고 가독성을 높여야겠다.
4. 객체 지향적 사고의 발전
객체의 책임을 명확히 구분하고 객체 간 협력을 통한 프로그래밍이 중요하다는 걸 배웠다.
setter와 getter 사용을 자제하며, 객체 내부에서 자체적으로 데이터를 관리하고 변경하는 방식으로 접근하는 습관을 만들어야겠다.
학습 일지 🌱
추상과 구체 ✨
클린 코드를 왜 쓰는 걸까?
가독성! 읽기 쉬운 코드는 이해하기 쉽고, 유지보수 하기도 쉬워진다.
결국 시간과 비용을 절약할 수 있다.
프로그램의 개념
프로그램 = 데이터(식재료) + 코드(요리 방법)
추상화란?
핵심 정보만 남기고 불필요한 정보는 생략하는 과정이다.
구체적인 정보를 간단하고 명확한 이미지로 바꾸는 것이다.
추상화 레벨의 중요성
정보를 효과적으로 함축하거나 제거하면서 유추가 가능하게 한다.
같은 레벨의 추상화로 일관성을 유지하면 코드 이해가 쉬워진다.
좋은 이름 짓기 습관
단수와 복수를 확실히 구분하기
이름 줄이지 않기
은어나 방언을 쓰지 않기
좋은 코드에서 아이디어 얻기
메서드 설계 팁
한 메서드에 한 가지 주제만 담는다.
void 대신 의미 있는 반환 값을 고민한다. (테스트가 용이)
매직 넘버와 매직 스트링을 상수로 추출해 명확히 의미 부여한다.
논리적 사고의 흐름 🧠
인지적 경제성
뇌 메모리를 덜 쓰게 하기 위해 코드의 깊이(depth)를 줄인다.
논리 구조의 개선
가능한 한 빨리 return 해서 복잡한 조건문 줄인다. (Early Return)
else, switch 등 복잡한 분기문 사용 최소화한다.
중첩된 조건문과 반복문을 최소화하고, 추상화를 통해 코드의 복잡성 낮춘다.
변수는 가까운 곳에서 선언해 이해를 돕는다.
코드 리팩토링 접근법
메서드를 추출할 때 파라미터는 최소화한다.
공백 라인에도 의미가 있다는 것을 기억하고, 복잡한 로직은 의미 단위로 나눠서 표현한다.
부정어 사용 줄이기
부정 표현은 최대한 지양하고 긍정적인 단어로 대체한다.
메서드 명에도 긍정적이고 직관적인 표현 사용한다.
예외 처리
의도된 예외와 예기치 못한 예외 명확히 구분한다.
예외가 발생할 가능성을 최대한 낮춘다. (사용자 입력이나 외부와의 접점)
Null 처리 주의하고 Optional을 제대로 활용한다.
객체지향 패러다임 🚀
프로그래밍 패러다임의 종류
절차 지향: 순서대로 명령을 처리하는 방식
객체 지향: 객체 간의 협력을 통해 프로그램이 작동하는 방식
함수형: 외부 요인 없이 항상 같은 결과를 내는 순수 함수로 프로그래밍하는 방식
객체지향의 핵심 개념
객체: 데이터를 추상화한 필드와 이를 처리하는 코드의 결합체
캡슐화: 내부 데이터를 외부로부터 숨기고 일부만 공개해 관리하는 것
다형성: 인터페이스를 통해 다양한 구현체로 교체할 수 있게 설계하는 것
관심사의 분리: 특정 기능과 책임을 명확하게 나누어 높은 응집도와 낮은 결합도를 유지하는 것
객체 설계 시 주의할 점
객체의 책임을 명확히 정의한다.
외부 세계와 어떤 방식으로 소통할지 고민한다.
setter와 getter 사용을 최소화하고, 객체 내에서 데이터 변경을 처리한다.
불필요한 필드는 최소화한다.
데이터는 최대한 불변으로 관리하기 (
final사용 권장).
객체가 주는 장점
절차 지향에서 잘 드러나지 않는 개념을 명확히 표현할 수 있다.
관심사를 명확하게 구분해 유지보수가 쉬워진다.
객체 간 협력을 통해 높은 추상화 수준에서 로직을 처리할 수 있다.
SOLID 원칙 ✨
단일 책임 원칙 (SRP): 한 클래스는 하나의 책임만 수행하기
개방 폐쇄 원칙 (OCP): 기존 코드를 변경하지 않고 기능 추가하기
리스코프 치환 원칙 (LSP): 부모 클래스를 자식 클래스로 바꿔도 동일한 결과를 보장하기
인터페이스 분리 원칙 (ISP): 인터페이스는 꼭 필요한 메서드만 정의하기
의존 역전 원칙 (DIP): 구체적인 구현체가 아닌 인터페이스(추상화)에 의존하기
객체지향 실전 적용하기 🌟
상속 vs 조합
상속보다는 조합을 사용하는 게 좋다.
상속은 유연성이 떨어지지만, 조합은 낮은 결합도로 유연성을 높일 수 있다.
Value Object vs Entity
Value Object: 모든 값이 같아야만 동일한 객체로 취급 (식별자 없음)
Entity: 식별자가 같으면 다른 값들이 달라도 동일한 객체로 취급 (식별자 있음)
일급 시민 (First-class citizen)
다른 요소처럼 변수에 할당하고, 함수의 인자로 전달하거나 반환할 수 있는 요소이다.
함수형 프로그래밍에서 함수 자체가 일급 시민이다.
일급 컬렉션
컬렉션을 객체로 감싸 하나의 필드로만 관리하는 객체이다.
의미를 명확히 하고 컬렉션 관련 로직을 담을 수 있다.
외부에서 직접 조작하지 못하게, 반환 시 새 컬렉션을 만들어 반환한다.
Enum 활용법
Enum은 특정 도메인 개념을 명시적으로 표현하는 상수의 집합이다.
자주 변하지 않는 개념은 Enum으로, 자주 변경된다면 DB로 관리하는 게 좋다.
실무에서는 Enum에 설명을 위한 필드(description)를 추가하면 좋다.
다형성 실전 활용
추상화된 스펙을 인터페이스에서 정의하고, Enum을 통해 조건과 행위를 구현체로 관리한다.
유연하고 확장할 수 있는 구조를 만들 수 있다.
도메인 지식 다루기
도메인 지식은 만드는 게 아니라 발견하는 거라는 점 기억한다.
설계할 때는 근시적, 거시적 관점 모두 고려해서 최대한 미래를 예측한다.
현실을 완벽히 복제하는 게 아니라 유연하게 대응할 수 있는 설계를 목표로 한다.
댓글을 작성해보세요.