전체 글 2411

[아이템 57] 지역변수의 범위를 최소화하라

이번 아이템은 아이템 15에서 다루었던 `클래스의 멤버와 접근권한을 최소화하라`와 취지가 비슷합니다. 지역 변수의 범위를 최소화하면 코드의 가독성이 높아지고 유지보수가 쉬워지며 오류 발생 가능성이 낮아집니다. 지역변수는 가장 처음 쓰일 때 선언하자 지역 변수가 초기화된 지점과 사용되는 지점이 멀어질수록 코드의 가독성이 떨어지고 혼란스러워짐. 막상 쓰일 시점에 돼서는 해당 지역변수가 무슨 타입이었는지, 무슨 값으로 초기화했는지 기억이 나지 않을 가능성이 높음 지역변수를 생각 없이 선언하다 보면 변수가 쓰이는 범위보다 너무 앞서 선언하거나, 다 쓴 후에도 메모리 회수가 되지 않고 여전히 살아있을 확률이 높음 지역변수의 범위는 선언된 지점부터 그 지점이 포함한 블록이 끝날 때까지 유효 실수로 의도한 범위 앞 ..

JAVA/Effective Java 2024.03.16

백준 17298번 오큰수

문제 링크입니다: https://www.acmicpc.net/problem/17298 17298번: 오큰수 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다. www.acmicpc.net N의 최대 범위가 백만이기 때문에 O(N^2)으로는 풀 수 없는 문제였습니다. 알고리즘은 아래와 같습니다. 1. 원소 Ai에 대해 오큰수 페어를 지정해 주는 문제이므로 자료구조 스택을 이용했습니다. 2. 수열을 순회하며 다음과 같은 작업을 진행합니다. 2.1 스택이 비어있지 않을 경우 현재 원소와 스택의 top()과 비교합니다. 2.1.1 스택의 top()보다 현재 원소가 클 경우 스택의 ..

알고리즘/BOJ 2024.03.15

[Java] 동기화 도구

개요 앞선 게시물을 읽고 오시는 것을 추천드립니다! https://jaimemin.tistory.com/2411 [Java] Lock, ReentrantLock, ReadWriteLock, ReentrantReadWriteLock 개요 앞선 게시물을 읽고 오시는 것을 추천드립니다! https://jaimemin.tistory.com/2409 [Java] synchronized, wait() & notify(), volatile, Deadlock 개요 앞선 게시물을 읽고 오시는 것을 추천드립니다! https://jaimemin.tist jaimemin.tistory.com CAS(Compare and Swap) 멀티 쓰레드 환경에서 락을 사용하지 않고도 공유 변수의 값을 원자적으로 변경하는 방법 제공 CP..

JAVA/RxJava 2024.03.14

백준 2870번 수학숙제

문제 링크입니다: https://www.acmicpc.net/problem/2870 2870번: 수학숙제 종이에서 찾은 숫자의 개수를 M이라고 하면, 출력은 M줄로 이루어져야 한다. 각 줄에는 종이에서 찾은 숫자를 하나씩 출력해야 한다. 이때, 비내림차순으로 출력해야 한다. 비내림차순은 내림차 www.acmicpc.net 간단한 문자열 처리 문제였습니다. 주의할 점은 숫자가 최대 100자리 즉, long long 자료형으로도 커버 안 되는 숫자가 주어질 수 있기 때문에 문자열을 통해 숫자 비교하는 정렬 메서드를 직접 구현해야 합니다. 개발환경:Visual Studio 2022 지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

알고리즘/BOJ 2024.03.13

백준 2910번 빈도 정렬

문제 링크입니다: https://www.acmicpc.net/problem/2910 2910번: 빈도 정렬 첫째 줄에 메시지의 길이 N과 C가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ C ≤ 1,000,000,000) 둘째 줄에 메시지 수열이 주어진다. www.acmicpc.net map의 특성을 이용하여 visited 배열과 같이 사용하면 메모리 초과가 발생하지 않고 쉽게 풀 수 있는 문제였습니다. 개발환경:Visual Studio 2022 지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

알고리즘/BOJ 2024.03.13

백준 4659번 비밀번호 발음하기

문제 링크입니다: https://www.acmicpc.net/problem/4659 4659번: 비밀번호 발음하기 좋은 패스워드를 만드는것은 어려운 일이다. 대부분의 사용자들은 buddy처럼 발음하기 좋고 기억하기 쉬운 패스워드를 원하나, 이런 패스워드들은 보안의 문제가 발생한다. 어떤 사이트들은 xvtp www.acmicpc.net 문제에서 주어진 조건대로 구현하면 되는 간단한 문제였습니다. 개발환경:Visual Studio 2022 지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

