참조 타입이란?(1)

2024. 11. 14. 23:23java study

데이터 타입

  • 기본 타입: 변수가 값 자체를 저장해 줌
정수 타입: char, byte, short, int, long
실수 타입: float, double
논리 타입: boolean
  • 참조 타입: 변수가 객체가 생성된 메모리 번지를 저장해 줌
배열 타입
열거 타입
클래스
인터페이스
객체
데이터와 메서드로 이루어진 모습을 하고 있음

메모리 영역

  • 메소드 영역: 바이트 코드 파일의 내용을 저장해 줌.
  • 힙 영역: 객체가 만들어지는 공간.(객체의 번지는 메서드, 스택 영역에서의 변수 or상수에서 참조함)
  • 스택 영역: 프레임이 생성되는 부분으로 프레임 내부에서 변수들이 생성된다.

참조 타입 활용하기

  • ==: 참조 타입의 변수의 주소가 동일하면 True
  • !=: 참조 타입의 변수의 주소가 동일하지 않다면 True
public class CalCulation {

	public static void main(String[] args) {
		int[] a= {1,2,3};
		int[] b= new int[] {1,2,3};
		int[] c;
		c=b;
		System.out.println(a==b);
		System.out.println(b==c);
	}

}
false
true

 

위와 같은 경우
a, b는 서로 다른 주소의 객체에 저장되기 때문에 배열의 내부의 값은 동일해도 다르다고 결과가 나온다.
하지만 c는 b의 변수의 주소가 저장되어 있기 때문에 두 변수는 같은 주소를 가지게 된다. 

문자열

  • String 객체로 생성함
  • 변수 문자열 리터럴이 대입되면 문자열 String객체가 생성됨.

문자열 비교

  • String 변수를 활용하여서 두 개의 변수에 동일한 문자열 리터럴을 지정해주면 동일한 객채의 주소가 지정된다.
  • 하지만 new 연산자를 활용한다면 새로운 객체를 생성하게 되고 두개의 변수는 서로 다른 주소가 지정된다. 이는 흔히 객채 생성연산자라고 불린다.
public class CompareString {
	
	public static void main(String[] args) {
		String a1="abc";
		String a2="abc";
		System.out.println(a1==a2);
		
		String s1=new String("abc");
		String s2=new String("abc");
		System.out.println(s1==s2);
	}
}
true
false
  • 만약 객체와 상관없이 내부에 있는 문자열이 동일한지 아닌지 확인하고 싶다면 변수명 1.equals(변수명 2)를 활용하면 된다.
public class CompareString {
	
	public static void main(String[] args) {
		String s1=new String("abc");
		String s2=new String("abc");
		
		System.out.println(s1==s2); //주소가 다름 False

		System.out.println(s1.equals(s2)); //내부 문자열이 동일하기에 True
		
	}
}
false
true