HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🤩
개발
/
Java
Java
/
💯
Java 기본
/기본개념/
🌗
변수
🌗

변수

기본형 타입(Primitive Type) - call by value정수(정수 literal은 기본 int)실수 변수(실수 literal은 기본 double)문자자료형 없이 변수사용하기 → 지역변수일때만 가능함상수 선언 → final 예약어 사용참조형 타입(Reference Type) - call by referencePrimitive Wrapper Classcall-by-value, call-by-referencecall-by-valuecall-by-referencejava에서는 call-by-value밖에 없다? ↔ 포인터 개념이 없어서 그런 것임. 값 혹은 주소를 넘기는 것코드 실행시, 변수 저장 영역동적 데이터스택힙 메모리정적 데이터(Data Area)Constant Pool

기본형 타입(Primitive Type) - call by value

  • 8개의 primitive
    • boolean, byte, int, short, long, float, double
int a = 2; // a라는 변수에 2라는 값이 저장됨. doSomething(a); private void doSomething(int a){ // doSomething을 호출하며, 함수 안에서 쓰이는 변수a가 // 새로 할당이 되고 그 변수a에 바깥에서 쓰이는 변수 a의 값이 할당됨 }
notion image
  • data가 메모리 상에 그 값으로 저장됨. 그래서 해당 변수를 다른 곳에 할당하면 그 값을 주면서 새로운 변수를 할당하는 것이기에 똑같은 값이 아님

정수(정수 literal은 기본 int)

byte : 1바이트 단위의 자료형으로 동영상, 음악 실행파일의 자료처리할때 사용
short : 잘 안씀
int :
  • 프로그램에서 사용하는 모든 숫자(리터럴)은 int로 저장됨. 메모리 상에 어디에서든 저장되어있는 숫자 리터럴은 int로 잡힘
  • 자바에서 사용하는 정수에 대한 기본자료형
long
  • 숫자의 뒤에 알파벳 l or L을 넣어서 정의해주어야함
long num = 1234657890; -> 오류. 모든 숫자리터럴은 기본 int로 잡히기 때문에 long num = 1234567890L;

실수 변수(실수 literal은 기본 double)

double(8바이트)
float(4바이트)
  • 식별자 f or F를 추가해주어야함

문자

  • 자바는 문자열 나타내기 위해 전세계 표준인 UNICODE 사용
  • utf-16을 이용함
  • ‘’ → 문자(2바이트)
  • “” → 문자열

자료형 없이 변수사용하기 → 지역변수일때만 가능함

  • 한번 선언하여 추론된 변수는 다른 타입의 값을 대입할 수 없음
  • 지역 변수는 초기화 안해주면 지정이 안됨

상수 선언 → final 예약어 사용

final int MAX_LEN=10000;

참조형 타입(Reference Type) - call by reference

class Int{ private int a = 100; } Int a = new Int(); doSomething(a); public void doSomething(Int a){ }
notion image
  • 기본형 타입(primitive type 8개)을 제외한 타입들이 모두 참조형 타입(Reference type)이다.
  • 빈 객체를 의미하는 Null이 존재한다.
  • 값이 저장되어 있는 곳의 주소값을 저장하는 공간으로 힙(Heap) 메모리에 저장된다.
  • String 클래스 빼고는 new로 생성해주고 사용

Primitive Wrapper Class

  • In Java, an immutable class is a class (Integer, Byte, Long, Float, Double, Character, Boolean, and Short) which once created then its body can not be changed and the same applies to immutable objects which once created cannot be changed.
  • Autoboxing : 자바 컴파일러가 primitive data type을 그에 상응하는 wrapper class로 자동 변환 시켜주는 것을 의미함
https://www.geeksforgeeks.org/primitive-wrapper-classes-are-immutable-in-java/

call-by-value, call-by-reference

call-by-value

void swap(int a, int b){ int temp = a; a = b; b = temp; } void main(args){ a = 1; b = 2; swap(a, b); } // 이렇게 됐을 시, main에서의 // a의 주소값과 swap 함수 안에서의 // a의 주소값이 다름 // 값만 복사됨
notion image

