#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 객체에 대해서 알아보자.
잡담. 오늘도 새벽까지 강좌를 쓰고 있습니다. 내용이 많이 부족해 태클 걸 내용도 없지만, 멋진 태클 부탁 드립니다. 부족한 강좌 봐주셔서 감사합니다. 오늘도 화이팅 입니다.(__)
'Developer > Java-oop' 카테고리의 다른 글
#010. Wrapper Class 알아보기... (1) | 2011.03.29 |
---|---|
#009. StringBuilder 객체 알아보기... (0) | 2011.03.24 |
#007. this 알아보기... (0) | 2011.03.21 |
#006. 생성자(Constructor) 와 생성자오버로딩(Constructor Overloding) 알아보기... (0) | 2011.03.21 |
#005. 메소드 중복정의 (method overloding) 알아보기... (0) | 2011.03.19 |