자바 new 생성자 관련 질문

자바 new 생성자 관련 질문

작성일 2024.03.29댓글 2건
    게시물 수정 , 삭제는 로그인 필요

String str1= "java";

String str2=new String("java");

String str3=new String("java");

System.out.println(str1 == str2);

System.out.println(str2 == str3);



string 타입 변수 값을 설정할 때 new 생성자로 새로운 객체를 만들면 
str1, str2, str3의 참조 객체가 다 다른데

Korea k1 = new Korea("홍길동","22333-3333");

System.out.printf("%s %s %s", k1.nation, k1.name, k1.ssn);

Korea k2 = new Korea("홍길동","22333-3333");

System.out.printf("%s %s %s", k1.nation, k1.name, k1.ssn);

System.out.println(k1.name == k2.name);


왜 클래스 변수에서 생성자를 사용할 땐 참조가 같다고 나오나요?
k1과 k2의 입력 값("홍길동 어쩌구") 이걸 다르게 입력하면 
참조 위치 다르다고 나오는데 
텍스트를 똑같이 입력하면 위치가 같다고 나옵니다. 

new 생성자는 무조건 새로운 객체를 만드는 게 아닌가요? 

new 생성자가 어떤 방식으로 운영되는지 간략하게 알려주시면 감사하겠습니다. 


#자바 new #자바 new 생성자 #자바 new 없이 객체 생성 #자바 new 연산자 #자바 new string #자바 new date #자바 new file #자바 new int #자바 new 키워드 #자바 new file 상대경로

profile_image 익명 작성일 -

안녕하세요.

객체는 new를 통해 생성시 새로운 객체가 만들어지는것은 맞습니다.

그런데 자바에서 문자열을 다루는 방식을 이해하셔야 합니다.

String str1 = "Hello";

String str2 = "Hello";

str1 == str2 의 결과는 true가 나오게 됩니다.

사실 자바에서 문자열은 객체로 다루기 때문에 새로운 객체가 생성이 되는것이 맞습니다.

String str3 = new String("Hello");

String str4 = new String("Hello");

str3==str4 이 경우에는 false가 나오게 됩니다.

보통 객체를 생성할때 new String("Hello")이렇게 new 키워드를 이용해서 객체를 생성하지요.

문자열도 이렇게 객체를 생성하게 되면,

"Hello"를 가지는 문자열 객체가 생성되고, 또다시 new String("Hello")를 하게 되면,

앞에서 생성된 "Hello"문자열 객체말고 새로운 "Hello"문자열을 가진 객체가 만들어지게 됩니다.

둘은 서로 다른 객체이지요.

그런데 문자열의 경우 워낙 자주 사용하고 하다보니 문자열의 경우 new를 통한 생성말고,

String str5 = "Hello";

이런 형태로 객체를 생성할 수 있도록 하고 있습니다.

이 경우에도 "Hello"문자열 객체가 생성이 되지요.

그런데 일반 new를 통한 객체생성시와 차이점이 하나 있는데요, 이와같이 생성시에는 상수풀을 사용한다는 점이 다릅니다.

같은 문자열 객체를 자꾸 만들다 보면 리소스도 잡아먹게 되고, 관리해야할 객체수도 많아지겠지요.

그래서 같은 문자열 객체는 하나만 만들고, 이후에 같은 문자열을 사용하는 경우 기존에 만들어 놓은 객체를 이용하는 방법입니다.

문자열을 처음 만들면 상수풀이라는 곳에 등록을 하고, 이후부터는 상수풀에 등록되어 있는 문자열을 이용하는 것이지요.

new를 통해 문자열을 만드는 경우 상수풀을 사용하지 않습니다.

그래서 만들때마다 새로운 객체로 생성이 되지요.

하지만 String s = "Hello";

라고 하면 먼저 "Hello"객체가 상수풀에 있는지 확인을 하고, 만약 있다면 기존 객체를 사용하고,

없는 경우 새로운 객체를 만들고 상수풀에 등록을 하게 되지요.

따라서,

String str1 = "Hello";

String str2 = "Hello";

이렇게 str1은 새로운 문자열 객체를 만들고 상수풀에 등록하게 되고,

str2는 이미 str1이 가리키는 위치에 객체가 있으므로 해당 객체의 참조만 가져오게 됩니다.

str1과 str2는 같은 객체를 참조하게 되지요.

따라서 str1==str2 는 true가 나오는 것입니다.

질문하신 System.out.println(k1.name == k2.name);

내용도 같은 내용입니다.

참고하세요.

profile_image 익명 작성일 -

Korea객체는 따로 만들어졌지만, 그게 중요한 게 아니죠.

정작 문자열은 같은 리터럴으로 초기화되었으니까요..

자바 생성자 질문이 있습니다.

자바에서 생성자를 써야되는 이유는 무엇인가요? Book.java package programers;... Book book1 = new Book("ss", 2000); Book book2 = new Book(); book1.BookList("ㅇㅇ", 1000)...

자바 기본생성자 관련 질문입니다

... Stduetn() 라고 하면, Stduent() 생성자를 호출해주고, new Stduent("홍길동"); 이런식으로 작성했다면, 객체생성후에 Student(String name){ } 이런 형태의 생성자를 찾아 호출을...

자바에서 생성자관련 질문!

... a = new Bus(); a.busNumber= 10 이렇게 대입하는거랑 차이가 있나요?? 굳이 생성자를 첫줄처럼 만드는 이유는 뭔가요??? 두 가지 방법 모두 `busNumber` 변수에 10을 대입하는...

자바 생성자 질문

... 즉 Apple 클래스를 정의하고 생성자를 하나도 만들지 않으면, public Apple(){} 라는 생성자가 자동으로 들어가게 되지요. 그래서 new Apple(); 가...

자바 생성자 질문...

생성자를 호출할떄요 Parent pa = new Child(); 이렇게 생성했고 Child()함수에 인자값이... 가 출력되는 것이지요. 참고하시고 궁금하신 부분 있으시면 추가질문 주세요.

[50] 자바 생성자 관련 질문입니다.

... public void increase(Test a){ a = new Test(); a.number++; } } [/code] main 메소드에서 생성자를 통해 a라는 이름의 Test... 자바에서 파라매터를 패싱할 때는, call by value...