자바의 데이터 타입은 크게 기본 타입(Primitive Type) 과 참조 타입(Reference Type) 으로 구분할 수 있습니다.
기본 타입(primitive type) 은 아래 포스팅을 참고하시면 됩니다.
[Java] 변수
변수(Variable) 는 하나의 메모리를 담는 공간을 의미합니다. 변수를 설정하는 방법은 아래와 같습니다. int num = 10; 위와 같이 직접 입력된 값을 리터럴(literal) 이라고 합니다. 리터럴은 상수(constant) 와..
eatkoala.tistory.com
ㅁ 참조타입 (Reference Type)
참조변수의 타입으로는 배열, 열거, 클래스, 인터페이스가 있습니다.
참조타입 변수는 우선 변수이기 때문에 스택 영역에 할당된다. 하지만, 값이 아닌 주소 값을 가지게 됩니다.
이 주소 값은 참조 타입으로 생성된 힙 영역의 객체 등의 주소입니다.
위의 그림을 예로 들면, 배열 변수인 'num' 이 스택영역에 할당되고,
힙 영역에 생성된 배열을 가리키고 있는 것을 알 수 있습니다.
이 가리키는 의미는 주소 값을 가지고 있다는 것을 의미하고, 이 주소값을 통해 해당 객체에 접근이
가능한 것입니다.
// num : stack
// new int[] : heap
int[] num = new int[]{10,20};
ㅁ 주소 값 비교
우선 참조 타입의 주소 값을 비교하기 위해서는 '==' 와 equals() 함수 를 사용할 수 있습니다.
* 최상위 클래스인 Object 에서 제공하는 함수이다.
People p1 = new People();
People p2 = p1;
People p3 = new People();
System.out.println(p1==p2); // true
System.out.println(p1.equals(p2)); // true
System.out.println(p1==p3); // false
System.out.println(p1.equals(p3)); // false
위의 코드에서 생성한 변수는 모두 동일하게 People 클래스 타입의 객체를 가리키고 있는 변수들입니다.
하지만, 결과에서 알 수 있듯이 주소 값이 2개는 동일하고 하나는 다른 것을 확인할 수 있습니다.
주소 값이 동일하다는 의미는 힙 영역에서 동일한 객체를 가리키고 있다는 것을 의미합니다.
이는 값을 변경해보면 쉽게 이해하실 수 있을 겁니다.
People p1 = new People();
People p2 = p1;
People p3 = new People();
p1.age = 10;
System.out.println("P1 age : " + p1.age); // 10
p2.age = 20;
System.out.println("P1 age : " + p1.age); // 20
분명 p2 변수에서 값을 변경했는데, p1 변수가 담고 있는 객체의 값이 변경된 것을 확인할 수 있습니다.
이는 두 변수가 동일한 객체를 가리키고 있다는 것을 의미합니다.
* 그림이 있으면 이해하기 편하다........ ( 알아서 찾아보도록 하자...... 죄송합니다...)
변수가 어떤 객체도 참조하지 않는 의미로 'NULL' 값을 설정할 수 있습니다.
이는 변수가 어떤 객체의 주소값을 가지지 않는다는 의미입니다. ( 빈 공간을 의미 )
ㅁ 문자열(String)
앞서 문자열은 String 클래스를 사용한다고 했다. 즉, 참조 타입인 것입니다.
우선 문자열을 변수에 할당하는 방법은 2 가지가 있습니다.
String str1 = "Hello";
String str2 = new String("Hello");
먼저 첫 번째의 경우는 리터럴을 할당하는 것입니다.
여기서 리터럴 값은 문자열 객체로 Heap 영역에 할당됩니다.
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2); // true
위에서처럼 두 개의 변수가 동일한 리터럴 객체를 가리키고 있습니다.
두 번째의 경우는 String 클래스의 객채를 생성해 각각 할당하는 것입니다.
이 경우는 같은 문자열이여도, 담고 있는 주소값이 다른 것을 확인할 수 있습니다.
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
위는 같은 문자열이여도, 담고 있는 주소값이 다른 것을 확인할 수 있습니다.
* 문자열 비교함수 : equals() cf) Object 는 주소 값 비교.