profile image

L o a d i n g . . .

데이터타입


데이터 타입
기본 타입(Primitive type) 참조 타입(Reference type)
정수 타입 byte 배열 타입  
char 열거 타입  
short 래스  
int 인터페이스  
long    
실수 타입 float    
double    
논리 타입 boolean    

기본 타입 : 정수, 실수, 문자, 논리 리터럴을 저장하는 타입

참조 타입 : 객체(object)의 번지(주소)를 참조하는 타입

 

 

 

 

 

 


JVM

운영체제로부터 할당받은 메모리영역(Runtime Data Area)을 다음과 같이 세부 영역으로 구분해서 사용

 

- 메소드 영역(Method Area) : JVM이 시작할 때 생성되며, 모든 스레드가 공유하는 영역. 코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스별로 정적 필드(static field)와 상수(constant), 메소드 코드, 생성자(constructor) 코드 등을 분류하여 저장

 

 

 

- 힙 영역(Heap Area) : 객체와 배열이 생성되는 영역. 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다. 참조하는 변수나 필드가 없다면 의미 없는 객체가 되기 때문에 JVM은 이것을 쓰레기로 취급하여 Garbage Collector를 실행시켜 자동으로 제거한다. 

String hobby = "여행"; 
hobby = null;

hobby 변수가 String 객체를 참조하였으나, null을 대입함으로써 더 이상 String 객체를 참조하지 않기 때문에 Garbage Collector에 의해 메모리에서 자동 제거된다.

 

 

 

- JVM 스택 영역 : JVM스택은 메소드 호출마다 프레임을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행한다. 프래임 내부에는 로컬 변수 스택이 있는데, 기본 타입 변수와 참조 타입 변수가 추가되거나 제거된다. 

스택 영역에 변수가 생성되는 시점은 초기화가 될 때(최초로 변수에 값이 저장될 때)이다. 변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거된다.

char v1 = 'A';

if (v1 == 'A') {
	int v2 = 100;
    double v3 = 3.14;
}

boolean v4 = true;

int[] scores = {10, 20, 30};

선언된 변수는 실행 순서에 따라 스택에 생성되고 소멸된다. v2와 v3은 if블록 내부가 실행되고 있을 때에만 스택 영역에 존재하고 if 블록을 빠져나가면 소멸된다.

 

 

기본 타입 변수는 스택 영역에 직접 값을 갖고있으나, 참조타입 변수는 스택 영역에 힙 영역의 객체 주소를 가지기 때문에 생성은 스택영역에 되지만 실제 10,20, 30을 갖는 배열은 힙 영역에 생성된다. 배열 변수 scores에는 힙 영역의 주소가 저장된다.

 

 

 


문자열 타입

 

문자열은 String 객체로 생성된고 변수는 String 객체를 참조한다.

자바는 문자열 리터럴이 동일할 경우, String 객체를 공유하도록 되어있다.

String name1 = "이나당";
String name2 = "이나당";
//같은 String 객체 참조

 

객체 생성 연산자 = new 

new 연산자를 사용해서 직접 String 객체를 생성시킬 수도 있다. 

String name1 = new String("이나당");
String name2 = new String("이나당");

이 경우 name1과 name2는 서로 다른 String 객체를 참조하고 있다.

 

 

package a220627;

public class StringEqualsEx {
	public static void main(String[] args) {
		String strVar1 = "이나당";
		String strVar2 = "이나당";
		
		if (strVar1 == strVar2) {
			System.out.println("strVal1과 strVar2는 참조가 같음");
		} else {
			System.out.println("strVal1과 strVar2는 참조가 다름");
		}
		
		if (strVar1.equals(strVar2)) {
			System.out.println("strVal1과 strVar2는  문자열이 같음");
		}
		
		String strVar3 = new String("이나당");
		String strVar4 = new String("이나당");
		
		if (strVar3 == strVar4) {
			System.out.println("strVal3과 strVar4는 참조가 같음");
		} else {
			System.out.println("strVal3과 strVar4는 참조가 다름");
		}
		
		if (strVar3.equals(strVar4)) {
			System.out.println("strVal3과 strVar4는  문자열이 같음");
		}
	}
}

 

 

 

참고  :

- 혼자공부하는 자바(신용권), 한빛미디어

 

반응형
복사했습니다!