[TIL 26/02/04] (Java)(2) 데이터타입(기본형, String)
2026. 2. 4. 16:55
자바 변수의 종류

 

선언위치 변수명 설명
클래스 영역 클래스 변수
(class variable)
클래스 영역에서 static이 붙는 변수
객체를 공유하는 변수로 여러 객체에서 공통으로 사용하고 싶을 때 정의
인스턴스 변수
(instance variable)
클래스 영역에서 static이 아닌 변수
개별적인 저장 공간으로 객체/인스턴스마다 다른 값 저장 가능

 생성만 하고 사용되는 곳이 없는 경우 가비지 컬렉터에 의해 제거됨
메서드 영역 지역 변수
(local variable)
메서드 내에서 선언되고 메서드 수행이 끝나면 소멸되는 변수
매개 변수
(parameter)
메서드 호출 시 전달하는 값을 가지고 있는 인수

 

기본 타입 (primitive type)

 

자바의 기본형 변수 타입은 아래와 같이 정의되어 있다.

  변수 타입 기본값 범위
정수형 byte 0 -128 ~ 127
short 0 -32,768 ~ 32,767
int 0 -2,147,483,648 ~ 2,147,483,647
long 0L -9,223,372,036,854,775,808 ~
9,223,372,036,854,775,807
실수형 float 0.0f (-3.4*10^38) ~ (3.4*10^38) 
double 0.0 (-1.79*10^308) ~ (1.79*10^308)
문자형 char  '\u0000'  0 ~ 65,535 (유니코드)
논리형 boolean false  true, false

 

 

기본타입으로 선언된 변수는 실제 할당한 값이 변수에 직접 저장된다.

지역변수는 반드시!! 초기화 후 사용해야 한다.

 

 

 

 

참조 타입 (reference type)

 

  • String(문자열)

 

String 변수는 기본형 타입이 아니라 참조형 변수이기 때문에 String을 통해 문자열을 선언하면 변수에 값이 직접 저장되는 것이 아니다.

해당 문자열은 heap 영역에 String 객체로 생성이 되어 String 변수는 해당 객체를 참조한다.

 

오늘 알게 된 것이 있는데 

String name1 = "taeu";
String name2 = "taeu";
System.out.println(name1 == name2);

//출력 : true

 

이 코드의 결과가 당연히 false일 거라고 생각했다.

하지만 자바에서 먼저 선언한 String 객체의 값과 똑같이 String 변수를 선언하면 같은 객체를 참조하게 된다.

이는 String 리터럴이 Heap 영역의 String Constant Pool에 저장되기 때문이다.

 

일부러 다른 객체를 생성해 다른 참조를 저장하고 싶다면 아래와 같이 new 연산자를 이용하면 된다.

String name1 = new String("taeu");
String name2 = new String("taeu");
System.out.println(name1 == name2);

//출력 : false

 

하지만 참조하고 있는 객체의 값을 비교하고 싶은 경우가 있다.

이땐 equals() 메서드를 사용하여 비교하면 된다.

 

 

 

그리고 String 객체는 불변(immutable) 자료형이기 때문에 객체의 값이 변할 수는 없다.

 

만약

String name = "taeu";

name = "gdragon"; 

과 같이 값을 업데이트 할 경우 객체의 값이 바뀌는 것이 아니라 새로운 객체를 생성하여 참조를 변경한다.

 

하지만 알고리즘 문제와 같이 문자열을 가변의 형식으로 사용해야 하는 경우가 있는데 그때 사용할 수 있는 데이터 타입이 있다.

바로 StringBufferStringBuilder 이다.

 

StringBuffer는 멀티스레딩에 동기화 기능이 있어 유용하지만 성능이 StringBuilder에 비해 떨어진다.

그래서 알고리즘 문제에서는 StringBuilder를 사용하게 되는데 파싱하기에도 유용하고 문자의 추가, 삭제 및 변경 등 가변 성질의 문자열이라는 점이 장점이다.