ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • String class
    Java 2023. 2. 18. 20:06
    학습 목표

    상수 풀 영역에 대한 이해
    불변이라는 개념에 이해

     

     

     

    package stings;
    
    public class StringTest1 {
    
    	public static void main(String[] args) {
    		//문자열이라는 데이터를 사용할 때
    		
    		String str1 = "반가워";		//1번 방식 --> 상수 풀 영역에 올라 간다.
    		String str2 = new String("반가워");	//2번 방식 --> 동적 메모리 영역에 올라 간다.
    		String str3 = new String("반가워");
    		String str4 = "반가워";
    		//값을 출력해보자
    		System.out.println("str1"+str1);
    		System.out.println("str2"+str2);
    		
    		// 1번 방식과 2번 방식은 메모리 위치 시키는 곳이 다르다.
    		// == 연산은 값을 비교(기본 데이터 타입), 클래스 타입은 주소 값 비교한다.
    		
    		// 검증하기
    		if (str1==str2) {
    			System.out.println("주소값이 같다");
    		}else {
    			System.out.println("아니요 주소값이 다르다");
    		}
    		//검증하기2
    		if (str2==str3) {
    			System.out.println("주소값이 같다");
    		}else {
    			System.out.println("아니요 주소값이 다르다");
    		}
    		//검증하기3
    		if (str1==str4) {
    			System.out.println("주소값이 같다");
    		}else {
    			System.out.println("아니요 주소값이 다르다");
    		}
    		
    		//결론 리터럴 값으로 생성한 문자열은 상수 풀 이라는 영역에 올라가고
    		//동일한 문자열을 사용한다면 새로 생성하지 않고 재활용하여 사용한다.
    		if (str1.equals(str2)) {
    			System.out.println("문자열 모양이 같다");
    		}else {
    			System.out.println("문자열 모양이 다르다");
    		}
    		
    		
    	} //end of main
    
    }	//end of class
    출력값
    
    str1반가워
    str2반가워
    아니요 주소값이 다르다
    아니요 주소값이 다르다
    주소값이 같다
    문자열 모양이 같다
    같은 문자열이라도 주소값이 같고 다르다는걸 알수있다.

     

    주소값을 확인하여 상수 풀이라는 개념을 한번더 이해 해보자

    package stings;
    
    public class StringTest2 {
    	
    	public static void main(String[] args) {
    		// 상수 풀이라는 개념을 이해 하였다. 
    		// 실제 주소값을 찍어 보자 !!! 
    		// Student sKim = new Student(); 
    		// System.out.println(sKim); <---- 주소값
    		// Object 클래스 일 때 확인 
    		
     		String str1 = "반가워";   // 1번 방식  --> 상수 풀 영역에 올라 간다. 
    		String str2 = new String("반가워"); // 2번 방식 --> 동적 메모리 영역에 올라 간다. 
    		String str3 = new String("반가워"); // ?? 질문 str2 와 str3은 주소값이 같을 까요? 
    		String str4 = "반가워";  // ?? str1 과 str4 주소값이 같을까요??
    		
    		// 현재 string 주소값을 찍어 보는 방법?? 
    		System.out.println(System.identityHashCode(str1));
    		System.out.println(System.identityHashCode(str4));
    		System.out.println(System.identityHashCode(str2));
    		System.out.println(System.identityHashCode(str3));
    		
    		// 상수 풀에 한번 생성된 문자열은 불변(immutable)이다.
    		str4 = str4 + " 홍길동";
    		System.out.println( System.identityHashCode(str4));
    		str1 += " :  하이";
    		System.out.println( System.identityHashCode(str1));
    		// 상수 풀 영역에 한번 생성된 문자열 값은 변경이 불가능 하다 
    		// str1 += " :  하이"; <-----  새로 생성 된다 .. 상수 풀 영역에 !!! 
    		
    		// 가 , 나 , a , 가 다 마 마  아ㅣㅓ  <----- 계속 상수 풀 영역에 메모리를 사용한다. 
    		// 그래서 메모리를 효율적으로 사용하기 위해서는 
    		// StringBuilder 클래스와, StringBuffer 클래스를 알아야 한다. 
    		
    		
    	} // end of main 
    } // end of class
    출력값
    
    93122545
    93122545
    2083562754
    1239731077
    557041912
    1134712904

     

     

    StringBuulder, StringBuffer

    package stings;
    
    public class StringTest3 {
    	// 쓰레드 --> 메인 작업자 1
    	public static void main(String[] args) {
    		// StrinigBuilder, StringBuffer 알아보자
    		// 문자열을 여러번 연결하거나 변경할 때 유용하다.
    		// StringBuffer 는 멀티 쓰레드 프로그래밍에서 동기화를 보장한다.
    		// 단일 쓰레드 프로그램에서는 StringBuilder 를 권장한다.
    
    		String java = new String("java");
    		String android = new String("Android");
    		System.out.println(java + android);
    		// java --> "java"
    		StringBuilder builder = new StringBuilder(java);
    		// 주소값 확인하기
    		System.out.println(System.identityHashCode(builder));
    		System.out.println("-----------------------------");
    		System.out.println("builder 값 : " + builder);
    
    		// builder 에 문자열 더하는 기능은 append 이다.
    		builder.append(android);
    		System.out.println(builder);
    		System.out.println("-------------------");
    		System.out.println(System.identityHashCode(builder));
    
    		// 응용
    		// 1.
    		// StringBuilder --> String 형 변환 방식은 toString 활용한다.
    		String result = builder.toString();
    		// 2.
    		String result2 = builder + " : 반가워";
    
    		// 정리
    		// StrungBuilder 는 문자열을 다룰 때 한 번생성한 문자열을 변경 하더라도
    		// 메모를 새로 생성하지 않는다.
    
    	}
    
    }
    출력값
    
    javaAndroid
    93122545
    -----------------------------
    builder 값 : java
    javaAndroid
    -------------------
    93122545

     

    'Java' 카테고리의 다른 글

    인터페이스 활용 예제  (0) 2023.02.18
    인터페이스  (0) 2023.02.18
    추상 클래스  (0) 2023.02.18
    다형성  (0) 2023.02.18
    상속  (1) 2023.02.18
Designed by Tistory.