3/20 변수 값 교환, 메모리 사용 원칙 참조 유형, null 및 NullPointException, new 연산자

1. 변수 값의 교환

x 값을 y 값으로 변경하고 y 값을 x 값으로 변경하려는 경우 가장 좋은 방법은 무엇입니까? 이렇게 변경하십시오.

int x = 10;
int y = 20;

int temp = x; // x의 값을 temp에 보관
x = y; // x가 y의 값을 가진다.
y = temp; // y가 x의 값을 가진다.

2. 참조형 메모리 사용 원리

  • 기본 유형 변수는 변수 내부에 실제 값을 저장합니다.
  • 참조 유형(배열, 열거형, 클래스, 인터페이스 변수)은 메모리 주소를 변수에 저장합니다. 주소를 통해 객체를 참조하기 때문에 참조 유형이라고 합니다.

먼저 JVM 메모리가 무엇인지 알아보자.


JVM 메모리 영역은 메소드 영역, 힙 영역, 스택 영역으로 구분된다.

  • 메서드 범위는 JVM이 시작될 때 생성되며 모든 스레드에서 공유됩니다.
  • 객체와 배열은 힙 영역에 생성됩니다. (이해하기 쉽도록 객체를 생성하고 저장하는 곳이라고 생각합니다.)
  • 스택 영역은 힙 영역에서 생성된 객체의 주소가 참조되는 곳으로 메모리 주소(주소)는 변수에 저장된다.

3. ==, != 기준 변수 계산

==, != 동일한 객체인지 다른 객체인지 확인하는 데 사용됩니다. 따라서 주소 값이 비교됩니다.


위의 그림에서 refVar1과 refVar2는 서로 다른 개체를 참조하므로 == 및 != 작업은 어떻습니까?

refVar1 == refVar2 // false
refVar1 != refVar2 // true
refVar2 == refVar3 // true

refVar1과 refVar2는 서로 다른 객체를 바라보기 때문에 다르고, refVar2와 refVar3는 같은 객체를 바라보고 주소 값이 같기 때문에 다릅니다.

4. null 및 NullPointException

  • 참조 유형 변수 null 값을 가질 수 있습니다. 즉, 힙의 개체를 참조하지 않습니다.
  • 0 값도 초기값으로 사용할 수 있으므로 스택 영역에는 0 값으로 초기화된 참조 변수가 생성됩니다.
  • 참조 변수를 사용할 때 가장 흔한 실수 중 하나 NullPoint 예외있다
  • . : 주소 액세스 또는 개체 액세스 연산자오전. 필드 및 메소드에 대한 액세스를 제공합니다. . 그런 다음 개체에 있는 액세스 가능한 필드 및 메서드 목록을 표시합니다.
  • 사용법: 변수 이름 . 분야 명; , 변수 이름 . 메소드 이름(매개변수);
public static void main(String() args) {
		String name = null;
		System.out.println(name.length());
        // NullPointerException오류가 뜬다.
		

	}

이와 같이 널 상태에 존재하지 않는 객체의 데이터(필드)나 메서드를 사용하는 코드를 실행하면, NullPoint 예외일어난다

5. 신규 오퍼레이터

public static void main(String() args) {
	String name1 = "우건김";
	String name2 = "우건김";
	if(name1 == name2) {
		System.out.println("둘은 같다."); // 둘은 같다고 출력
	}
}

Java의 String 리터럴이 위와 같으면 String 개체가 공유되고 참조되므로 둘은 동일합니다. 그러나 new 연산자를 사용하여 직접 String 개체를 만들 수 있습니다.

new 연산자는 힙 공간에 새 개체를 만드는 데 사용되며 개체 생성 연산자라고 합니다.

public static void main(String() args) {
		String name1 = "우건김";
		String name2 = "우건김";
		String name3 = new String("우건김");
		
		System.out.println(name1 == name2); // true
		System.out.println(name2 == name3); // false
		
	}

동일한 String 리터럴을 사용하여 String 개체를 만들면 == 연산의 결과는 true이지만 new 연산자를 사용하여 String 개체를 만들면 == 연산의 결과는 false입니다.

.equals() 메서드

이 메서드는 내부 문자열이 동일한 String 개체인지 다른 String 개체인지 여부를 비교하려는 경우에 사용됩니다.

public static void main(String() args) {
		String name1 = "우건김";
		String name2 = "우건김";
		String name3 = new String("우건김");
		
		boolean res = name1.equals(name3); // 메서드 사용
		System.out.println(res); // true
	}

6. 기타

  • String 변수는 참조형이므로 초기 값으로 null을 지정할 수 있으며, 이 경우 null은 String 변수가 참조하는 String 개체가 없음을 의미합니다.
  • 다음 코드에서와 같이 취미 변수는 String 개체를 참조하지만 null을 할당하여 더 이상 String 개체를 참조하지 않도록 할 수 있습니다.
String hobby = "축구"
hobby = null;

위와 같이 자신의 참조를 잃어버린 문자열 객체는 JVM에 의해 가비지 객체로 처리되고 가비지 컬렉터를 실행하여 자동으로 메모리에서 제거됩니다.