기본형 타입(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의 값이 할당됨 }

- 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){ }

- 기본형 타입(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
, andShort
) 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로 자동 변환 시켜주는 것을 의미함
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의 주소값이 다름 // 값만 복사됨

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); }

- 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); } }

- 함수에 넘어가는 인자의 값이 주소값 그냥 그 자체기에 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
- .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이용 }