유난스런 개발 기록

[JAVA] Day-10 _ String 클래스 (String Class),(자주 사용하는 메소드 정리) 본문

개념정리/JAVA

[JAVA] Day-10 _ String 클래스 (String Class),(자주 사용하는 메소드 정리)

yourhwan 2023. 1. 22. 20:31

day-10

String 클래스


String 클래스란? 

  • String 클래스는 문자열을 보다 쉽게 활용할 수 있는 다양한 클래스를 제공한다.
  • java.lang 패키지에 포함되어 있어서. 해당 패키지를 import하면 패키지 안에 포함된 모든 클래스를 이용할 수 있다.
  • 하지만 실제로 java.lang 패키지에 있는 클래스들은 import를 하지 않고 이용할 수 있다.

 

자주 사용하고 알아두면 좋은 String클래스의 method들을 살펴보자.

 

charAt()

// === 1. "문자열".charAt(int index) ===

// "안녕하세요".cahrAt(2) ==> '하'
// index => 01234

위의 예시 코드와 같이 charAt() 메소드를 이용할 수 있다.

() 안에 인덱스를 입력하면 문자열에서 해당하는 인덱스의 글자를 추출할 수 있다.

'하'가 출력 된 것은 자바에서 인덱스는 0 부터 시작하기 때문에

index 0 => (안)

index 1 => (녕)

index 2 => (하)

위와 같은 순서로 이루어져 있기 때문이다.

 

그렇다면 마지막 인덱스 부터 거꾸로 출력하려면 어떻게 해야할까?

String str = "안녕하세요";

String result = ""; // 추출한 index를 넣어주기 위해 result라는 변수를 선언하고 기본값으로 초기화해준다.

for( int i=str.length()-1; i=>0; i--) {
	result += str.charAt(i); // result에 반복하며 나온 i의 값을 쌓아준다.
}

System.out.println(result); // result에 쌓인 결과 출력
// 요세하녕안

int i를 배열의 길이로 설정하되, -1을 해주어야 마지막 인덱스 부터 반복문을 거꾸로 실핼할 수 있다.

배열의 길이는 '글자 수'라고 생각하면 되는데, "안녕하세요" 의 글자 수는 5글자라서 배열의 길이는 5다.

인덱스는 0 부터 시작하기 때문에 0,1,2,3,4 로 구성되어 있다.

때문에 마지막 인덱스를 지정해주기 위해서는 배열길이에서 -1을 해주어야 한다.

 

toCharArray()

// === 2. "문자열".toCharArray() ===
// "안녕하세요".toCharArray() ==> char 타입의 배열로 만들어준다.
// -----------------------
// |'안'|'녕'|'하'|'세'|'요'|
// -----------------------
// 0 1 2 3 4 <=== index

toCharArray()는 문자열을 문자로 하나씩 뽑아서 배열에 넣어주는 역할을 한다.

"안녕하세요"를 거꾸로 출력하는 예시 코드를 보자

char[] chArr = "안녕하세요".toCharArray(); // char 타입의 배열 chArr을 생성하고 "안녕하세요"를 넣어준다.
String result = ""; // toCharArray로 만들어진 값들을 저장해줄 변수를 선언한다.

for(int i = chArr.length - 1; i >=0; i--) {
	result += chArr[i];
}
System.println(result);
//요세하녕안

문자열 "안녕하세요"를 char타입의 배열에 하나씩 넣어주기 위해

char[] chArr을 선언하고 "안녕하세요"를 넣어준다. 

이 과정을 toCharArray 메소드로 진행하는 것이다.

나머지 과정은 chatAt()과 동일하다.

 

substring()

// === 3. "문자열".substring(int 시작인덱스, int 끝인덱스) ===
// "안녕하세요".substring(1,4) ==> 1번 인덱스인 "녕" 부터 4번 인덱스 앞에까지 뽑아온다.
//안 | 녕 | 하 | 세 | 요
//  0 | 1 | 2 | 3 | 4

String str = "안녕하세요".substring(1,4);
System.out.println(str);
// 녕하세

substring()의 기본적인 사용법이다. () 안에 시작 인덱스와 끝 인덱스를 지정해주면,

