매일 코드 카타라고 코딩문제를 1시간씩 풀고 있는데,
푸는 과정에서 새롭게 배웠고, 그리고 항상 헷깔려서 기억해야할 것을 정리했습니다.
Java에서 배열을 정렬할 때 가장 많이 사용하는 Arrays.sort()와 그 내부 동작 원리인 Comparator, compareTo를 정리합니다.
1. Arrays.sort() 기본 사용법
java.util.Arrays 클래스에서 제공하는 static 메소드입니다.
- 오름차순 정렬: Arrays.sort(배열)
- 내림차순 정렬: Arrays.sort(배열, Collections.reverseOrder())
String[] arr = {"Apple", "Orange", "Banana"};
Arrays.sort(arr); // [Apple, Banana, Orange] (사전순)
2. 정렬의 핵심: compareTo() 함수
문자열(String) 객체끼리 비교할 때 사용하는 함수입니다. s1.compareTo(s2)를 호출하면 정수값을 반환합니다.
- 반환값 < 0 (음수): s1이 s2보다 앞순서임 (작다)
- 반환값 == 0: 두 값이 같음
- 반환값 > 0 (양수): s1이 s2보다 뒤순서임 (크다)
팁: ASCII 코드 값의 차이를 반환한다고 생각하면 편합니다. a(97) - b(98) = -1 이므로 음수가 나옵니다.
3. 커스텀 정렬 (Comparator) 동작 원리
Arrays.sort()의 두 번째 인자에 내가 만든 함수를 넣으면, Java는 내부적으로 배열의 두 값(s1, s2)을 이 함수에 계속 집어넣어 비교합니다.
⭐️ 가장 중요한 규칙 (양수/음수)
Java의 정렬 알고리즘은 함수의 결과가 "양수(+)"일 때만 두 값의 자리를 바꿉니다.
| 비교 결과 (s1, s2) | 반환값 | 의미 | 결과(Action) |
| 음수 (-) | s1 < s2 | 왼쪽이 더 작음 | 그대로 유지 |
| 양수 (+) | s1 > s2 | 왼쪽이 더 큼 | 자리 바꿈 (Swap) |
그리고 오늘 Spring 특강이있었는데, 아는 내용도 있었지만 몰랐던 거나 정리가 필요했던 부분들이 있었습니다.
정리해보았습니다.
1. 오늘의 학습 키워드
- HTTP 파라미터: 데이터가 전달되는 위치에 따른 구분 (Path Variable vs Request Param)
- 빈 스코프 (Bean Scope): 스프링 빈이 생성되고 살아있는 범위
- 싱글톤 (Singleton): 스프링의 기본 객체 관리 방식과 효율성
- 무상태 설계 (Stateless): 공유 객체 사용 시 주의해야 할 객체 설계 원칙
2. 핵심 키워드 상세 정리
🚦 Path Variable vs Request Param
두 방식 모두 클라이언트가 서버로 데이터를 보낼 때 사용하지만, **'목적'**이 다릅니다.
=> 사실 path로 구현하는걸 requestParam으로도 구현할 수 있는데, 국룰? 같은게 있다고 해서 궁금해서 찾아봤습니다.
- Path Variable (@PathVariable)
- URL 경로의 일부를 변수로 사용합니다.
- 자원(Resource)의 **식별자(ID)**를 나타낼 때 주로 사용합니다. (예: /users/10 → 10번 유저라는 '정체성')
- Request Param (@RequestParam)
- URL 뒤에 ?key=value 형태로 붙는 쿼리 파라미터를 사용합니다.
- 데이터를 정렬(Sort), 검색(Search), 필터링하는 부가 옵션을 보낼 때 적합합니다. (예: /users?sort=age → 유저 목록 중 '나이순'이라는 '조건')
🌱 빈 스코프 (Bean Scope)
빈 스코프란 빈이 생성되어 소멸하기까지 존재할 수 있는 범위를 말합니다.
- 의미: 빈이 몇 개 만들어지는지, 그리고 얼마나 오래 살아있는지를 결정합니다.
- 종류: 기본값인 싱글톤 외에도 프로토타입(Prototype), Request, Session 스코프 등이 있습니다.
💎 왜 싱글톤(Singleton)이 기본인가?
스프링은 기업용 대규모 시스템을 위해 만들어졌습니다. 매번 요청이 올 때마다 새로운 객체를 만들면 메모리 부하가 엄청나기 때문에, 하나만 만들어 공유하는 방식을 취합니다.
- 이유: 대부분의 서비스(Service)와 리포지토리(Repository)는 로직만 수행할 뿐, 상태를 저장하지 않는(Stateless) 객체이기 때문입니다. 하나만 만들어서 여러 사람이 동시에 호출해도 문제가 없습니다.
⚠️ 싱글톤 사용 시 주의점 (무상태 설계)
여러 클라이언트가 하나의 객체 인스턴스를 공유하기 때문에 필드(Member Variable)에 상태를 저장하면 절대 안 됩니다.
- 위험: 특정 사용자만 수정해야 할 값을 클래스 변수(필드)에 담아두면 다른 사용자에게 노출되거나 값이 덮어씌워질 수 있습니다.
- 해결: 필드 대신 지역 변수, 파라미터, ThreadLocal 등을 사용하여 독립적인 값을 유지해야 합니다.
'Study' 카테고리의 다른 글
| [내일배움캠프 TIL] 10일차 - uuid, erd표기법, Transaction (1) | 2026.04.17 |
|---|---|
| [내일배움캠프 TIL] 9일차 - Controller 단에서 로직 분리 실습 1 (0) | 2026.04.16 |
| [내일배움캠프] MSA 강의 총 정리 (0) | 2026.04.15 |
| [내일배움캠프 TIL] 7일차 - entity 연관관계 (0) | 2026.04.14 |
| [내일배움캠프 TIL] 6일차 - Entity, 영속성 등 복습 (0) | 2026.04.13 |