본문 바로가기

전체 글46

[ Java ] HashSet 시리즈2 - contains()가 O(n)까지 느려진다고? 2026.09.16 - [분류 전체보기] - [ Java ] HashSet 시리즈1 - 중복 검사도 검색도 무조건 O(1)일까? 이전 글에 이어서 hashSet을 뚜드려 패보도록 하겠습니다 트리가 되면 무조건 O(log n)일까?여기서 한 번 더 생각해봐야 합니다.높이가 낮다는 사실과, 검색할 때 한쪽으로만 내려갈 수 있다는 사실은 다릅니다.예를 들어 현재 노드를 보고 왼쪽인지 오른쪽인지 결정할 수 있다면, 하나의 경로만 따라가면 됩니다.하지만 어느 쪽인지 판단할 수 없다면?양쪽을 찾아봐야 할 수도 있습니다.HashMap의 트리 탐색은 우선 해시를 비교합니다. 해시가 같으면 같은 키인지 확인하고, 적합한 Comparable 비교로 방향을 정할 수 있는지도 확인합니다.그런데 아래 조건이라면 문제가 됩니다.. 2026. 9. 17.
[ Java ] HashSet 시리즈1 - 중복 검사도 검색도 무조건 O(1)일까? 코테를 풀다 보면, 어떤 값이 이미 존재하는지 확인해야 하는 경우가 정말 많습니다.리스트로 하나씩 확인하면 느릴 것 같으니, 보통 HashSet을 사용하죠.Set visited = new HashSet();visited.add(10);System.out.println(visited.contains(10)); // trueHashSet의 add()와 contains()는 O(1).그런데 문득 이런 생각이 들지 않나요?“값이 엄청 많아져도 무조건 한 번에 찾는 건가?”“서로 다른 값이 같은 위치에 들어가면 어떻게 하지?”흠.. 해시를 사용하니까 빠르다는 건 알겠는데, 그것만으로는 설명이 조금 부족합니다.이번에는 HashSet이 값을 찾는 과정부터, 내부에 레드블랙 트리가 등장하는 이유까지 살펴보겠습니다!Ha.. 2026. 9. 17.
[ Java / Spring Boot ] 서비스 객체는 하나인데, 여러 요청을 동시에 처리해도 괜찮을까? Spring Boot에서 서비스를 만들 때 보통 이렇게 작성한다.@Servicepublic class OrderService { // 주문 처리}별도의 스코프를 지정하지 않았다면 이 빈은 기본적으로 싱글톤이다.그런데 여기서 조금 이상한 생각이 든다.“객체가 하나면 요청도 하나씩 처리하는 건가?”“여러 사람이 동시에 호출하면 데이터가 섞이지 않나?”하나의 객체를 여러 스레드가 동시에 사용할 수 있다.그리고 코드를 어떻게 작성했느냐에 따라 데이터가 섞일 수도 있다.(싱글톤이라고 Spring이 줄을 세워주는 건 아니었다.)1. 싱글톤은 정확히 무엇이 하나라는 뜻일까?Spring의 싱글톤 스코프는 기본적으로 컨테이너 하나에서 빈 정의 하나당 인스턴스 하나를 공유한다는 뜻이다.특정 클래스의 객체가 프로그램 .. 2026. 9. 16.
[ Java ] 메서드는 하나 만들었는데, 컴파일하면 두 개가 된다고? 자바에서 제네릭을 공부하다 보면 이런 설명을 보게 된다.“제네릭 타입은 컴파일할 때 소거된다.”그렇구나 하고 넘어갔는데, 생각해보니 조금 이상하다.T가 Object로 바뀐다면, T 대신 String을 받도록 구현한 메서드는 어떻게 연결되는 걸까?이번에는 이 과정에서 컴파일러가 만들어주는 **브리지 메서드(Bridge Method)**를 살펴보자.내가 작성하지 않은 메서드가 클래스에 들어가 있다.(누가 넣었나 했더니 컴파일러였다.)1. 분명히 메서드는 하나만 작성했는데?간단한 인터페이스를 만들어보자.interface Receiver { void receive(T value);}그리고 문자열을 받는 클래스를 구현한다.class TextReceiver implements Receiver { @Ove.. 2026. 9. 16.
[ Java / Spring Boot ] @Transactional 붙였는데 데이터가 왜 남아있지? Spring Boot로 개발하다 보면 트랜잭션이 필요한 메서드에 자연스럽게 @Transactional을 붙이게 된다.중간에 예외가 터지면 롤백되겠지?그런데 분명히 어노테이션도 붙였고 예외도 발생했는데, DB를 열어보니 데이터가 그대로 남아 있다면?이번에는 이 상황을 직접 실행해봤다.똑같은 INSERT와 똑같은 예외를 사용했는데, 메서드를 어떻게 호출했는지에 따라 결과가 달라졌다.1. 일단 데이터를 넣고 예외를 터뜨려보자실험 환경은 다음과 같다.Java 21.0.6Spring Boot 3.2.5 / Spring Framework 6.1.6H2 2.2.224 메모리 DBJdbcTemplate + DataSourceTransactionManager이번에는 Spring이 트랜잭션을 적용하는 호출 경로에 집중하기.. 2026. 9. 15.
[ Python ] 기본값에 []를 넣었는데, 왜 이전 데이터가 남아 있을까? 파이썬에서 함수를 만들 때, 기본값을 지정하면 편합니다.def greet(name="우당탕탕"): print(f"안녕하세요, {name}님!")인자를 생략하면 기본값을 사용합니다.그렇다면 리스트도 이렇게 작성하면 되지 않을까요?def add_item(value, items=[]): items.append(value) return items리스트를 전달하지 않으면 빈 리스트에 추가하겠다는 뜻처럼 보입니다.그런데 두 번 호출하면 조금 이상해집니다.먼저 결과부터 보겠습니다print(add_item("A"))print(add_item("B"))기대했던 결과는 다음과 같습니다.['A']['B']실제 결과는?['A']['A', 'B']앞에서 넣었던 A가 남아 있습니다.(함수가 기억력이 좋네요..)이.. 2026. 9. 15.