ABOUT ME

-

Today
-
Yesterday
-
Total
-

Post Calendar

«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
  • Java Study[2022-09-13] - 객체지향프로그래밍(String, Wrapper 클래스)
    백엔드 2022. 9. 13. 22:13

    🔸 2022-09-13 화요일

    [객체지향프로그래밍]

    1. String, Wrapper 클래스

    • String 클래스 선언하기
      • 1번, String str1 = new String("abc"); => 인스턴스로 생성됨
      • 2번, String str2 = "abc"; => 상수풀에 있는 문자열을 가리킴
      • 1번의 new 키워드를 사용한다는 것은 힙 메모리에 Allocation을 받겠다는 의미
      • 2번은 상수풀에 문자열이 있다면, new 사용하지 않고, 바로 사용 가능(상수풀 공유)

     

        // 1번 Test
        String str1=new String("abc");
        String str2=new String("abc");
    
        System.out.println(str1==str2);
    
        // 2번 Test
        String str3 = "abc";
        String str4 = "abc";
    
        System.out.println(str3 == str4);
    • [1번 Test] : 메모리 위치가 다르기 때문에 false
    • [2번 Test] : 상수 풀에서 가져왔기 때문에 true

     

    • String은 immutable
      • 한 번 선언되거나 생성된 문자열을 변경할 수 없음
      • String 클래스의 concat() 메서드 혹은 "+"를 이용하여 String을 연결하는 경우 문자열은 새로 생성됨
      • javaStr로 "java", androidStr로 "android"를 생성하여 위 방식으로 붙여서 "javaandroid"
      • "javaandroid"이 눈으로는 그저 붙인 것으로 보이지만, 실제 새로운 메모리가 생성
      • 한 번 생성된 String은 불변하기 때문에 String을 계속 생성할 때마다 새로운 메모리에 할당

     

        String java = new String("java");
        String android = new String("android");
    
        java = java.concat(android);
    
        System.out.println(java);    // javaandroid
    • 출력은 javaandroid라고 나오지만, 실제 메모리는 어떻게 되는지 확인해보기
    • hashCode 값으로는 확인할 수 없음 => hashCode는 String에서 Override 했기 때문
        String java = new String("java");
        String android = new String("android");
        System.out.println(System.identityHashCode(java));  // 205962452
    
        java = java.concat(android);
    
        System.out.println(java);
        System.out.println(System.identityHashCode(java));  // 1032986144
    
    • 서로 메모리 상 주소가 다름
    • 따라서 연결이 되면 새로운 메모리를 가리킴
    • 고로 String을 계속 연겷해서 사용할 일이 있다면, StringBuiderStringBuffer를 사용하면 됨
    • StringBuffer 클래스를 살펴보면, 안에 AbstractStringBuilder를 가보면 valueString에서는 final이었음
    • 하지만, 여기서는 final이 아니고, 가변적인 배열을 갖게 됨
    • 따라서 연결한다고 해서 계속 메모리를 사용하는 것이 아니라 새로운 연결을 하게 됨
    • StringBuiderStringBuffer의 가장 큰 차이점은 StringBuilder는 멀티 쓰레드 환경에서 동기화를 지원하지 않음
    • StringBuffer은 멀티 쓰레드 환경에서 동기화를 지원 가능

     

    • StringBuiderStringBuffer
      • 가변적인 char[] 배열을 멤버 변수라 가지고 있는 클래스
      • 문자열을 변경하거나 연결하는 경우 사용하면 편리한 클래스
      • StringBuffer는 멀티 쓰레드 프로그래밍에서 동기화(Synchronization)이 보장됨
      • 단일 쓰레드 프로그래밍에서는 StringBuilder를 사용하는 것이 더 좋음
      • toString()메서드로 String 반환

     

        String java = new String("java");
        String android = new String("android");
    
        StringBuilder buffer = new StringBuilder(java);
        System.out.println(System.identityHashCode(buffer));       // 205962452
    
        buffer.append("android");
        System.out.println(System.identityHashCode(buffer));       // 205962452
    
        java = buffer.toString();
    • StringBuilder buffer = new StringBuilder(java); => java의 String 기반으로 StringBuilder가 생김
    • 두 출력으로 메모리 값이 205962452로 동일함
    • 이는 불변이 아니고, append, insert, reverse 등 변동이 있은 뒤 나중에 필요하다면 toString() 하여 다시 String 값을 얻어오게 됨

     

    • Wrapper 클래스
    기본형 Wrapper 클래스
    boolean Boolean
    byte Byte
    char Character
    short Short
    int Integer
    long Long
    float Float
    double Double

     

    🔖 Eclipse 실습

    String_list

    🔖 Eclipse 출력 Console

    String_console1String_console2String_console3

    댓글

Designed by Tistory.