코딩 공부/JAVA

#08. JAVA_String 클래스

코딩연습중 2022. 7. 11. 00:13

String은 두 가지 특징이 있다. 첫 번째로, 객체 생성 방법이 두 가지로 암시적, 명시적 방법이 있다. 두 번째로, 한 번 생성된 문자열의 내용은 변하지 않는다. 이걸 불변의 특징이라고 부른다. 

String str = "abc";

String str2 = "abc";

위와 같이 객체를 생성하는 것을 암시적 객체 생성이라고 한다. 메모리의 공간은 stack과 heap으로 나뉘는데, str과 str2는 stack 메모리에 저장되며, "abc"는 heap 메모리에 저장된다. 위의 str과 str2는 heap 메모리에 저장된 "abc"를 공유한다. 이게 암시적 객체이다. 

String str3 = new String("abc");

Stering str4 = new String("abc");

위와 같이 객체를 생성하는 것은 명시적 객체 생성이다. str3과 str4는 heap에 각각 "abc"를 저장하여 사용한다.

heap메모리에 대해서 조금 더 알아보자. 

String greet = "안녕";
greet += "하세요";
System.out.println(greet);

 위 코드의 결과는 당연히 "안녕하세요"이다. 이는 초기에 heap메모리에 저장된 "안녕"에 "하세요"라는 문자열을 이어 붙인 게 아니라 "안녕"이라는 값을 버리고 "안녕하세요"라는 새로운 값을 생성해 갖게 된 것이다. 

 

코딩을 하다 보면 가끔 문자열을 비교해야될 때가 있는데 이럴 때 "=="를 사용하면 우리가 생각하는 것과 다른 결과가 나올 것이다. 객체 사이의 ==은 값의 비교가 아닌 주소 값을 비교하는 연산자이기 때문이다. 위에 정의된 str과 str2는 주소가 같기 때문에 ==로 비교했을 때 같다는 결과가 나오지만, str과 str3은 내용은 같지만 주소가 다르기 때문에 다르다는 결과가 나온다. str과 str3에 저장된 문자열을 비교하여 만약 값이 같으면 "같다"를, 값이 다르면 "다르다"를 출력하는 코드를 짜 보자.

String str = "abc";
String str3 = "abc";

if(str.equals(str3)){
	System.out.println("같다");
    }
else{
	System.out.println("다르다");
    }
//결과 : "같다" 출력

 String클래스에는 다양한 메서드들이 있다. 메서드란, 정해진 작업을 수행하기 위한 명령문들의 집합으로, 굉장히 편리하다. 

String name = "Hong Gil Dong";
		int res = name.length();//문자열의 길이를 가져온다
		System.out.println("name의 길이 : " + res);
		
		res = name.indexOf('o');
		System.out.println("맨 앞 o의 위치 : " + res);//첫 글자의 위치는 0
		
		res = name.indexOf("Gil");
		System.out.println("Gil이 시작되는 위치 : " + res);
		
		res = name.lastIndexOf('o');
		System.out.println("맨 뒤 o의 위치 : " + res);
		
		char res2 = name.charAt(6);
		System.out.println("추출한 문자 : " + res2);
		
		String s1 = " apple ";
		String s2 = s1.trim();//문장 앞뒤(중간제외)의 공백을 제거
		System.out.println( s2.length() );//값 : 5
        
        	if( s2.equalsIgnoreCase( "Apple" ) ) {//대소문자 구별 없이 값이 같으면 참으로 인정
				System.out.println("사과입니다");
        	}

이 외에 스트링 클래스는 아니지만 많이 사용되는 메서드가 있다. 숫자 형태의 문자열을 실제 정수로 바꿔주는 기능을 하는 게 있다.

String number = "10";
int n = Integer.parseInt(number); //많이 쓰임
System.out.println(n + 10);

위에서 Integer는 int가 만들어진 클래스로 wrapper 클래스라고 한다. wrapper 클래스의 종류는 Integer(int), Character(char), Boolean(boolean)등이 있다.