해당 인덱스에 해당하는 값들 안의 모든 인덱스가 선택이 된다. 즉, 지정해준 마지막 인덱스 앞 까지만 뽑아온다. 

 

그렇다면 시작 인덱스만 적으면 어떻게 될까?

// === 4. "문자열".substring(int 시작인덱스) ===
// "안녕하세요".substring(2) ==> 2번 인덱스인 "하" 부터 끝까지 뽑아온다.

String str = "안녕하세요".substring(2);
System.out.println(str);
// 하세요

시작 인덱스만 넣어주면 시작 인덱스 부터 마지막 인덱스 까지 선택이 된다.

 

indexOf()

// === 5. "문자열".indexOf("찾을문자열") ===
// "문자열" 에서 최초로 나오는 "찾을문자열"의 인덱스(int)를 알려준다.
int index = "시작하라 안녕하세요 건강하세요".indexOf("하");
// 012
System.out.println(index); // 2

index = "시작하라 안녕하세요 건강하세요".indexOf("하세");
// 01234567
System.out.println(index); // 7

index = "시작하라 안녕하세요 건강하세요".indexOf("A");
System.out.println(index); // -1 찾고자 하는 문자열이 없으면 -1 이 나온다.

"하세"의 경우 해당 두 글자를 하나의 인덱스로 친다.

때문에 "하세"의 인덱스는 7이 된다.

또한

찾고자 하는 인덱스가 없으면 출력값으로 -1이 나온다

 

lastIndexOf()

// === 6. "문자열".lastIndexOf("찾을문자열") ===
// "문자열" 에서 마지막으로 나오는 "찾을문자열"의 인덱스(int)를 알려준다.
index = "시작하라 안녕하세요 건강하세요".lastIndexOf("하");
      // 012
System.out.println(index); // 13
			 		
index = "시작하라 안녕하세요 건강하세요".lastIndexOf("하세");
      // 01234567
System.out.println(index); // 13
			 		
index = "시작하라 안녕하세요 건강하세요".lastIndexOf("A");
System.out.println(index); // -1  찾고자 하는 문자열이 없으면 -1 이 나온다.

  마지막 "하"에 해당하는 인덱스를 출력해준다.

공백도 하나의 인덱스로 인식하기 때문에 반드시 포함시켜야한다!!!.

 

split()

// === 7. "문자열".split("구분자") ===
// "문자열" 을 "구분자" 로 잘라서 String 타입의 배열로 돌려주는 것이다.

String food = "파스타,국밥,볶음밥,고구마,계란말이";

String[] foodArr = food.split(",");
// {"파스타","국밥","볶음밥","고구마","계란말이"}

System.out.println("foodArr.length => " + foodArr.length);
// foodArr.length => 5

for (int i = 0; i < foodArr.length; i++) {
	System.out.println(foodArr[i]);
		} // 파스타
		  // 국밥
		  // 볶음밥
		  // 고구마
		  // 계란말이

문자열 배열을 지정해준  , 로 구분지어준다.

 

그렇다면 다른 문자를 사용해서 구분지어주면 어떻게 될까?

String food = "파스타,국밥,볶음밥,고구마,계란말이";

String[] foodArr = food.split(",");
// 출력이 안된다.
System.out.println("foodArr.length => " + foodArr.length);
// foodArr.length => 0
// 인식하지 못한다.

for (int i = 0; i < foodArr.length; i++) {
	System.out.println(foodArr[i]);
		}
        // 출력이 안된다

실행해보면

foodArr.length => 0 라고 출력이 되며

String food에 넣어준 값은 출력이 되지 않는다.

즉 . 을 단독으로 사용할 경우 구분자로 인식하지 못한다는 것이다.

split 사용시 구분자로 . | /  등 특수문자를 사용하려고 할 경우에는 구분자로 인식을 못할 경우가 많으므로

구분자 앞에 \\ 를 붙이거나 []를 씌워주면 된다.

ex) \\구분자 or [구분자]

 

코드를 통해 확인해보자

\\ 의 사용

