Published 2022. 11. 4. 11:59

 String 클래스 == 불변클래스
 * 값 변경이 가능하긴 하나 그자리에서 수정되는 개념 아님
 * 값을 변경하는 순간 새로운 곳을 참조하도록 주소값 변경됨
 * 
 * 빈번하게 값을 변경해야 될 경우 GC(가비지컬렉터)가 계속 기존의 값들을 지워줘야하는 단점
 * 변경이 적고 한번 값을 담은 후 단지 조회만 할경우 String 클래스가 용이 
 * 

 

	public void method1() {
		//1. 생성자를 통한 문자열 생성
		String str1 = new String("hello");
		String str2 = new String("hello");
		
		System.out.println(str1/*.toString()*/); //hello
		System.out.println(str2/*.toString()*/); //hello
		//String 클래스에 toString메소드 이미 오버라이딩 되어있음 (실제 담긴 문자열 반환하도록)
		
		System.out.println(str1 == str2); //false 주소값 비교이기 때문에
		System.out.println(str1.equals(str2)); //true
		//Object 클래스의 equals메소드는 주소값비교 - String클래스에 equals메소드 이미 오버라이딩 되어있음(주소값이 아닌 실제 담긴 문자열간 비교)
		
		System.out.println(str1.hashCode());
		System.out.println(str2.hashCode());
		//Object 클래스의 hashCode메소드는 주소값 출력 - String 클래스에 hashCode 메소드 이미 오버라이딩 되어있음(주소값이 아닌 실제 담긴 문자열가지고 10진수 출력) 
		
		
		//찐 주소값을 알고자 할 경우 System.identityHashCode(레퍼런스)
		System.out.println(System.identityHashCode(str1));
		System.out.println(System.identityHashCode(str2));
		
        public void method2() {
		String str = new String("hello");
		
		//2. 문자열을 리터럴값으로 생성 
		String str1 = "hello";
		String str2 = "hello";
		//리터럴 값 제시시 상수풀(String Pool) 영영에 올라감 
		//상수풀에는 동일한 문자열이 들어갈 수 없기 때문에 str1 과 str2는 동일한곳을 참조하고있음 => 주소값 일치 
		//String Pool 특징 : 동일한 문자열을 가질 수 없음. 
		
		System.out.println(str1); //hello
		System.out.println(str2); //hello
		
		System.out.println(str1.hashCode()); //99162322
		System.out.println(str2.hashCode()); //99162322
		
		System.out.println(str1 == str2); // true (주소값 일치함) 
		
		System.out.println(System.identityHashCode(str1));
		System.out.println(System.identityHashCode(str2));
		//찐 주소값 일치 
		System.out.println(System.identityHashCode(str));
	
	}
	
	public void method3() {
		String str = "hello";
		System.out.println(System.identityHashCode(str)); //1404928347
		
		str = "hi"; // 값 변경 (새로운 값 대입)
		System.out.println(System.identityHashCode(str));//1562557367 주소값 변경 
		
		str  += "!"; //값 변경 (기존의 값에 연이어지게끔)
		//str = str+ !;
		//      "hi!"
		System.out.println(System.identityHashCode(str));//1101288798 주소값 변경 , 새로운곳 참조 
		
		
		
	}

'JAVA' 카테고리의 다른 글

10.API_String 메소드  (0) 2022.11.04
10. API_StringBuilder  (1) 2022.11.04
10. API _ Math  (0) 2022.11.04
9_3. 다형성 _ 인터페이스  (0) 2022.11.03
9_2 . 다형성 _ 추상클래스/ 추상메소드  (0) 2022.11.03
복사했습니다!