2017년 6월 27일 화요일

[Java] String(문자열)

char형이 문자 1개밖에 저장하지 못하기 때문에 탄생한 String형, 유니코드 문자열을 저장하며 Java의 빌트인 자료형이 아니라, Java 라이브러리에서 지원되는 자료형이다. 큰따옴표("") 사이에 들어가는 문자는 모두 String 클래스의 인스턴스이다. 예를들자면 "Java\u2122"는 유니코드 문자, J, a, v, a, ™으로 이루져있다.

String emptyOne = "";
String javaTM = "Java\u2122";
System.out.println(emptyOne); //
System.out.println(javaTM); //Java™

String형은 저장된 자료를 변경하는게 불가능한다. 객체형 자료이기 때문인데, 우리가 e 라는 String 객체를 생성하고 "eTest"라는 문자열을 어싸인하면 e라는 변수가 "eTest"라는 값을 저장하는게 아닌, "eTest"라는 값이 저장된 메모리의 주소를 저장한다. 그렇기 때문에 String형의 값을 변경하려면 새로운 String 객체를 어싸인해주는 수밖에 없다. int, float과 같은 원시자료(Primitive Data Type)형과 비교를 하자면, 원시자료형은 저장하고 있는 메모리의 주소가 바뀌지 않는다. 만약 int i 가 a라는 메모리에 숫자 111을 저장하고 있고 이걸 112로 변경한다면 a라는 메모리에서 변경되지만, String은 a라는 메모리에 "eTest"를 저장하고 있는데, "aTest"로 변경한다면, b라는 메모리에 "aTest"가 저장되고 String형에서 저장하고있는 메모리주소가 a에서  b로 바뀌게 된다. 이 때문에 String은 저장된 자료가 변경 불가능하다는 뜻에서 "Immutable Object"이라고 불리기도 한다.

String형은 자바 라이브러리에서 지원하는만큼, 사용을 위해 다양한 메소드들을 지원한다.

부분 문자열(Substrings)


String.substring(a,b) 메소드를 이용해 원래 문자열에서 부분만 추출 가능하다. a는 추출할 문자열의 시작 위치, b는 추출할 문자열의 끝 + 1이다.
만약 문자 1개만 추출하고 싶다면 String.charAt(index) 메소드를 이용하면 된다

String javaTM = "Java\u2122";
String av = javaTM.substring(1, 3);
System.out.println(av); //av
String v = javaTM.charAt(2);
System.out.println(v); //v

substring 메소드에 1 과 3을 파라미터로 호출했다. 인덱스 0 부터 시작해, 인덱스 1과 2의 위치에 있는 'a'와 'v'가 추출되고, 인덱스 3부터인 "a™"은 추출되지 않는다. 즉 인덱스 a는 포함하나, b는 포함하지 않고 추출한다. substring의 길이는 b - a를 연산하면 쉽게 구할 수 있다.

문자열 접합(Concatenation)


다른 프로그래밍 언어처럼, + 연산자르 이용해 2개의 문자열을 합할 수 있다. 또한 String형이 아닌 다른 자료형과 합하게되면 자동으로 String형으로 변환된다.

String welcome = "Welcome to ";
String java = "Java ";
double version = 1.8;
String greeting = welcome + java + version;
System.out.println(greeting); //Welcome to Java 1.8

또는 String.join 메소드를 이용해도 가능하다. 특정 딜리미터(delimiter)를 설정해 기존 문자열을 합하여 새 문자열을 만든다.


String welcome = "Welcome to";
String java = "Java";
double version = 1.8;
String greeting = String.join(" ", welcome, java, Double.toString(version));//딜리미터는 " "이다
System.out.println(greeting); //Welcome to Java 1.8

문자열 비교


2개의 서로 다른 String형은 equals 메소드를 이용하면 된다. 다만 원시자료형처럼 "=="를 이용해 비교하지는 말자. 이 경우에 String은 객체이기 때문에 객체가 저장된 위치를 비교하게된다. 그렇기 때문에 실제 저장된 값을 비교하지 않는다.
equals 메소드는 대소문자를 구별하므로 대소문자 구별이 불필요하면 equalsIgnoreCase메소드를 사용한다.


String a = "equal";
String b = "Equal";
String c = a;
System.out.println(a.equals(b)); //false
System.out.println(a==b.toLowerCase()); //false
System.out.println(a==c); //true
System.out.println(a.equalsIgnoreCase(b)); //true

String형을 비교할때 null 값을 가진 String과 "" 값을 가진 String을 조심해야한다. null 값은 String 객체에 아무런 값도 어싸인되지 않음을 뜻하고, ""값은 길이가 0인 문자열 값이 어싸인됨을 뜻한다.


String a = "";
String b = null;
System.out.println(a.equals(b)); //false
System.out.println(a==b); //false
System.out.println(a.equals("")&&a.length()==0); //true
System.out.println(b==null); //true

이 외에도 많은 메소드들이 있다. 더 자세한걸 알고 싶으면 오라클 JDK 1.8 Documentation을 참조하자.


댓글 없음:

댓글 쓰기