String food = "파스타.국밥.볶음밥.고구마.계란말이";
String[] foodArr = food.split("\\.");
// {"파스타"."국밥"."볶음밥"."고구마"."계란말이"}
		
System.out.println("foodArr.length => " + foodArr.length); 
// foodArr.length => 5
		
for (int i = 0; i < foodArr.length; i++) {
	System.out.println(foodArr[i]);
		} // 파스타
		  // 국밥
		  // 볶음밥
		  // 고구마
		  // 계란말이

[] 의 사용

String food = "파스타.국밥.볶음밥.고구마.계란말이";
String[] foodArr = food.split("[.]");
// {"파스타"."국밥"."볶음밥"."고구마"."계란말이"}
		
System.out.println("foodArr.length => " + foodArr.length); 
// foodArr.length => 5
		
for (int i = 0; i < foodArr.length; i++) {
	System.out.println(foodArr[i]);
		} // 파스타
		  // 국밥
		  // 볶음밥
		  // 고구마
		  // 계란말이

위와 같이 \\ 와 [] 를 같이 이용하면 구분자로서 역할을 수행할 수 있다.

| 의 경우도 마찬가지로 적용이 된다.

[]를 사용하는 것이 가독성 측면에서 더 좋다.

 

split() 괄호에 정규식을 \\d 와 \\D 를 사용하면 해당 문자열의 숫자와 문자를 제거할 수 있다.

예시 코드를 통해 확인해보자.

 

\\d

Sting food = "파스타1국밥2볶음밥3고구마4계란말이";

String[] foodArr = food.split("\\d"); // 위와 같이 \\를 하는 것 보다 []를 쓰는게 알아보기 편하다.
// \\d에서 d는 정규표현식의 하나로써 숫자를 의미한다.
// 즉, 숫자가 구분자가 되는 것이다.

System.out.println("foodArr.length => " + foodArr.length);
// foodArr.length => 5

for (int i = 0; i < foodArr.length; i++) {
	 System.out.println(foodArr[i]);
		} // 파스타
		  // 국밥
		  // 볶음밥
	 	  // 고구마
		  // 계란말이

 

\\D

String food = "파스타1국밥2볶음밥3고구마4계란말이";

String[] foodArr = food.split("\\D"); // 위와 같이 \\를 하는 것 보다 []를 쓰는게 알아보기 편하다.
// \\D에서 D는 정규표현식의 하나로써 숫자가 아닌 것을 의미한다.
// 즉, 문자가 지워지는 것이다.
// {"1","2","3","4","5"}

System.out.println("foodArr.length => " + foodArr.length);
// foodArr.length => 5

for (int i = 0; i < foodArr.length; i++) {
	System.out.println(foodArr[i]);
		}
// 1
//
// 2
//			
//			
// 3
//			
//			
// 4

 

여기서 한 가지!

여러 코드들과 문자들을 출력하다 문득 궁금했다.만약 "" 안에 ""를 그리고 \를 넣어주고싶다면 어떻게 해야할까?

이럴 때는 escape 문자를 사용하면 된다.

원하는 특수문자 앞에 \ 한개만 붙여주면 된다.

예시 코드를 통해 확인해보자.

// == <참고> \ 를 'escape 문자' 라고 부른다. ==

System.out.println("나의 이름은 \"이순신\" 입니다.");
// 나의 이름은 "이순신" 입니다.

System.out.println("C:\\movie\\아바타2.mp4");
// C:\movie\아바타2.mp4

 

 

String.join()

split()은 구분자를 통해 문자열을 나누어줬다면

String.join()은 구분자를 기준으로 문자열을 합쳐서 String 타입으로 돌려준다. 

// === 8. String.join("구분자", 문자열타입의배열명) ===
// 문자열타입의배열을 "구분자"로 합쳐서 String 타입으로 돌려주는 것이다.
			
String[] nameArr = {"한석규","두석규","세석규","네석규","오석규"};
String names = String.join("-", nameArr);
System.out.println(names);
// 한석규-두석규-세석규-네석규-오석규

 

 

replaceAll()

// === 9. "문자열".replaceAll("변경대상문자열", "새로이변경될문자열") ===
// "문자열" 에서 "변경대상문자열" 을 모두 "새로이변경될문자열" 로 교체해서 반환해주는 것이다.
		
