이펙티브 자바(5)
-
23년 03월 24일, 일일 회고
Fact (사실: 무슨 일이 있었나?) 자바 공부 - 체스 미션 피드백 강의를 수강했다. - 이펙티브 자바 스터디를 들었다. 개인 성장 - x 커뮤니티 - 여자친구와 저녁을 먹고 석촌 호수를 산책했다. - mdop 이전 악장과 저녁에 치맥을 했다. - 글쓰기 리뷰를 했다. Feeling (느낌: 무슨 느낌이 들었나?) - 여자친구와 함께 식사를 했는데, 사소한 갈등이 있었다. 나는 체력이 없으면 조금 지치는 타입인 걸 다시 한번 더 느꼈다. 물론 오늘은 의사소통과 관련해 갈등이 있었는데, 평소였으면 금방 풀었을 것을 조금 길게 끌고 갔었다. - 사실 직전 악장은 아니고, 그 전과 아주 예전 악장이었는데 간만에 만나서 이야기를 나눴었다. 남자친구도 내가 연결해주려고 무척이나 애썼는데, 잘 연애하고 있는 것..
2023.03.24 -
아이템 51. 메서드 시그니처를 신중히 설계하라
아이템 51. 메서드 시그니처를 신중히 설계하라 개별 아이템으로 두기 애매한 API 설계 요령들을 모아놓은 챕터이다. 메서드 이름을 신중히 짓자. 메서드 이름은 항상 표준 명명 규칙(아이템 68)을 따라야 한다. 애매한 경우에는 자바 라이브러리의 API 가이드를 참조하는 것이 좋다. 다만 긴 이름은 피하는 것이 좋다. 편의 메서드를 너무 많이 만들지 말자. 모든 메서드는 각각 자신의 소임을 다해야한다. 메서드가 너무 많은 클래스는 문서화하고, 사용하고 테스트하고, 유지보수 하는 일에 어려움을 겪을 수 밖에 없다. 자신의 각 기능을 완벽히 수행하는 메서드로 제공을 해야하며, 편의 메서드는 확신이 서지 않는 이상 만들지 않는 것이 좋다. 매개변수 목록은 짧게 유지하자. 최대 4개까지만 전달받는 것을 추천한다..
2023.03.22 -
아이템 68, 항상 표준 명명 규칙을 따라야한다.
아이템 68, 항상 표준 명명 규칙을 따라야한다. 1. 철자 규칙 특별한 이유가 없는 한 철자 규칙은 반드시 따라야한다. 이 규칙을 어기게되면 API로 사용하기도 어려울 뿐더러 유지보수를 하기도 어렵다. 철자 규칙은 다음과 같은 종류가 있다. 패키지와 모듈 이름 패키지와 모듈 이름은 각 요소를 점(.)으로 구분하여 계층적으로 짓는다. 요소들은 모두 소문자 알파벳이나 숫자로 이뤄진다. 조직의 인터넷 도메인 이름을 역순으로 사용한다. ex) com.google 표준 라이브러리와 선택적 패키지들은 java와 javax로 시작한다. 패키지 이름의 각 요소는 일반적으로 8자 이하의 짧은 단어로 한다. 이때 약어를 사용하기도 한다. ex) utilities (x) → util (o) 요소의 이름은 한 단어나 각 단..
2023.03.08 -
아이템 15, 클래스와 멤버의 접근 권한을 최소화하라
아이템 15, 클래스와 멤버의 접근 권한을 최소화하라 정보 은닉은 각 컴포넌트가 외부에 의존하지 않고 독자적으로 동작할 수 있다는 점 때문에 다음과 같은 장점을 가지고 있다. 소프트웨어 재사용성을 높인다. 독립적인 컴포넌트는 다른 환경에서도 사용이 가능하다. 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬적으로 개발 가능하기 문이다. 시스템 관리 비용을 낮춘다. 디버깅과 컴포넌트 교체 부담이 적기 때문이다. 성능 최적화에 도움을 준다. 병목 현상이 발생하는 컴포넌트를 정해 다른 컴포넌트에 영향을 주지 않고 최적화할 수 있기 때문이다. 큰 시스템 제작 난이도를 낮춰준다. 개별 컴포넌트에 대한 단위 테스트를 해가며 큰 시스템을 개발할 수 있기 때문이다. 자바에서의 정보 은닉 자바에서는 정보 은닉을 위해 다..
2023.03.02 -
이펙티브 자바, 의존 객체 추입
아이템 05 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (1) 유연하지 않고, 테스트하기 어려운 클래스 정적 유틸리티를 잘못 사용한 예시 public class RacingGame { private static final List cars; private static final NumberGenerator numberGenerator = new RandomNumberGenerator(); private RacingGame() { // 객체 생성 방지} // ... 생략 private static void start() { cars.stream() .filter(car -> car.canMove(**numberGenerator.generate()**)) .forEach(Car::move); ..
2023.02.26