[JAVA] Comparable과 Comparator에 대하여
·
자바
컬렉션을 다룰 때 객체를 정렬하는 일은 자주 발생한다.예를 들어 List가 있다고 가정해보자. 이 리스트를 이름순으로 정렬하거나, 나이순으로 정렬하거나, 가입일 순으로 정렬할 수도 있다. 하지만 여기서 한 가지 문제가 있다. 자바는 int, String, double 같은 기본 타입은 어떤 값이 큰지, 작은지를 알고 있어서 정렬이 가능하다. 하지만 사용자가 정의한 클래스, 예를 들어 User 같은 객체는 어떤 속성을 기준으로 비교해야 하는지 알지 못하기 때문에 기본적으로 정렬이 불가능하다.이 문제를 해결하기 위해 자바는 두 개의 비교 인터페이스를 제공한다.ComparableComparator두 인터페이스 모두 객체 간의 대소 비교를 가능하게 하지만, 사용 방식과 의도는 분명히 다르다. 지금부터 각각의 특..
[JAVA] Map 인터페이스에 대하여 (4)
·
자바
자바에서 데이터를 다루는 컬렉션(Collection)은 세 가지 축으로 구성된다: List, Set, Map. 이 중 Map은 가장 실용적이고 많이 쓰이지만, 동시에 가장 오해가 많은 컬렉션이기도 하다. 많은 개발자들이 Map을 단순히 "키-값 저장소" 정도로 인식하고 사용하지만, 내부 구조나 구현 방식에 대한 이해 없이 사용하면, 중복 저장, 순서 오류, 정렬 실패 등 의도치 않은 결과를 마주하게 된다. 특히 Set을 학습한 사람이라면 "Set은 고유한 값만 저장하는데, Map은 키가 Set처럼 동작하고, 값이 하나 더 붙은 형태구나"라고 이해하면 비교적 쉽게 접근할 수 있다. 이번 글에서는 Map이 어떤 구조로 동작하며, 왜 Entry라는 개념이 필요한지, 그리고 대표적인 구현체인 HashMap, L..
[JAVA] Set 인터페이스에 대하여 (3)
·
자바
대부분의 자바 개발자라면 Set을 "중복을 허용하지 않는 컬렉션"이라고 알고 있다. 하지만 실무에서 이를 제대로 활용하려면 Set 내부가 어떻게 동작하는지, 왜 해시 알고리즘을 사용하는지, 그리고 hashCode()와 equals()를 왜 꼭 오버라이딩해야 하는지를 정확히 이해해야 한다. 이번 글에서는 단순히 사용하는 수준을 넘어, Set 내부 구조와 해시 기반 탐색 방식, 그리고 대표 구현체들의 차이까지 정리해본다. 1. Set이란?Set은 자바 컬렉션 프레임워크에서 중복되지 않는 객체들의 집합을 의미한다.한 번 추가한 값은 다시 추가되지 않으며, 저장 순서를 보장하지 않는 것이 일반적이다. 대표적으로 HashSet, LinkedHashSet, TreeSet이 있다.중복 허용 X순서 보장 X (Tree..
[JAVA] List에 인터페이스에 대하여 (2)
·
자바
지난 글에서는 MyArrayList와 MyLinkedList를 직접 구현해보았다. 단순히 구현해보는 것만으로는 부족하다. 실제로 얼마나 성능 차이가 나는지, 자바는 왜 더 빠른지, 구조가 어떻게 다른지까지 알아야 진짜 실력을 키울 수 있다. 이번 글에서는 직접 구현한 리스트와 자바의 ArrayList, LinkedList를 비교 실험을 통해 차이점과 이유까지 하나하나 풀어본다. 1. 자바의 List는 인터페이스이다먼저 개념부터 잡고 가자.자바에서 List는 인터페이스(interface) 이다. 즉, 기능의 틀만 정해놓고, 실제 구현은 하지 않은 것이다. List는 순서가 있는 데이터를 저장하고 중복을 허용하는 자료 구조이며, 대표적인 구현체는 아래와 같다:List arrayList = new ArrayL..
[JAVA] 배열의 단점과 ArrayList, LinkedList 비교 (1)
·
자바
자바에서 배열은 가장 손쉽게 데이터를 담는 방법이다. new String[5]처럼 선언 한 번으로 바로 메모리를 잡아주고, arr[2]로 빠르게 요소를 꺼낼 수 있다. 그러나 실제 서비스 규모가 커지면 배열의 한계가 금세 드러난다. 예를 들어 주문 내역을 배열에 담아 관리한다고 가정하자. “최대 10만 건”이라 미리 크기를 잡아두었는데, 주문량이 15만 건으로 늘어나면 새 배열을 만들고 기존 데이터를 전부 복사해야 한다. 이 과정은 O(n)의 시간이 들기 때문에, n이 커질수록 서버 부담이 커진다. 반대로 주문량이 적으면 사용되지 않는 공간이 낭비된다. 중간에 어떤 주문을 삭제해야 할 때는 그 뒤의 모든 요소를 한 칸씩 앞으로 당겨야 한다. 천만 건 단위라면 삭제 한 번에 천만 번 이상의 대입 연산이 발..
[JAVA] 예외 처리4 -실무
·
자바
이번 장에서는 실무에서 예외 처리를 어떻게 하면 좋을지 알아볼 것이다. 자바는 예외를 크게 체크 예외와 언체크 예외로 나눈다. 이 중 체크 예외는 컴파일 타임에 반드시 throws 선언이나 try-catch로 처리해야 하도록 강제된다. 처음에는 안정성과 신뢰성 측면에서 좋은 설계처럼 보이지만, 실무 환경에서는 오히려 과도한 예외 처리 부담과 코드 오염의 원인이 되기도 한다. 1. 예외를 잡아도 복구할 수 없는 상황 가장 대표적인 예는 외부 시스템과 연동할 때 발생한다. 예를 들어, 네트워크 서버에 메시지를 전송하거나 데이터베이스에 연결하는 과정에서 서버가 꺼져 있거나 응답이 지연되는 문제가 발생할 수 있다. 이런 경우 애플리케이션 내부에서 해당 예외를 잡아도 복구 방법이 없다. 연결을 재시도하더라도 같은..