본문 바로가기

Developer/Java-oop

#008. String 객체 알아보기...

#008. String 객체 알아보기...

 

1. String 객체는 다른 데이터 형 과는 다르게 객체로 만들어져 있다. 객체이기 때문에 new 로 객체를 생성해서 사용해야 한다. 테스트를 위해 oop 패키지에 StringDemo Class를 만들고 아래와 같이 작성해본다.

코드

package oop;

public class StringDemo {

    public static void main(String[] args) {

        // new 를 이용한 객체 생성방법..

        String s1 = new String("김동혁");

        String s2 = new String("김동혁");

        

        // 대입 방법으로 객체를 생성방법..

        String s3 = "김동혁";

        String s4 = "김동혁";

        

        // == 비교연산자로 같은지 확인법..

        System.out.println("s1==s2: "+ (s1==s2));

        System.out.println("s3==s4: "+ (s3==s4));

        

        // equals 메서드로 같은지 확인법..

        System.out.println("s1.equals(s2): "+ (s1.equals(s2)));

        System.out.println("s3.equals(s4): "+ (s3.equals(s4)));

    }

}

결과

s1==s2: false

s3==s4: true

s1.equals(s2): true

s3.equals(s4): true

설명

문장5,6: 보통 사용자정의 class에서 객체를 생성하는 것과 같이 객체를 생성하고, 생성자에 내용을 입력해서 내용을 보관한다.

문장9,10: 이 경우엔 java-api에 보면 상수영역에 만들어 진다고 되어있다.

문장13: 객제간의 == 연산자는 메모리 참조 값이 같은지 비교하는 연산자고, 서로 다른 new 로 생성했기 때문에 서로 다른 참조 값을 갖는다. 그러므로 결과는 false가 된다.

문장14: 상수영역에 있기 때문에 바로 값을 가져온다. "김동혁"="김동혁" 은 같기 때문에 true가 된다.

문장17,18: String 객체에 내장된 함수 equals 를 사용하여 값을 비교하면, 둘 다 true가 된다. String 객체는 비교시 equals 로 사용하면 될 것 같다.

 

2. String에서 자주 사용하는 내장된 메서드를 사용해보자.

위에서 만든 StringDemo Class에 내용을 지우고 아래와 같이 작성해본다.

코드

package oop;

public class StringDemo {

    public static void main(String[] args) {

        String message = "Hello. I is Kim, DongHyuk.";

        

        System.out.println("문자열길이: "+message.length());

        System.out.println("0번째문자: "+message.charAt(0));

        System.out.println("Kim첫위치: "+message.indexOf("Kim"));

        System.out.println(message+" 대문자로: "+message.toUpperCase());

        System.out.println("7번째이후문자: "+message.substring(7));

        System.out.println("12~25번째문자: "+message.substring(12, 25));

    }

}

결과

문자열길이: 26

0번째문자: H

Kim첫위치: 12

Hello. I is Kim, DongHyuk. 대문자로: HELLO. I IS KIM, DONGHYUK.

7번째이후문자: I is Kim, DongHyuk.

12~25번째문자: Kim, DongHyuk

설명

결과에 설명이 잘 되어 있다.

 

3. String Class 객체가 메모리에 어떻게 할당 되는지 확인해보자.

위에서 만든 StringDemo 의 내용을 지우고 아래의 코드를 다시 입력 해보자.

코드

package oop;

public class StringDemo {

    public static void main(String[] args) {

        String s;

        s = new String("Hello");

        System.out.println("S: "+s+", Code: "+s.hashCode());

        s = new String("World");

        System.out.println("S: "+s+", Code: "+s.hashCode());

        s = "Angel";

        System.out.println("S: "+s+", Code: "+s.hashCode());

        s = "Devil";

        System.out.println("S: "+s+", Code: "+s.hashCode());

    }

}

결과

S: Hello, Code: 69609650

S: World, Code: 83766130

S: Angel, Code: 63408097

S: Devil, Code: 65925080

설명

문장5,7: String 객체를 생성하며 값을 할당 했다.

문장9,11: String 변수에 값을 대입했다.

결과는 모두 메모리 참조 값이 다르다는 것을 확인할 수 있다.

 

4. 위 내용을 보고 JVM이 메모리에 어떻게 할당하는지 확인해 보자.

명령어

클래스 영역

[static 영역]

(같은클래스1번)

메서드 영역(변수)

[stack 영역]

(heap영역을 참조)

객체 영역

[heap 영역]

(실제데이터공간)

String s;

Java.lang.String

  

s = new String("Hello");

 

s = 69609650

string (69609650) (s)

 

s = new String("World");

 

 

s = 83766130

string (69609650) (-)

string (83766130) (s)

 

 

s = "Angel";

 

 

 

s = 63408097

string (69609650) (-)

string (83766130) (-)

string (63408097) (s)

 

 

 

s = "Devil";

 

 

 

 

s = 65925080

string (69609650) (-)

string (83766130) (-)

string (63408097) (-)

string (65925080) (s)

* 설명: 위의 s = 69609650 참조 값이 메모리의 실제 주소는 아니다.

     오른쪽의 heap 영역의 (s)는 객체가 실제 존재하는 위치다.

     (-)는 참조변수를 잃은 메모리가 되겠다. 즉, Garbage 가 되겠다.

     Garbage는 JVM이 Garbage Collector 를 주기적으로 실행하여 자원을 반환한다.

 

다음 시간엔 StringBuilder 객체에 대해서 알아보자.

 

잡담. 오늘도 새벽까지 강좌를 쓰고 있습니다. 내용이 많이 부족해 태클 걸 내용도 없지만, 멋진 태클 부탁 드립니다. 부족한 강좌 봐주셔서 감사합니다. 오늘도 화이팅 입니다.(__)