김시용
1. 📌 핵심 개념 정리
✅ 요약하기
- 주석은 나쁜 코드를 보완하지 못한다.
나쁜 코드에 주석을 달지마라. 코드를 다시 짜라
- 주석은 최대한 자제하기
주석으로 설명한 부분 함수로 만들어 표현 가능한지 살펴보기- 주석으로 설명하는 부분 (개선 전)
if ((employee.flags & HOURLY_FLAG) && (employee.age > 65))
- 함수로 표현한 부분 (개선 후)
if(employee.isEligibleForFullBenefits())
- 좋은 주석
- 정보를 제공하는 주석 (반환값 설명, 형식 등)
- 의도를 설명하는 주석 (저자가 문제를 해결한 방식 부분 - 저자의 의도)
- 결과를 경고하는 주석 (수행 시간이 긴 부분)
- TODO 주석 (해야할 작업 나타냄 - 당장 구현 어려운 부분, 누군가에게 요청할 사항 등)
- 중요성을 강조하는 주석 (빼먹으면 안되는 부분)
- Javadocs (너무 남용하면 안됨)
- 나쁜 주석
- 중복하는 주석 (함수 및 변수 이름 등으로 충분히 파악 가능한 내용을 설명 ex. 모든 component에 달린 Javadocs 주석)
- 오해할 여지가 있는 주석 (매 상황에 엄밀한 주석을 달지 못하므로)
- 의무적으로 다는 주석 (과도한 Javadocs 주석)
- 주석으로 처리한 코드 (존재의 이유를 모름 -> 중요한건가? -> 다른 사람들이 지우기 주저함)
- HTML주석 (IDE에서조차 읽기가 어려움)
- 비공개 코드에서 Javadocs (배포용이 아닌 시스템 내부에 속한 클래스와 함수에는 Javadocs 생성할 필요 없음)
2. 🤔 이해가 어려운 부분
🔍 질문하기
- 오해할 여지가 있는 주석
- 어려웠던 부분
// this.closed가 true일 때 반환되는 유틸리티 메서드다.
this.closed가 true로 변하는 순간에 메서드는 반환되지 않는다.
this.closed가 true여야 메서드가 반환된다.
해당 예제로 나왔던 위에 적은 코드 설명과 주석 설명이 이해가 잘 안됨 - 궁금한 점
// this.closed가 true일 때 반환되는 유틸리티 메서드다. // 타임아웃에 도달하면 예외를 던진다. public synchronized void waitForCloase(final long timeoutMillis) throws Exception { if(!closed) { wait(timeoutMillis); if(!closed) throw new Exception("MockResponseSender could not be closed"); } }
- 어려웠던 부분
- Javadocs 주석
- 어려웠던 부분
어느 정도로 달아야 하는가? 평소 프롬프트 요청을 통해 추가한 Javadocs 주석 정도는 괜찮은가? - 궁금한 점
적절한 함수명과 변수명 선정으로 코드를 읽으면 해당 함수의 기능을 파악할 수 있지만 Javadocs 주석이 해당 함수의 기능을 더 깔끔하게 설명하는 경우가 있는데 이러한 경우는 주석을 달아도 되는가? - 논의 하기
함수 자체로 기능이 잘 설명됨 vs 주석의 설명이 더 잘 와닿음
- 어려웠던 부분
3. 📚 참고 사항
에라스토테네스의 체 알고리즘
소수를 효율적으로 찾는 알고리즘으로, 특정 범위 내에서 소수를 빠르게 판별하는데 사용
이 알고리즘은 배수를 제거하는 방식으로 시간 복잡도는 O(NlogN)
- 알고리즘 동작 과정
- 2부터 N까지의 모든 정수를 포함하는 배열을 만든다.
- 2부터 시작하여 남아 있는 수 중에서 가장 작은 수를 소수로 판별한다.
- 그 소수의 배수들을 모두 제거한다.
- 다음으로 남아 있는 가장 작은 수를 선택하고 3번 과정을 반복한다.
- N의 제곱근(√N)까지만 반복하면 된다.
∵ 두 약수가 모두 √N 보다 클 수는 없기때문에
4 Comments
synchronized는 많이 사용되는가?
과거에는 synchronized가 멀티스레드 환경에서 동기화를 보장하는 기본적인 방법이었기 때문에 많이 사용되었지만, 최근에는 더 나은 대체제(ReentrantLock, Atomic 변수 등)가 많아지면서 사용 빈도가 줄어드는 추세다.
🔹 언제 synchronized를 사용할까?
✅ 간단한 동기화가 필요한 경우
✅ 성능 저하가 크지 않고, 데드락 가능성이 낮은 경우
✅ Java의 기본 동기화 메커니즘을 활용하고 싶은 경우
❌ 언제 synchronized를 피해야 할까?
🚫 고성능이 필요한 경우 → ReentrantLock 같은 고급 락을 사용
🚫 락을 오래 잡고 있어야 하는 경우 → synchronized는 락을 자동으로 해제하지 않음
🚫 공유 자원이 많고 복잡한 환경 → 데드락 발생 가능성이 높음
Javadoc을 적절히 다는 기준
함수 자체로 기능이 잘 설명됨 vs 주석의 설명이 가독성 면에서 더 잘 와닿음
책의 의견 - 함수 자체로 잘 설명되면 주석은 자제하자
의견. 저수준 기능에서는 javadocs 기능 달기 -> 고수준에서 커서 올려두면 해당 주석으로 설명 바로 볼 수 있기에
설명을 위한 Javadoc은 괜찮다고 생각합니다.
요즘처럼 AI가 코드 작성을 도와주는 시대에는 어려운 영단어가 코드에 포함된 경우 검색을 해야 하는 상황이 발생합니다.
따라서 검색하는 번거로움 없이 한글로 주석을 달아 이해도를 높이는 것이 효율적이라고 생각합니다.