String[] nameArr = {"한석규","두석규","세석규","네석규","오석규"};
String names = names.replaceAll("석규", "SK");
System.out.println(names);
// 한SK-두SK-세SK-네SK-오SK

여기서 궁금증이 생길 수 있다!

replaceAll() 말고 생김새가 비슷한 replace() 을 사용해보거나 본 적이 있었는데,

그렇다면 replaceAll() 과 replace() 의 차이점은 무엇일까?

 

"문자열".replace()정규표현식 사용 불가능

"문자열".replaceAll()정규표현식 사용 가능

예시 코드를 통해 다양한 경우들을 확인해보자 

 // 변수 str 에서 a 또는 b 또는 c 라는 글자가 있으면 삭제하려고 한다.

str = "java abcd javascript";
str = str.replace("a", "").replace("b", "").replace("c", "");
// "jv bcd jvscript"
// "jv cd jvscript"
// "jv d jvscript"
	 	 	
System.out.println(str);
// jv d jvscript
	 	 	
str = "java abcd javascript";
str = str.replaceAll("[abc]", ""); // replaceAll 은 정규표현식도 사용이 가능하다. 
System.out.println(str);
// jv d jvsript
	 	 	
str = "ja7va 98abc12d jav555ascri52pt1300";
str = str.replaceAll("[0123456789]", ""); // 숫자인것만 제거하라는 뜻이다.
System.out.println(str);
// java abcd javascript
	 	 	
str = "ja7va 98abc12d jav555ascri52pt1300";
str = str.replaceAll("[0-9]", ""); // 숫자인것만 제거하라는 뜻이다.
System.out.println(str);
 // java abcd javascript
	 	 	
str = "ja7va 98abc12d jav555ascri52pt1300";
str = str.replaceAll("[0-4689]", ""); // 숫자중에 5와7을 뺀 숫자만 제거하라는 뜻이다.
System.out.println(str);
// ja7va abcd jav555ascri5pt
	 	 	
str = "ja7va 98abc12d jav555ascri52pt1300";
str = str.replaceAll("[^0-9]", ""); // 숫자가 아닌것만 제거하라는 뜻이다.
System.out.println(str);
// 79812555521300
	 	 	
str = "ja7va 98abc12d jav555ascri52pt1300";
str = str.replaceAll("\\d", ""); // 숫자인것만 제거하라는 뜻이다.
System.out.println(str);
// java abcd javascript
	 	 	
str = "ja7va 98abc12d jav555ascri52pt1300";
str = str.replaceAll("\\D", ""); // 숫자가 아닌것만 제거하라는 뜻이다.
System.out.println(str);
// 79812555521300
	 	 	
str = "java KOREA 0070 @#$@!";
str = str.replaceAll("[a-z]", ""); // 소문자만 제거하라는 뜻이다.
System.out.println(str);
//  KOREA 0070 @#$@!
	 	 	
str = "ja88va_ KOss_REA 00abc70 @#$java@!";
str = str.replaceAll("[a-zA-Z0-9_ ]", ""); // 소문자 및 대문자 및 숫자 및 _ 및 공백을 제거하라는 뜻이다.
System.out.println(str);
// @#$@!
	 	 	
	 	 	
str = "ja#88va_ KOss_REA 00abc70 @#$java@!";
str = str.replaceAll("[\\w]", ""); // 소문자 및 대문자 및 숫자 및 _ 을 제거하라는 뜻이다.
// 정규표현식에서 \\w 은 word(단어)라는 뜻으로 대문자,소문자,숫자,_ 까지를 말한다.  
System.out.println(str);
// #   @#$@!
	 	 	
str = "ja#88va_ KOss_REA 00abc70 @#$java@!";
str = str.replaceAll("[\\w ]", ""); // 소문자 및 대문자 및 숫자 및 _ 및 공백을 제거하라는 뜻이다.
// 정규표현식에서 \\w 은 word(단어)라는 뜻으로 대문자,소문자,숫자,_ 까지를 말한다.  
System.out.println(str);
// #@#$@!
	 	 	
