전체 글 2408

[아이템 82] 쓰레드 안전성 수준을 문서화하라

한 메서드를 여러 쓰레드가 동시에 호출할 때, 해당 메서드가 어떻게 동작하는지는 해당 클래스와 이를 사용하는 클라이언트 간의 중요한 정보입니다. 이러한 정보가 API 문서에 포함되지 않으면 클래스 사용자는 이 관계를 추측해야 합니다. 그러나 이러한 추측이 틀릴 경우 클라이언트 프로그램은 동기화를 충분히 하지 못하거나 과도하게 동기화하여 성능 문제나 오류를 발생시킬 수 있습니다. 따라서 API 문서에 이러한 정보를 명시하는 것이 중요합니다. synchronized 한정자 API 문서에 synchronized 한정자가 있는 메서드는 안전하다고 간주하는 개발자들이 많은데, 이는 몇 가지 이유로 틀린 생각 메서드 선언에 synchronized 한정자를 선언할지는 구현 이슈일 뿐 API에 속하지 않기 때문에 Ja..

JAVA/Effective Java 2024.04.07

[아이템 81] wait와 notify보다는 동시성 유틸리티를 애용하라

wait(), notify(), notifyAll() 자바 5+ 버전에서 도입된 고수준의 동시성 유틸리티가 wait(), notify()로 하드 코딩해야 했던 일들을 대신 처리해 주기 때문에 현재는 wait()와 notify(), notifyAll() 메서드를 직접 호출해야 할 일이 많이 줄어듦 또한, wait()와 notify()는 올바르게 사용하기 까다롭기 때문에 java.util.concurrent의 고수준 동시성 유틸리티를 사용하는 것을 권장 고수준 동시성 유틸리티의 예는 다음과 같음 ExecutorService ConcurrentHashMap과 같은 Concurrent Collection Synchronizer 1. wait()와 notify()를 사용해야하는 케이스 새로운 코드라면 언제나 wa..

JAVA/Effective Java 2024.04.07

[아이템 80] 쓰레드보다는 실행자, 태스크, 스트림을 애용하라

실행자 프레임워크(Executor Framework) java.util.concurrent 패키지는 실행자 프레임워크(Executor Framework)라고 하는 인터페이스 기반의 유연한 태스크 실행 기능을 담고 있습니다. 과거에는 단순한 작업 큐(work queue)를 만들기 위해 수많은 코드를 작성했어야 했지만, 이제는 다음과 같이 간단하게 작업 큐를 생성할 수 있습니다. 1. 실행자 서비스(ExecutorService) 주요 기능 코드 부연 설명 get 메서드: 특정 태스크가 완료되기를 기다림 invokeAny 메서드: 태스크 모음 중 아무것 하나가 완료되기를 기다림 invokeAll 메서드: 모든 태스크가 완료되기를 기다림 awaitTermination 메서드: 실행자 서비스가 종료하기를 기다림 ..

JAVA/Effective Java 2024.04.07

[아이템 79] 과도한 동기화는 피하라

과도한 동기화는 다음과 같은 부작용을 초래합니다. 성능을 떨어뜨리고 Deadlock 상태에 빠드리고 심지어 예측할 수 없는 동작을 낳을 수 있음 응답 불가와 안전 실패를 피하려면 동기화 메서드나 동기화 블록 내 제어를 절대로 클라이언트에 양도하면 안 됩니다. 동기화된 클래스 관점에서, 다음과 같은 메서드들은 "외계인 메서드(alien method)"로 알려져 있는데, 이는 이러한 메서드들이 어떤 동작을 수행할지 확신할 수 없으며, 예외를 발생시키거나, 데드락 상태에 빠뜨리거나, 데이터를 손상시킬 수 있기 때문입니다. 동기화된 코드 블록 내 재정의 가능한 메서드 클라이언트가 전달한 함수 객체 외계인 메서드(Alien Method) 코드 부연 설명 관찰자들은 addObserver()와 removeObserv..

JAVA/Effective Java 2024.04.07

백준 2109번 순회강연

문제 링크입니다: https://www.acmicpc.net/problem/2109 2109번: 순회강연 한 저명한 학자에게 n(0 ≤ n ≤ 10,000)개의 대학에서 강연 요청을 해 왔다. 각 대학에서는 d(1 ≤ d ≤ 10,000)일 안에 와서 강연을 해 주면 p(1 ≤ p ≤ 10,000)만큼의 강연료를 지불하겠다고 알려왔다. www.acmicpc.net 문제의 핵심은 정확히 d일에 강연을 하는 것이 아니라 d일 안에 강연을 하는 것이었습니다. 알고리즘은 아래와 같습니다. 1. 주어진 p와 d를 d를 기준으로 오름차순으로 정렬합니다. 2. 최소힙을 생성하고 정렬된 순서대로 p를 힙에 넣어줍니다. 2.1 단, 힙의 크기가 넣어준 p의 쌍인 d를 초과할 경우, 힙 내에서 가장 작은 p값인 pq.to..

알고리즘/BOJ 2024.04.06

[Programmers] 특정 형질을 가지는 대장균 찾기

문제 링크입니다: https://school.programmers.co.kr/learn/courses/30/lessons/301646 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr MySQL을 이용하여 풀었습니다. 비트 연산을 이용하면 쉽게 풀 수 있는 문제였습니다. 개발환경: Programmers IDE 지적, 조언, 질문 환영합니다! 질문 남겨주세요~

[Programmers] 부모의 형질을 모두 가지는 대장균 찾기

문제 링크입니다: https://school.programmers.co.kr/learn/courses/30/lessons/301647 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr MySQL을 이용해 풀었습니다. 비트 연산을 통해 풀어야 하는 문제였습니다. [자식의 개체 형질] & [부모의 개체 형질] = [부모의 개체 형질]이어야 조건 성립 개발환경: Programmers IDE 지적, 조언, 질문 환영합니다! 질문 남겨주세요~

[Programmers] 대장균의 크기에 따라 분류하기 2

문제 링크입니다: https://school.programmers.co.kr/learn/courses/30/lessons/301649 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr MySQL을 이용하여 풀었습니다. 대장균의 크기 그룹을 NTILE 문법을 이용해 분류하고 분류한 결과를 토대로 COLONY_NAME을 부여했습니다. 개발환경: Programmers IDE 지적, 조언, 질문 환영합니다! 질문 남겨주세요~

[Programmers] 특정 세대의 대장균 찾기

문제 링크입니다: https://school.programmers.co.kr/learn/courses/30/lessons/301650 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 멸종위기의 대장균 찾기 문제와 같이 재귀 쿼리를 이용해 각 대장균의 세대를 정의한 테이블(ECOLI_GENERATIONS)을 정의 후 3세대에 포함된 ID들을 출력하는 문제였습니다. MySQL을 이용하여 풀었습니다. 개발환경: Programmers IDE 지적, 조언, 질문 환영합니다! 질문 남겨주세요~ 멸종기의 대장균 찾기

[Programmers] 멸종위기의 대장균 찾기

문제 링크입니다: https://school.programmers.co.kr/learn/courses/30/lessons/301651 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr MySQL을 이용하여 풀었습니다. 재귀 쿼리를 이용해 각 대장균의 세대를 정의한 테이블(ECOLI_GENERATIONS)을 정의합니다. 이후 세대 별로 타 대장균들의 부모가 아닌 대장균들을 출력합니다. ECOLI_GENERATIONS를 정의한 쿼리는 아래와 같습니다. 전체 코드는 다음과 같습니다. 개발환경: Programmers IDE 지적, 조언, 질문 환영합니다! 질문 남겨..