-
3. Java 문자열(String) 다루기프로그래밍언어/Java(초급) 2020. 3. 27. 02:25
안녕하세요 현우입니다. 이번 포스팅은 [ String (문자열)다루기 ] 입니다.
reference
https://docs.oracle.com/javase/8/docs/api/index.html
1. String 클래스의 인스턴스 생성
기존의 클래스들은 키워드 new을 이용해서 인스턴스를 생성 했지만, String의 인스턴스는 큰따옴표만으로도 생성이 가능하다
- String str1 = "Hello World"
대입연산자(String str1) 의 왼편은 인스턴스 생성시 반환되는 참조값의 저장을 위한 참조변수 일뿐이고 실제 인스턴스 생성은 대입 연산자의 오른편에서 이루어진다
- System.out.pringln("Hello JPA!");
println 메소드는 매개변수형이String이다. 즉 println메소드 중 하나는(println 메소드는 오버로딩되어있다) 다음의 형태로 정의 되어있다.
- public void println(String str) {...}
인스턴스가 생성되면 인스턴스를 참조할 수 있는 참조 값(주소 값)이 반환된다고 하였다. 우리는 보통 이 값을 참조 변수에 저장한 다음, 참조 변수를 통해서 메소드를 호출한다 하지만 아래의 문장처럼 인스턴스 생성시 반환되는 참조값을 바로 이용해서 메소드를 호출 할 수 있다. 즉 큰 따옴표로 표현되는 문자열이 인스턴스 생성임을 이해할 수 있다
- int strLen2 = "이 문장의 길이는?".length();
2. String의 인스턴스에 저장된 문자열은 데이터의 변경 및 직접 접근이 불가능하다.
인스턴스 생성은 시스템에 부담이 되는 요소이다. 그런데 자바에서 문자열을 표현할 때마다 인스턴스가 생성되니,
인스턴스의 생성을 최소화 할 필요가 있었다. 또한 같은 인스턴스를 공유하고 있는 문자열값은 하나의 문자열 값만 바꾸더라도 공유 하고있는 모든 문자열이 바뀐다. 그래서 다음과 같은 원칙을 기준으로 인스턴스가 생성되도록 Stirng클래스를 정의 하였다.- 문자열이 동일한 경우에는 하나의 String 인스턴스만 생성해서 공유하도록 한다
String str1 = "abc" String str2 = "abc" String str3 - "def" //참조변수가 저장하고 있는 참조값 동등비교 if(str1==str2) println("동일 인스턴스 참조"); else println("다른 인스턴스 참조"); if(str2==str3) println("동일 인스턴스 참조"); else println("다른 인스턴스 참조"); ================================== result 동일 인스턴스 참조 다른 인스턴스 참조
3. 기능 메소드
- 문자열 길이반환 length()
- 두문자열 결합 concat()
- 두문자열 비교 compareTo()
- 문자열 복사 새로운 인스턴스를 생성한다
String str1 = "Spring"; String str2 = "and"; String str3 = "JPA"; String str4 = str1.concat(str2).concat(str3) //문자열의 + 연산(println 메소드 호출)과 동일한 결과를 얻을 수 있다. String str5 = new String(str1); println(str4); println("문자열 길이 : "+ str4.length()); if(str1.compareTo(str3)<0) //사전순에 따라 0보다 큰값 혹은 작은값이 반환된다 println("str1이 앞선다"); else println("str3이 앞선다"); if(str1==str5) println("동일한 인스턴스 참조"); else println("다른 인스턴스 참조"); ================================== result SpringandJpa 문자열 길이 : 12 str1이 앞선다 다른 인스턴스 참조
4. StringJoiner & Join
join() 메서드는 문자열에 구분자를 넣어 결합하거나 분리하는 기능을 제공하며. 최근 프로그램에서 데이터 조작이 많아지고 특히 입사시험등에 많이 사용되는 코딩테스트등에 유용하게 사용되는 기능 이다.
String cars = "hyundai,mercedes,bmw"; String[] arr = cars.split(","); // ["hyundai","mercedes","bmw"] String str = String.join("-", arr); System.out.println(str); // hyundai-mercedes-bmw
- split() 메서드는 StringTokenizer 클래스를 사용해 구현할수도 있음.
StringJoiner 클래스는 문자열 결합을 도와주는 클래스로 형식에 맞게 문자열을 결합하는데 이용할 수 있다.
StringJoiner sj = new StringJoiner(",", "[", "]"); String[] carArr = { "hyundai", "mercedes", "bmw" }; for(String s : carArr) sj.add(s.toUpperCase()); System.out.println(sj.toString()); // [HYUNDAI,MERCEDES,BMW]
trim(), substring(), replace(), toCharArr()
trim() 은 문자열 양쪽의 공백을 제거해 주는 메서드 이고 substring은 정의한 인덱스를 포함한 문자열만 보여준다.String s1 = " Hello World "; System.out.println(s1.trim()); // Hello World String s2 = s1.substring(1,3) System.out.println(s1.trim()); // He System.out.println(s1.replace('l','k')); // Hekko Workd Char[] carr = s2.toCharArr(); // ['H','e','l','l','o',' ','W','o','r','l','d',] 공백생략.
5. + 연산과 += 연산의 진실
String longstr = "aaa"+"bbb"+"ccc"+"ddd"; 자바 문자열 결합 과정에서 + 연산자 수만큼 (혹은 그 이상) 인스턴스가 생성 되는 것으로 알고 있는 분들이 매우많지만 이건 사실이 아니다. 아무리 많은 문자열 수를 결합하더라도 생성되는 인스턴스 수는 최대 두개를 넘지 않는다.
String str1 = "Hibernate" + "abc"; String str2 = "Hibernate" + 'A'; String str3 = "Hibernate" + 3; String str4 = 1 + "Hibernate" + 2; str4 += '!'; println(str1); println(str2); println(str3); println(str4); ================================== result Hibernateabc HibernateA Hinbernate3 1Hinernate2!
str1 의 경우 자바 컴파일러가 +연산자를 적절한 메소드 호출문으로 변환하기 때문에 .concat()메소드와 같은 결과를 낼수 있다. 하지만 char형 데이터 또는 int형 데이터를 인자로 받는 concat메소드는 정의되어 있지 않으므로 다음과 같이 처리된다.
- String str2 = "Hibernate.concat(String.valueOf('A'));
- String str3 = "Hibernate.concat(String.valueOf(3));
ValueOf 메소드는 String 클래스에서 다음과같이 오버로딩 되어 있다.
-
public static String valueOf(boolean b)
-
public static String valueOf(char c)
-
public static String valueOf(int i)
-
public static String valueOf(long l)
-
public static String valueOf(float f)
-
public static String valueOf(dobule b)
이들은 모두 전달 되는 데이터를 문자열(Spring 인스턴스)로 변환해서, 해당 인스턴스의 참조 값을 반환하는 static 메소드 들이다. 따라서 다음 두문장에서 String.valueOf메소드의 호출이 완료되고 나면 다음과 같은 문장이 구성되어 컴파일 된다.
- String str2 = "Hibernate".concat("A");
- String str3 = "Hibernate".concat(3);
6. 문자열 결합의 최적화 : Optimization of String Concatenation
String str4 = String.valueOf(1).concat("Hibernate").concat(String,valueOf(2));
해당 문자열은 총 다섯개의 String 인스턴스 생성으로 이어지는데 이는 두번의 +연산에 대한 결과로는 너무 과혹하다
다행히도 자바 컴파일러의 문자열 겨합 연산에 대한 최적화 수행으로 인하여 문자열의 + 연산에 대해서 추가적인 인스턴스의 생성은 두개로 제한이 된다.- String str4 = new StringBuilder().append(1).append("Hibernate").append(2).toString();
* StringBuilder과 StringBuffer클래스에 대해 알아보기
'프로그래밍언어 > Java(초급)' 카테고리의 다른 글
2. OOP(Object Oriented Programming) 상속 (0) 2020.04.02 1. OOP(Object Oriented Programming) 캡슐화 (0) 2020.04.01 5. Collection 프레임워크 (ArrayList vs LinkedList) (0) 2020.03.29 4. StringBuilder & StringBuffer 클래스 다루기 (0) 2020.03.27 1. BufferReader VS Scanner 차이점 (0) 2020.03.27