str = "ja#88va_ KOss_REA 00abc70 @#$java@!";
str = str.replaceAll("[^a-zA-Z0-9_]", ""); // 소문자 및 대문자 및 숫자 및 _ 을 제외한 나머지를 제거하라는 뜻이다.
// 정규표현식에서 \\w 은 word(단어)라는 뜻으로 대문자,소문자,숫자,_ 까지를 말한다.  
System.out.println(str);
// ja88va_KOss_REA00abc70java
	 	 	
str = "ja#88va_ KOss_REA 00abc70 @#$java@!";
str = str.replaceAll("[\\W]", ""); // 소문자 및 대문자 및 숫자 및 _ 을 제외한 나머지를 제거하라는 뜻이다.
// 정규표현식에서 \\W 은 word(단어)가 아닌것 이라는 뜻으로 대문자,소문자,숫자,_ 를 제외한 나머지를 말한다.  
System.out.println(str);
// ja88va_KOss_REA00abc70java

 

 

replaceFirst()

// === 10. "문자열".replaceFirst("변경대상문자열", "새로이변경될문자열") ===
// "문자열" 에서 "변경대상문자열" 을 첫번째만 "새로이변경될문자열" 로 교체해서 반환해주는 것이다.

String[] nameArr = {"한SK","두SK","세SK","네SK","오SK"};
String names = names.replaceFirst("SK", "석규");
System.out.println(names);
// 한석규-두SK-세SK-네SK-오SK

 

 

startsWith()

// === 11. "문자열".startsWith("찾고자하는문자열") ===

// "문자열" 에서 "찾고자하는문자열"이 맨첫번째에 나오면 true를 반환,
// "문자열" 에서 "찾고자하는문자열"이 맨첫번째에 나오지 않으면 false를 반환,

// "건강" 이라는 단어로 시작하는 것만 출력하세요.

String[] contents = { "호호안녕하세요", "건강하세요", "행복하세요 또봐요", "즐겁고 건강한 하루되세요" };

for (int i = 0; i < contents.length; i++) {
	if (contents[i].startsWith("건강")) {
		System.out.println(contents[i]);
			}
		} // 건강하세요

 

 

endsWith()

// === 12. "문자열".endsWith("찾고자하는문자열") ===

// "문자열" 에서 "찾고자하는문자열"이 맨첫번째에 나오면 true를 반환,
// "문자열" 에서 "찾고자하는문자열"이 맨첫번째에 나오지 않으면 false를 반환,
        
// "하세요" 이라는 단어로 시작하는 것만 출력하세요.

String[] contents = { "호호안녕하세요", "건강하세요", "행복하세요 또봐요", "즐겁고 건강한 하루되세요" };

for (int i = 0; i < contents.length; i++) {
	if (contents[i].endsWith("하세요")) {
		System.out.println(contents[i]);
	}
} // 호호안녕하세요
  // 건강하세요

 

 

trim()

// === 13. "문자열".trim() ===	

// "문자열"의 좌,우에 공백이 있다면 공백을 모두 제거하고서 반환해준다.
String insa = "           수고        많으셨습니다           ";
System.out.println("하하하" + insa + "내일 뵐게요~~");
// 하하하 수고 많으셨습니다 내일 뵐게요~~

System.out.println("하하하" + insa.trim() + "내일 뵐게요~~");
// 하하하수고 많으셨습니다내일 뵐게요~~

 

 

isEmpty()

// === 14. "문자열".isEmpty() ===

// "문자열" 이 아무것도 없으면 true 를 반환해주고,
// "문자열" 이 뭔가 있으면 false 를 반환해준다.

String str1 = "", str2 = "abc", str3 = "          ";

System.out.println(str1.isEmpty()); // true
System.out.println(str2.isEmpty()); // false
System.out.println(str3.isEmpty()); // false
System.out.println(str3.trim().isEmpty()); // true

 

 

toUpperCase()

// === 15. "문자열".toUpperCase() ===

// "문자열" 에서 소문자가 있으면 모두 대문자로 변경해서 반환해줌.