알고리즘/BOJ 2024.03.13

[아이템 56] 공개된 API 요소에는 항상 문서화 주석을 작성하라

API를 유용하게 활용하려면 명확하고 완성도 높은 문서 작성이 필요합니다. 일반적으로 API는 직접 작성되기 때문에 코드 수정 시 문서도 함께 업데이트해야 합니다. 이러한 불편한 작업을 피하기 위해 Java에서는 JavaDoc이라는 유틸리티가 도움을 줍니다. 문서화 주석을 작성하는 규칙은 공식 언어 명세에 속하진 않지만 자바 개발자라면 반드시 알아야 하는 업계 표준 API라 할 수 있습니다. 문서화 주석을 작성하는 규칙은 Oracle 홈페이지에 잘 정리되어 있지만 자바 4 버전 이후로 갱신되어 있지 않기 때문에 자바 5의 @literal과 @code, 자바 8의 @implSpec, 자바 9의 @index 관련 내용은 별도로 기재되어 있지 않음 모든 공개된 리소스에 문서화 주석을 달자 API를 올바로 문서..

JAVA/Effective Java 2024.03.13

[SpringBoot] JPA 쿼리 성능 감시 가이드

개요 팀 내 JPA 쿼리 성능 감시 가이드를 작성하는 업무를 맡은 김에 간단하게 다음 항목을 정리해 보겠습니다. JPA slow 쿼리 검출 JPA N + 1 문제가 의심되는 api 검출 JPA N + 1 문제가 의심되는 api의 경우 범고래님 블로그를 많이 참고했습니다! 감사합니다. 프로젝트 환경 SpringBoot 2.6.3 Java 1.8 Jpa slow 쿼리 검출 application.yml에 다음과 같이 설정을 하면 Hibernate에서 slow query를 로깅해 줍니다. 테스트 삼아 100ms를 기준으로 잡았고 그 결과 실행시간이 205ms인 SELECT 쿼리가 아래와 같이 로깅되었습니다. 오래 걸린 쿼리를 로깅하는 것 자체는 좋았지만 구현한 JpaRepository가 워낙 많다 보니 검출된 ..

[DEV] 기록 2024.03.12

[아이템 55] 옵셔널 반환은 신중히 하라

자바 7 버전까지는 메서드가 특정 조건에서 값을 반환할 수 없을 때 취할 수 있는 선택지가 다음과 같이 두 가지였습니다. 예외를 던지거나 null을 반환 1. 예외를 던질 때 예외는 반드시 예외적인 상황에서만 던져야 함 e.printStackTrace()와 같이 스택 추적 전체를 캡처하는 것은 비싼 작업이므로 지양해야 함 2. null을 반환 null을 반환할 수 있는 메서드를 호출할 때는 별도의 null 처리 코드를 추가해야 함 null을 반환하는 경우 항상 NPE를 조심해야 함 자바 8+ 버전부터는 위 두 가지 선택지 외 Optional이라는 또 하나의 선택지가 추가되었습니다. Optional Optional는 null이 아닌 T 타입 참조를 하나 담거나, 혹은 아무것도 담지 않을 수 있는 객체 참조..

JAVA/Effective Java 2024.03.12

[아이템 54] null이 아닌, 빈 컬렉션이나 배열을 반환하라

null을 반환하지 말자 다음 코드와 같이 컬렉션이 비어있으면 null을 반환하는 경우가 있습니다. 위 코드와 같이 null을 반환하는 경우, 클라이언트는 다음 코드와 같이 null 체크 후 적절히 처리하는 코드를 추가해야 합니다. 특히, getCheeses() 메서드와 같이 컬렉션이나 배열과 같은 컨테이너가 비었을 때 null을 반환할 경우 클라이언트는 항시 위와 같이 방어 코드를 넣어줘야 합니다. 클라이언트에서 방어 코드를 누락하면 오류가 발생할 수 있으며, 객체가 0개일 가능성이 희박한 상황에서는 엣지 케이스가 발생할 때까지 코드에서 오류를 인지하기 어려울 수 있습니다. 빈 컨테이너를 반환하는 것보다 null을 반환하는 것이 더 낫지 않나? 소제목처럼 때로는 빈 컨테이너를 할당하는 행위도 비용이 드..

JAVA/Effective Java 2024.03.11