**메모리 누수**(memory leak)는 쉽게 말하면
**프로그램이 "이제 안 쓸 메모리인데, 돌려주지 않고 계속 가지고 있는" 현상**입니다.
### 비유로 가장 쉽게 이해하기
집에 책을 빌려왔다고 생각해봐요.
- 책을 읽기 위해 도서관에서 빌림 (메모리 할당)
- 다 읽고 나면 도서관에 반납해야 함 (메모리 해제)
- 근데 계속 책을 집에 쌓아두고 반납 안 하면? → 집에 책이 점점 쌓임
- 결국 책 놓을 공간이 없어서 새 책도 못 빌리고, 집이 엉망이 됨 (메모리 부족 → 프로그램 느려지거나 터짐)
이게 바로 메모리 누수예요.
### 실제로 어떤 일이 일어나나?
1. 프로그램이 필요해서 메모리를 빌림 (new, malloc, 객체 생성 등)
2. 다 썼는데 **잊어버리고 반납 안 함** (delete/free 안 함, 참조가 남아있음)
3. 그 메모리는 아무도 못 쓰는 상태로 계속 남아있음
4. 이런 일이 반복되면 → 사용 가능한 메모리가 점점 줄어듦
5. 결국 Out Of Memory(OOM) 에러 나거나, 프로그램이 매우 느려지거나 강제 종료됨
### 언어별로 누수가 잘/안 나는 경향
| 언어 | 메모리 관리 방식 | 메모리 누수 발생 난이도 | 주된 누수 원인 |
|---------------|----------------------------|--------------------------|---------------------------------------------|
| C | 수동 (malloc/free) | 매우 높음 | free() 까먹음 |
| C++ | 수동 + 스마트포인터 가능 | 높음 → 낮음 | delete 안 함, 순환 참조 |
| Java | 가비지 컬렉터 (GC) 자동 | 낮음 | 객체를 계속 참조하고 있음 (캐시, Listener) |
| Python | GC + 참조 카운팅 | 매우 낮음 | 순환 참조 + __del__ 문제 (드물게) |
| JavaScript | GC | 낮음 | 이벤트 리스너 제거 안 함, 클로저 누수 |
### 가장 흔한 메모리 누수 패턴 (현실 예시)
- 전역 변수나 캐시에 계속 객체를 쌓아놓음
- 이벤트 리스너 등록하고 제거 안 함 (특히 웹/모바일)
- 컨테이너(리스트, 맵)에 객체 계속 add만 하고 remove 안 함
- C/C++에서 포인터를 덮어쓰거나 스코프 밖으로 나가면서 free 안 함
결론적으로
메모리 누수는 **"빌린 걸 돌려주지 않는 습관"** 때문에 생기는 문제예요.
현대 언어들은 대부분 자동으로 처리해주려고 하지만, **참조를 계속 붙잡고 있으면** GC도 손을 못 대니까 여전히 조심해야 합니다.