반응형

 

참조 타입

 

: 객체(object)의 번지를 참조하는 타입을 말한다.

 

데이터 타입

 

기본 타입 변수와 참조 타입 변수 차이점

 

 

 

메모리 사용 영역

 

메모리 영역 설명

 

 

- Stack 영역

 

스택영역은 추후에 삭제된다.

 

 

- Heap 영역

 

 

String의 같은 글자일시 같은 힙 영역을 바라본다.

 

new String

 

위의 그림과 같은 경우 아래의 코드를 사용하여 new를 생성했기 때문에 서로 다른 곳을 바라보는 것이다.

 

String name1 = new String("신용권");
String name2 = new String("신용권");

 

 

+ String 타입의 문자열을 비교할 때는 == 을 사용해서는 안 된다. (== 는 주소값을 비교하는게 된다.)

그대신 equals()를 이용해 문자열을 비교한다.

 

타입 변수명 = 원본문자열.equals(비교문자열);
원본문자열.equals(비교문자열);

 

 

package kr.or.ddit.study05;

import java.util.Scanner;

public class VarExample {
	static int i = 100;
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		VarExample obj = new VarExample();
		String name1 = "자바"; // String은 객체. 객체의 경우 Heap 영역에 생성이 되고 주소값만 가져옴.
		String name2 = "어렵다"; // 모두 완료 후 주소 값만 사라지고, Heap의 글을 삭제 시켜주지 않음.
		// jvm이 heap 영역에 있는 글씨인 데이터를 삭제 시켜줌.
		obj.method1();
		int i1 = 10;
		int i2 = 15;
	}
	
	public void method1() {
		String name1 = "자바"; // main에 name1의 주소 값을 가져옴 >> 효율적으로 메모리 관리할 수 있음.
		int i1 = 10; // Stack 영역에 쌓였다가 블록을 끝나는 즉시 사라짐.
		int i2 = 15;
	}
}

 

 

package kr.or.ddit.study05;

import java.util.Scanner;

public class StringExample {
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		StringExample obj = new StringExample();
		obj.process();
	}
	
	public void process() {
		String str1 = "홍길동";
		String str2 = "홍길동";
		String str3 = "강감찬";
		String str4 = new String("강감찬"); // Heap 영역에 하나 더 생김. str3과의 메모리 주소가 다르게 나옴.
		String str5 = new String("강감찬");
		
		System.out.println(str1 == str2);
		System.out.println(str3 == str4);
		System.out.println(str4 == str5); // class의 경우기에 주소값을 비교함.
		System.out.println(str3.equals(str4)); // 값이 같은지 비교함.
		
		Customer c = new Customer();
		System.out.println(c);
		
		String s1 = ""; // 아래의 코드와는 다른 뜻임.
		String s2 = null; // 객체가 새로 생성되지 않음. or 주소값이 존재하지 않음
//		String s2 = "";
		
		
//		if(s2.equals("") || s2 == null) { // 이 경우 사용이 불가능함. 
		if(s2 == null || s2.equals("") ) { // if는 앞에가 참일 경우 뒤를 비교하지 않음.
		// null 체크는 가장 처음에, 데이터가 비었는지의 여부는 나중에 해야함.
			System.out.println("데이터가 비었음");
		}
	}
}

class Customer {
	String name = "강감찬";
}

 

결과 화면2

 

 

반응형