문자열 (String)
- 문자열은 내부적으로 '클래스'로 구성되어 있다.
- 내부에는 문자 배열로 된 데이터가 있다. char[]
- 한번 만든 문자열은 변하지 않는다. (Immutable)// 이뮤테이트
- 문자열 편집은 String을 쓰지 않고 StringBuilder나 StringBuffer 등을 사용한다.
문자열 생성
- String 변수명 = "값";을 통해 생성
- 클래스이기에 new생성자 사용해서 생성할 수 있지만 권장하지 않음
- String은 상수풀에 생성되고 중복된 문자를 다른 변수로 생성할때는 해당 값을 참조해서 사용
String s1 = "문자열 생성 방법"; // 보통의 생성 방법, String 변수명 = "값";
String s2 = new String("문자열 생성 방법2"); // 클래스 생성자. 권장하지 않음
String s3 = "abcde"; // String 생성하면 상수풀에 생성됨
String s4 = "abcde"; // 상수풀에 동일한 문자열이 있으면 그것을 참조하고 없으면 생성함
String s5 = new String("abcde"); // 흙빛이 되어버림.. 구지 생성한다고?// 힙메모리에 생성하는건가?
System.out.println(s3 == s4); //true // 문자열을 곧바로 생성할 경우 상수 풀에서 찾아 사용
// String은 immuntable하기에 같은값을 참조해도 문제가 발생하지 않음
System.out.println(s3 == s5); //false // 문자열을 클래스로 생성할 경우 새로운 값을 생성
System.out.println(s3.equals(s4));//true // equals는 무슨 메서드였지? -> String 값비교 메서드.
System.out.println(s3.equals(s5));//true
String 메서드
- length() 스트링의 길이 출력
- charAt(index) index에 위치한 char 출력
- indexOf('char') char이 몇번 index에 위치하는가 출력
- equalsIgnoreCase("string") string과의 값비교 같으면 true(대소문자구분 x)
- replace('i','t') char 'i'를 't'로 바꾸어서 출력(기존 값에는 영향x)
- substring(a, b) index a~(b-1)번째까지 출력해줌 (b는 포함안됨)
- trinm() 양옆의 공백 제거해주는 메소드
- repeat(i) string을 i만큼 반복시켜주는 메서드
- toCharArray() String을 char단위로 새로운 배열에 넣어줌. String배열을 불러오는것이 아닌 새로운 배열을 만드는 것.
- equals(anObject) anObject와 비교한 결과 출력(boolean)
String s = "This is a string.";
System.out.println(s.length()); //16 //length 같이 이름만들어도 기능이 예상되는게 잘지은 이름이다.
//이름을 짓기 어려운 기능은 메서드로 만들지 않는 것이 좋다.
System.out.println(s.charAt(2));//i
System.out.println(s.indexOf('a'));//8 // a가 몇번 인덱스에 위치하는가?
System.out.println(s.equalsIgnoreCase("this Is A STRiNg."));//true//문자열비교해서 같은면true
// 대소문자 구분x
System.out.println(s.replace('i','t'));//Thts ts a strtng.//기존의 String을 바꾸는것은 아님
//변경된 String을 생성해서 출력하는 것
System.out.println(s);//This is a string.// 기존 내용 유지
System.out.println(s.substring(3, 9));//s is a // index 3~8번까지 출력해줌(마지막 인덱스 제외)
System.out.println(" wwefw ".trim());//wwefw// 양옆의 공백 제거해주는 메소드
System.out.println("*".repeat(10));//********** //문자열을 반복해줌
// 추가적인것은 더 찾아서 사용하면 된다.
char[] characters = s.toCharArray();
for(char value : characters){
System.out.println(value);
} // String의 배열을 불러온것이 아닌 새로운 배열을 만든것임// so 여기 배열 내용 변경시켜도 원문에 변화없음
예제
/**
* 도메인 뒤집기
*
* 주어진 홈페이지 주소를 .을 기준으로 각각 뒤집어 출력하시오.
*
* ex) www.google.com -> www.elgoog.moc
*
* 인자
* string: 홈페이지 주소
*/
public class DomainReverse {
public static void main(String[] args) {
//
// // #1 replace()
// String string = "www.google.com";
//
// System.out.println(string.replace("google.com","elgoog.moc"));
//
// // #2 split()
//
// String[] strA = string.split("\\.",0);
//
// for (int i = 0; i <strA.length;i++){
//
// for(int j = strA[i].length()-1 ; j>=0 ; j-- ) {
// System.out.print(strA[i].charAt(j));
// }
// if(i != strA.length-1){
// System.out.print('.');
// }
// }
// System.out.println("");
//
// // #3 String Buffer
//
// for(int i = 0 ; i < strA.length;i++ ){
// StringBuffer sBuffer = new StringBuffer(strA[i]);
// System.out.print(sBuffer.reverse());
// if(i != strA.length-1){
// System.out.print('.');
// }
// }
//
//풀이 예시
String string = "www.google.com";
int i = string.indexOf('.'); // 처음 점 찾기
StringBuilder s = new StringBuilder(string.length());// ()안에 길이를 설정.
while (i > 0) {
StringBuilder s_ = new StringBuilder(string.substring(0, i));//0 ~ i-1까지 짜름// www
string = string.substring(i + 1);// gooogle.com
s.append(s_.reverse());//www을 뒤짚음
s.append('.');
i = string.indexOf('.');
}
s.append(new StringBuilder(string).reverse());// 마지막꺼 뒤짚기기
string = s.toString();// string빌더를 string으로 바꿔주기
System.out.println(string);
}
}