call-by-reference

void swap(int& a, int &b){ int temp = *a; *a = *b; *b = temp; } void main(args){ int a = 1; int b = 2; swap(&a, &b); }
notion image
  • call-by-value는 함수에서 인자 넘길 시 새로운 주소 값이 할당되며 해당 값이 넘어가고, call-by-reference는 해당 변수의 주소 값을 넘기는 방법임.

java에서는 call-by-value밖에 없다? ↔ 포인터 개념이 없어서 그런 것임. 값 혹은 주소를 넘기는 것

class Main{ public static void swap(Integer a, Integer b){ Integer temp = a; a = b; b = temp; } public static void main(String[] args){ Integer a = 1; Integer b = 2; swap(a,b); } }
notion image
  • 함수에 넘어가는 인자의 값이 주소값 그냥 그 자체기에 call-by-value임
  • 값에 대한 주소가 아닌, 값 자체가 그냥 그대로 넘어가는 것이기 때문에
  • 모든 기본자료형과 참조 자료형은 매개 변수로 넘어갈 때 값이 넘어가는 Pass-by-value임
  • 참조 자료형 안에 있는 변수들은 매개 변수로 넘어갈 때 참조가 넘어가는 Pass by Reference임

코드 실행시, 변수 저장 영역

동적 데이터

스택

  • 함수가 호출될 때 지역 변수들이 사용하는 메모리
  • 기본형 타입과 참조형 타입을 포함함

힙 메모리

  • 생성된 인스턴스는 동적 메모리(heap memory)에 할당됨
    • C ++ : new, delete
    • C : malloc, free
    • Java에서는 Garbage Collector가 주기적으로 사용하지 않는 메모리 수거함
  • 참조 변수 : 메모리(힙메모리)에 생성된 인스턴스를 가리키는 변수
    • 이 참조 변수는 stack에 있고(지역 변수는 stack에 저장되니까)
  • 참조 값 : 생성된 인스턴스의 메모리 주소값

정적 데이터(Data Area)

  • 저장되는 값들 : static 변수, static 메소드, 전역변수

Constant Pool

[Baeldung] An Introduction to the Constant Pool in the JVM
[StackOverflow] Do we have pools for all primitive types ? → No
자바 new & Heap, Constant Pool
  • .java 파일이 컴파일 되면 .class 파일들을 얻게 되는데 .class 파일은 여러 섹션으로 구성되어 있고 constant pool이 그 중 하나임
  • 간단히 말하면, constant pool은 특정 class의 코드를 실행하기 위하여 필요한 constant들을 포함하고 있는 곳
  • constant pool의 구성요소는 컴파일러에 의해 생성된 symbolic reference로 구성됨
    • 변수, 메서드, 인터페이스, 클래스들의 이름
    • 여기에는 String 뿐 아니라, 모든 종류의 숫자, 문자열, 식별자 이름, Class 및 Method 에 대한 참조와 같은 값이 포함된다. Constant pool은 특정 상수에 대한 모든 인덱스 또는 참조를 16비트(type u2) 번호로 제공되며, 여기서 인덱스 값 1은 표의 첫 번째 상수를 나타낸다.
  • class나 interface의 constant pool은 JVM이 로딩을 끝내는 시점에 생성이 됨
  • primitive type을 위한 pool은 없다! 왜냐하면, primitive type에 대해서는 reference가 있을수 없기 때문에!
    • Baeldung link를 봐도 지원 타입이 Primitive의 wrapper type들임
String a = "HelloWorld"; String b = "HelloWorld"; // 똑같은 값을 또 할당하면 Constant Pool에서 //찾아서 똑같은 값으로 할당함 -> a== b -> true String c = new String("HelloWorld"); // a == c -> false String a = ""; for(int i=0; i<10; i++){ a += i; // 이렇게 하면 Constant pool에 매 String이 계속 만들어지게 됨 -> StringBuilder이용 }