본문 바로가기
  • 개발공부 및 일상적인 내용을 작성하는 블로그 입니다.
부트캠프/후기 챌린지

[멋쟁이사자처럼부트캠] 백엔드 자바 21기 (2026.01.09)

by 방구석 취준생 2026. 1. 9.

* 해당 글은 백엔드 자바 강의이후 회고 글입니다.

https://bootcamp.likelion.net/school/kdt-backendj-21th

 

백엔드 부트캠프 21기: Java : 멋사 부트캠프

실전 스킬 기반 백엔드 개발자 취업 완벽 대비 교육

bootcamp.likelion.net

 

1월 8일 내용 간단한 복습

1. 자바의 기본 데이터 타입과 참조 데이터 타입을 이해하고 변수로 선언하여 활용

- 기본 자료형은 값 자체를 저장하고 크기가 고정되어 있다.(byte(2byte), int(4byte) 등등..)

- 참조형은 객체의 주소를 저장하고 new 로 생성된다.

- 기본자료형, 참조형은 메모리 저장방식과 사용목적이 다르다.

- 기본자료형 변수 : JVM의 stack 영역에 저장된다. 지역변수로서 선언되었을 시 메서드가 호출될 때 생성되고 메서드 종료 시 사라진다.

- 참조형(객체) 변수 : 객체의 참조값, 즉 주소값은 stack에 저장되고 실제 객체 데이터는 heap 영역에 저장된다. 쉽게 말해 이 객체를 찾을때는 stack 영역에 저장되어 있는 주소값을 보고 heap 영역에서 해당 주소를 찾아가서 실제 객체 데이터를 찾아오는 방식으로 동작한다.

 

2. 변수의 역할과 범위(Scope) 에 대한 이해

- 지역변수 : 메서드 안에 선언된다. 명시적으로 값을 초기화해주어야 한다.

- 매개변수 : 메서드를 호출할 때 값을 메서드 측에 전달해주는 역할이다.

- 전역(멤버)변수 : 클래스 안에 선언되고 객체 생성 시 자동으로 초기화된다.

 

메서드 오버로딩은 저번 글에서 워낙 자세하게 다뤄서 일단 넘어가자.

 

1월 9일 학습내용중 중요했던 점

사실 각종 연산자나 삼형 연산자 같은건 계속 코딩을 하다보면 많이 사용하게 되서 자연스럽게 익숙해지는 부분이 있기 때문에 굳이 정리하지 않더라도 아래의 내용은 꼭 따로 정리를 해야겠다는 생각이 들 정도로 중요했었다.

 

* String pool

일단 아래의 코드를 한번 보자.

String str = "java";
String str02 = "java";

System.out.println(str == str02);
System.out.println(str.equals(str02));

 

강의중 작성된 위의 코드를 보고 처음엔 첫번째 출력문에서 false, 두번째 출력문에서 true 가 나올거라 생각했다.

왜냐하면 String 자료형 타입은 객체로서 동작하기 때문인데 보통 new 키워드를 통해 똑같은 클래스의 객체를 생성했다고 해도

== 연산자를 통해 비교를 해보면 각 객체가 메모리 상에서 서로 다른 주소에 할당되기 때문에 false 를 반환받기 때문이다.

 

String 객체또한 같은 논리로 같은 값을 가지고 있다고해도 동등 연산을 수행하면 false 를 반환할 줄 알았더니 그게 아니라 true 를 반환했다.

아무래도 전에 자바 공부를 할 때 헛으로 공부 했었나보다.

 

일반적인 다른 객체와는 달리 같은 값을 가지고 있는 String 객체끼리 동등 연산을 수행할경우 true 를 반환해주는 이유는 바로 JVM 의 String pool 때문이었다.

 

- 문자열 리터럴을 재사용하기 위해 JVM은 heap 영역에 String pool 을 가지고있다.

- 동일한 문자열 리터럴은 한번만 생성된다. 이로인해 여러변수가 같은 객체(메모리 주소)를 공유하게 된다.

 

위의 코드에서 객체끼리 == 연산을 할 경우 값을 비교하는 것이 아니라 주소를 비교하게 되는데 여기서 자바의 문자열 객체 String 의 경우 JVM String pool 을 사용하기 때문에 서로 다른 변수로서 선언됐음에도 불구하고 같은 값을 가지고있기 때문에 heap 메모리 영역에서 서로 같은 메모리 주소를 참조했다.

그렇기 때문에 str, str02 는 모두 같은 주소를 가리키고 있으므로 str == str02 의 결과가 true 가 되는것이다.

 

참조 : https://f-lab.kr/insight/understanding-java-string-pool?gtm_latency=1

 

자바의 스트링 풀(String Pool) 이해하기

자바의 스트링 풀 작동 원리와 가비지 컬렉션과의 관계를 통해 메모리 사용 최적화와 프로그램 성능 향상 방법을 알아봅니다.

f-lab.kr

 

위의 참조글에서 나와있는바와 같이 이렇게 String pool 을 사용하면 동일한 문자열 리터럴에 대한 중복 생성(같은 값을 가지고있는 메모리 중복 생성)을 방지하고 메모리 사용을 최적화할 수 있게된다.

- 자바에서 문자열 리터럴은 불변(immutable) 이기 때문에 한번 생성된 문자열은 변경되지 않고 재사용될 수 있다.

- 이런 특성 덕분에 String pool 은 메모리 사용량을 줄이고 프로그램의 성능을 향상시키는데 기여할 수 있다. 

 

String pool 의 작동원리

  • 자바에서 문자열은 크게 두 가지 방식으로 생성될 수 있다 .첫번째는 문자열 리터럴을 사용하는 방식이고, 두번째는 new String() 을 사용하는 방식이다. 이 두 방식은 내부적으로 문자열 객체를 생성하는 과정이 다르다.
  • 문자열 리터럴을 사용하여 문자열을 생성할 경우 JVM 은 먼저 String pool 을 확인하여 동일한 문자열이 존재하는지 검사한다.
  • 만약 String pool에 동일한 문자열이 존재한다면 해당 문자열의 객체의 참조값(기존에 존재하던 데이터)을 반환하고, 존재하지 않는다면 새로운 문자열 객체를 생성하여 String pool 에 추가한 후 그 참조값을 반환한다.
  • 반면 new String() 을 사용하여 문자열을 생성할 경우 매번 새로운 문자열 객체가 생성된다. 
  • 이는 바로 new 키워드 때문이다. new 는 항상 메모리상에 새로운 객체를 생성하는 방식으로 동작한다. 이 경우 생성된 문자열 객체는 String pool 에 추가되지 않고 heap 메모리의 다른 영역에 저장된다.
  • 이러한 차이로 인해 문자열 리터럴을 사용하는 것이 메모리 사용과 성능 측면에서 효율적이다.(객체의 재사용 가능)

String pool 과 GC(Garbage Collection)

  • String pool 은 GC 의 처리대상이 될 수 있다. String pool은 JVM 의 heap 영역에 존재함으로서 heap 메모리의 일부로 관리되기 때문에 더 이상 사용되지 않는 문자열 객체는 GC 에 의해 수집될 수 있다.
  • String pool 의 문자열 객체도 GC에 의해 정리될 수 있으므로 메모리 누수를 방지하고 메모리 사용을 최적화 할 수 있게된다.