**메모리 누수**(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도 손을 못 대니까 여전히 조심해야 합니다.