만자의 개발일지

[Java] new 연산자란 본문

Java/Java

[Java] new 연산자란

박만자 2021. 6. 21. 21:08

Java를 하다가 제일 먼저 new 연산자를 접하는게 아마 배열을 공부할 때 일텐데, 나도 처음에 new 연산자가 무슨 역할을 하는지 정확히 모른채 공부를 해오다가 new 연산자의 역할이 꽤나 중요하다는걸 알게되었다.

 

자 그럼 new 연산자가 무슨역할을 하는지 파해쳐보자.

 

new 연산자

new 연산자는 객체를 Heap이라는 메모리 영역에 메모리 공간을 할당해주고 메모리주소를 반환한 후 생성자를 실행시켜준다. 리터럴과는 달리 new 연산자로 생성된 객체는 똑같은 값을 가진(?) 객체가 있어도 서로 다른 메모리를 할당하기 때문에 서로 다른 객체로 분류된다.

 

간단하게 new 연산자의 작동원리에 대해 알아보자.

public class Main {
	
	public static void main(String[] args) {
		String str = new String("string");
	}
	
}

 new 연산자를 사용해 "string"이라는 문자열값을 담고있는 String 객체를 생성했다. 그러면 자바의 메모리에서는 무슨일이 일어날까?

 

일단 변수는 Stack 영역에 할당 될것이고, new String으로 생성된 문자열값이 Heap영역의 메모리 공간을 할당받아 str이라는 변수가 그 메모리주소를 가르키고 있을것이다. 이를 다른 말로 참조라고도 한다.

그렇다면 똑같이 생긴 문자열을 new 연산자로 또 생성하면 어떻게 될까?

public class Main {
	
	public static void main(String[] args) {
		String str = new String("string");
		String str2 = new String("string");
	}
	
}

변수를 한개 더 생성해서 똑같이 생긴 문자열값을 new 연산자를 통해 초기화해보았다. 

보시다시피 처음에 생성한 "string"을 가르키지 않고 Heap 메모리에 새로운 영역을 할당받아 생성한것을 볼 수 있다.

이렇게만 보면 확실치 않으니 메모리 주소를 출력시켜보자.

public class Main {
	
	public static void main(String[] args) {
		String str = new String("string");
		String str2 = new String("string");
		
		System.out.println(System.identityHashCode(str)); 	//result:2008362258
		System.out.println(System.identityHashCode(str2));	//result:760563749
        //메모리주소는 컴퓨터마다 다르기때문에 실행결과가 다르게 나올수도 있다.
	}
	
}

보시다시피 메모리주소가 서로 다르게 찍히는것을 볼 수 있다.

System.identityHashCode()는 메모리주소를 숫자값으로 반환해주는 메서드이다.

 

리터럴 방식과 비교해보자.

public class Main {
	
	public static void main(String[] args) {
		String str = "string";
		String str2 = "string";
		
		System.out.println(System.identityHashCode(str));	//result:2008362258 
		System.out.println(System.identityHashCode(str2)); 	//result:2008362258
	}
	
}

어? 리터럴 방식은 메모리 주소가 같다고 나오는데 new 연산자는 메모리 주소가 다르게 나온다. 이것이 new 연산자와

리터럴 방식의 차이이다.

 

정리하자면 new 연산자는 객체를 생성할 때 사용하고 Heap이라는 메모리 영역에 각각의 새로운 메모리 공간을 할당해주는 역할을 한다.

new 연산자로 생성한 객체들의 메모리 주소가 다르게 나오는 것도 이 때문이다.

 

 

리터럴 방식에 대해서는 따로 포스팅 해놨으니 참고하면 좋을 것이다.

https://yoo11052.tistory.com/50

 

[Java] 리터럴(literal)이란?

자바의 타입은 크게 두가지로 나뉩니다. 하나는 원시타입(primitive type) 또 하나는 참조타입(reference type) 입니다. 원시타입은 우리가 흔히아는 byte, int, short, long, float, double ,boolean, char가 원..

yoo11052.tistory.com

 

Comments