본문 바로가기
개발일지/Java

Java - String과 index 처리 의문

by 개발에정착하고싶다 2024. 8. 5.
320x100
public class Main {
    public static void main(String[] args) {
        // 1. 자료형 - 문자열
        System.out.println("== 문자열 ==");
        String s1 = "Hello world";
        System.out.println("s1 = " + s1);
        System.out.println("");
        String s2 = "01234";
        System.out.println("s2 = " + s2);

        // 1-1 equals
        String s3 = "Hi";
        String s4 = "Hi";
        System.out.println(s3.equals(s4));
        System.out.println(s3 == s4);

        String s5 = new String("Hi");
        System.out.println(s3.equals(s5));
        System.out.println(s3 == s5);

        // 1-1에서의 s3과 s4의 메모리 값은 같기 때문에 equals를 돌렸을 때, true가 나오는데,
        // s5에서 new String으로 새롭게 정의를 해주니, 메모리 값이 다르게 나온다고한다.
        // 파이썬과 개념이 여기서는 달라서 메모리 값 참조는 헷갈리긴 하다.

        // 1-2. indexOf
        // 이거는 지정한 값에 대해서 가장 먼저 조건이 충족되는 인덱스 값을 리턴해주는 것 같다.

        String s6 = "Hello world";
        System.out.println(s6.indexOf("d"));

        // 1-3replace
        // a를 b로 바꿔준다
        String s7 = s6.replace("Hello", "Bye");
        System.out.println("s7 = " + s7);

        // 1-4 substring
        // a에서 시작해서 b부터 출력 배제한다.
        System.out.println(s7.substring(0, 3));
        System.out.println(s7.substring(0, s7.indexOf("d")));

        // 1-5 toUpperCase
        // 대문자 출력
        System.out.println(s7.toUpperCase());

        // 2. 자료형 - StringBuffer
        System.out.println("== StringBuffer == ");
        StringBuffer sb1 = new StringBuffer();
        System.out.println("sb1 = " + sb1);
        sb1.append("01234");
        System.out.println("sb1" + sb1);
        sb1.append("67890");
        System.out.println("sb1" + sb1);

        String a = "01234";
        String b = "56789";
        System.out.println(a + b);

        a += b;
        System.out.println(a);

        // 3. 자료형 - 배열
        // 지정된 인덱스 값에 있는 값을 리턴해주는 것 같다.
        System.out.println("== 배열 == ");
        int[] myArray1 = {1,2,3,4,5};
        System.out.println(myArray1[0]);
        System.out.println(myArray1[1]);
        System.out.println(myArray1[2]);
        System.out.println(myArray1[3]);
        System.out.println(myArray1[4]);

        // 새로 부여
        char[] myArray2 = {'a', 'b', 'c', 'd', 'e'};
        System.out.println(myArray2[3]);

        String[] myArray3 = new String[3];
        myArray3[0] = "Hello";
        myArray3[1] = "Moto";
        myArray3[2] = "world!";


        System.out.println(myArray3);
        // [Ljava.lang.String;@1b6d3586
        // 이렇게 값으로 나온다. 일종의 메모리 값처럼
        System.out.println(myArray3[0] + myArray3[1] + myArray3[2]);
        // HelloMotoworld! 이렇게 나온다. 의도했던대로

        // 추후에 확인해보도록 하자.


    }


}

 

의문점1

 

왜 String s3 = "Hi";

String s4 = "Hi";

가 메모리 값이 같아서 equals를 돌리면 true가 나오는지도 잘 모르겠다.

 

이후에 String s5 = new String("Hi");

는 s3,s4와 다른 값이 된다.

 

new를 거치지 않고 정의가 된 값은 s3,s4같은 변수마다 메모리가 부여되는 구조가 아니라

내부 값에 따라서 메모리 값이 정의되는 것인가?

예외적으로 new로 재정의 된 것만 다른가? 하는 생각이 든다.

 

의문점2

new로 재정의 되는 String에 대한 이해도가 떨어져서,

어떻게 중간에 인덱스 0,1,2 값에 각각의 값을 담아주고 나올 수 있는거지? 싶어서 테스트를 좀 해봤다.

 

String[] myArray4 = new String[3];
System.out.println(myArray4);
//[Ljava.lang.String;@4554617c

 

저 String[3]의 의미가 "3개의 인덱스를 부여해주는 것이고,

출력값으로 나온

Ljava가 인덱스 0, lang이 인덱스 1, String이 인덱스 2를 담당하고, 그 뒤의 값은 메모리 참조 값인가?

라고 생각했다.

 

String[] myArray5 = new String[5];
System.out.println(myArray5);
// [Ljava.lang.String;@74a14482

 

그래서 이렇게 시도를 해봤는데, 내용값은 메모리 참조 값으로 추정되는 것을 제외하곤 변한게 없다.

더 알아가도록 하자

300x250