String words = "My Name is Tom 입니다.";
System.out.println(words.toUpperCase());
// MY NAME IS TOM 입니다.

 

 

toLowerCase()

// === 16. "문자열".toLowerCase() ===

// "문자열" 에서 대문자가 있으면 모두 소문자로 변경해서 반환해줌.

String words = "My Name is Tom 입니다.";
System.out.println(words.toLowerCase());
// my name is tom 입니다.

 

 

equals()

// === 17. "문자열".equals("비교대상문자열") ===

// 대문자와 소문자를 구분하면서
// "문자열" 과 "비교대상문자열" 의 값이 일치하면 true 를 반환.
// "문자열" 과 "비교대상문자열" 의 값이 일치하지 않으면 false 를 반환.

String[] strArr = { "korea", "seoul", " KOREA seoul", "Korea 대한민국", "서울 kOrEA 만세", null };

// 검색어를 "korea" 라는 글자가 들어있는 것만 출력하세요.

for (int i = 0; i < strArr.length; i++) {

	if ("korea".equals(strArr[i]))
    	// if("korea".equals("korea")
		// if("korea".equals("seoul")
		// if("korea".equals("KOREA seoul")
		// ...
		// if("korea".equals(null)
		
        System.out.println(strArr[i]);
			
		// 아래의 방식대로 하면 NullPointerException 이 유발될 수 있다.

		// if(strArr[i].equals("korea")) // if("korea".equals("korea")
		// if("seoul".equals("korea")
		// if("KOREA seoul".equals("korea")
		// ...
		// if(null.equals("korea")

		// System.out.println(strArr[i]);
		} // end of for------------------------

 

 

equalsIgnoreCase()

// === 18. "문자열".equalsIgnoreCase("비교대상문자열") ===

// 대문자와 소문자를 구분하지 않으면서
// "문자열" 과 "비교대상문자열" 의 값이 대,소문자와 관계없이 일치하면 true 를 반환.
// "문자열" 과 "비교대상문자열" 의 값이 대,소문자와 관계없이 일치하지 않으면 false 를 반환.

// 검색어를 "korea" 또는 "KOREA" 또는 "kOreA" 또는 "kOreA" 와 같이 했을때에
// 대,소문자를 구분치 않고 "korea" 라는 글자가 들어있는 것만 출력하세요.

String[] strArr = { "korea", "seoul", " KOREA seoul", "Korea 대한민국", "서울 kOrEA 만세", null };

String search = "kOreA"; // "korea" , "KOREA" , "kOreA"

for (String s : strArr) { // 배열 strArr 크기만큼 반복한다.
									// 즉, 6번 반복한다.

	search = search.toLowerCase(); // "korea"

	// 첫번째 반복일 경우
	// String s = "korea";

	// 두번째 반복일 경우
	// String s = "seoul";

	// 세번째 반복일 경우
	// String s = "KOREA seoul";

	// 네번째 반복일 경우
	// String s = "KOREA 대한민국";

	// 다섯번째 반복일 경우
	// String s = "서울 kOrEA 만세";

	// 여섯번째 반복일 경우
	// String s = null;

		if (s != null && s.toLowerCase().indexOf(search) != -1) {
			// 일단 null이 아니기 때문에 !=로 제외시키고 배열에 저장되어 있는 소문자로 바꾸고
			// 검색에 있는 값도 소문자로 바꿔주고 그게 없는 값(-1)이 아니어야한다.
			// s.toLowerCase() 은 "korea", "seoul", "korea seoul", "korea 대한민국", "서울 korea 만세"
			// search 는 "korea"
				
			System.out.println(s);
			// korea
			// KOREA seoul
			// Korea 대한민국
			// 서울 kOrEA 만세
		}

	} // end of for-----------------------------------

/*
"korea"
" KOREA seoul"
"Korea 대한민국"
"서울 kOrEA 만세"
*/

 

 

오늘은 String Class에서 자주 사용하는 메소드들을 공부했다.

위에 기록해 둔 메소드는 앞으로 정말 많이 사용할 것이기 때문에

그 사용법과 정의를 꼭 외워둬서 언제든 사용할 수 있도록 익숙해지자!