JAVA_String 클래스

JW__1.7·2022년 7월 25일
0

JAVA 공부일지

목록 보기
9/30

String 클래스

  • 패키지 : java.lang
  • 하나의 문자열을 표현할 때 사용
  • byte[], char[], String, StringBuilder 등 여러 매개변수를 이용해서 생성

문자열 "hello"를 만들기

1. String str = "hello";

2. char[] data = {'h', 'e', 'l', 'l', 'o'}; 
   String str = new String(data);

3. String str = new String("hello");

4. byte[] bytes = "hello".getBytes(); 
   String str = new String(bytes);

5. StringBuilder sb = new StringBuilder(); 	
   sb.append("hello");
   String str = new String(sb);

문자열 리터럴

  • 리터럴로 생성되는 문자열은 JVM이 관리
  • 동일한 문자열이 발생되면 JVM이 기존에 생성한 문자열을 재사용

문자열을 동등 비교할 때 ==로 할 경우에는 반환값이 이상하게 나온다.
str1과 str2는 값을 저장한 주소가 같아서 true가 반환된다.
str3와 str4는 저장값이 동일하지만, 주소가 달라서 false가 반환된다.

	String str1 = "hello";
	String str2 = "hello";
    System.out.println(str1 == str2);	// true

JVM에 의해서 생성된 문자열 "hello"를 공유하므로 true 반환

	/*
	     |---------|
	str1 |  0x123  |
	     |---------|
	str2 |  0x123  |
	     |---------|
	     | "hello" | 0x123
	     |---------|
	*/

new String

  • 개발자 명령에 의해서 힙(Heap) 영역에 새로운 문자열이 생성된다.
  • 항상 새로 생성하므로 동일한 문자열도 여러 개 생성될 수 있다
	String str3 = new String("hi");		
	String str4 = new String("hi");
	System.out.println(str3 == str4);	// false

서로 다른 두 개의 "hello"가 생성되므로 false 반환

	/*
	     |---------|
	str3 |  0x123  |
	     |---------|
	str4 |  0x456  |
	     |---------|
	     | "hello" | 0x123
	     |---------|
	     | "hello" | 0x456
	     |---------|
	*/		
            

문자열 동등 비교할 떄는 equals 메소드를 사용해야 한다.

1. 문자열 동등 비교 (객체를 이용한 equals 메소드 호출)

equals 메소드를 호출해서 문자열 동등 비교를 하게 되면 ==로 했을 때보다 정확하게 값이 반환 되는걸 볼 수 있다.

	String str1 = "hello";
	String str2 = "hello";
    String str3 = new String("hi");		
	String str4 = new String("hi");

	boolean result1 = str1.equals(str2);
	boolean result2 = str3.equals(str4);
		
	System.out.println(result1);	// true
	System.out.println(result2);	// true
		
	
    if(str1.equals(str2)) {
		System.out.println("str1과 str2는 같다");
	} else {
		System.out.println("str1과 str2는 다르다");
	}	// str1과 str2는 같다
	
    
    // 가급적이면 부정!은 사용하지 않는다 (잘보이지 않고, 흐름이 어색하다)
	if(!str3.equals(str4)) {
		System.out.println("str3과 str4는 다르다");
	} else {
		System.out.println("str3과 str4는 같다");
	}	// str3과 str4는 같다

2. 대소문자를 무시한 문자열 동등 비교

  • equalsIgnoreCase();
	String str5 = "Hello World";
	String str6 = "hELLO wORLD";
	boolean result3 = str5.equalsIgnoreCase(str6);		
    // Upper Case, Lower Case
				
	System.out.println(result3);	// true

3. 문자열 길이 반환

  • length();
	String name = "우영우";
	int length = name.length();
	System.out.println("글자수 : " + length);	// 글자수 : 3

4. 특정 위치의 문자(char)만 반환

  • charAt(위치숫자);
  • 인덱스 (Index)
    배열의 요소마다 붙여진 일련번호로 각 요소를 구별할 수 있다.
    쉽게 말하면 글자마다 부여된 정수값이며, 0부터 시작한다.
    범위 : 0 ~ (배열길이 -1)
	String name = "우영우";
	System.out.println(name.charAt(0));	// 우
	System.out.println(name.charAt(1));	// 영
	System.out.println(name.charAt(2));	// 우

5. 문자열의 일부 문자열 (String)을 반환 ★

  • substring(begin) : 인덱스 begin(포함)부터 끝까지 반환
  • substring(begin, end) : 인덱스 begin(포함)부터 인덱스 end(불포함)까지 반환
	String name = "우영우";
	System.out.println(name.substring(0, 1));	// 우
	System.out.println(name.substring(1));	// 영우

6. 특정 문자열을 찾아서 해당 인덱스(int)를 반환

  • indexOf
    - 첫 번째 문자열의 인덱스를 반환
    - 문자열이 없는 경우 -1을 반환
  • lastIndexOf
    - 마지막 문자열의 인덱스를 반환
    - 문자열이 없는 경우 -1을 반환
	String name = "우영우";
	int idx1 = name.indexOf("우");	
	int idx2 = name.indexOf("영");
	int idx3 = name.lastIndexOf("우");
	int idx4 = name.lastIndexOf("영");
    
	System.out.println(idx1);	// 0
	System.out.println(idx2);	// 1
	System.out.println(idx3);	// 2
	System.out.println(idx4);	// 1

7. 문자열이 특정 패턴으로 시작하는지 boolean (true, false) 반환

  • startsWith(문자열)
	String name = "우영우";		
	if(name.startsWith("민")) {
		System.out.println("민씨입니다.");
	} else {
		System.out.println("민씨가 아닙니다.");
	}	// 민씨가 아닙니다.

8. 문자열이 특정 패턴으로 끝나는지 여부를 boolean (true, false) 반환

  • endWith(문자열)
	String filename = "image.jpg";		// jpg, png로 끝나면 이미지로 가정
	if(filename.endsWith("jpg") || filename.endsWith("png")) {
		System.out.println("이미지입니다.");
	} else {
		System.out.println("이미지가 아닙니다.");
	}	// 이미지입니다.

9. 문자열이 특정 패턴을 포함하는지 여부를 boolean (true, false) 반환

  • contains(특정패턴)
	String email = "jw_17@naver.com";
	if(email.contains("@") && email.contains(".")) {
		System.out.println("이메일입니다.");
	} else {
		System.out.println("이메일이 아닙니다.");
	}	// 이메일입니다.

10. 불필요한 공백 제거 (좌우 공백)

  • trim()
	String message = "  안녕  하세요  ";
	System.out.println(message.trim());				// 안녕  하세요
	System.out.println(message.trim().length());	// 7

11. 대소문자 변환하기

  • toUpperCase() : 대문자로 변환하기
  • toLowerCase() : 소문자로 변환하기
	String source = "best of best";
	System.out.println(source.toUpperCase());	// BEST OF BEST
	System.out.println(source.toLowerCase());	// best of best

12. 찾아 바꾸기

  • replace(old, new) : old를 new로 변환하기
  • replaceAll(regex, reply) 메소드는 특정 문자열을 찾아서 변환하는 것이 아니다.
	String source = "best of best";
	String replaced = source.replace("best", "worst");
	System.out.println(source);		// best of best
	System.out.println(replaced);	// worst of worst
		
	String ip = "192.168.101.91";
	String replacedIp = ip.replaceAll(".", "_");	// 192_168_101_91 를 기대
	System.out.println(replacedIp);	// ______________
    String replacedIp2 = ip.replaceAll("\.", "_");
	System.out.println(replacedIp); // 192_168_101_91

"."은 모든것을 의미한다.
백슬래시를 앞에 붙여주거나 대괄호로 감싸서 해결할 수 있다.

13. 빈 문자열인지 여부를 검사한 뒤 boolean (true, false) 반환

  • isEmpty() : 공백도 문자열로 인식한다.
	String id = " ";
	if(id.isEmpty()) {
		System.out.println("빈 문자열");
	} else {
		System.out.println("빈 문자열 아님");
	}	// 빈 문자열 아님

빈 문자열로 인식하려고 할 때는 trim( )을 같이 사용해주면 된다.

isBlank( )는 공백을 무시한다. 그래서 trim( )을 사용하지 않아도 되지만, JDK 11에 출시된 신기술이라 사용을 지양하는게 좋다.

	String id = " ";
	if(id.trim().isEmpty()) {
		System.out.println("빈 문자열");
	} else {
		System.out.println("빈 문자열 아님");
	}	// 빈 문자열

연습문제

파일이름을 파일명과 확장자로 분리하시오
jpg, git, png 이미지인 경우에만 작업을 진행

		String fullName = "apple.jpg";
		String fillName = "";	// apple
		String extName = "";	// jpg
		
		int idxOfDot = fullName.lastIndexOf(".");	// .을 기준으로 apple과 jpg 분리
		
		fillName = fullName.substring(0, idxOfDot);
		extName = fullName.substring(idxOfDot+1);
		
		System.out.println(fillName);	// apple
		System.out.println(extName);	// jpg

문자열 "abc12345def67890ghijk"에서 아라비아 숫자 1234567890을 제외하고 한 글자씩 화면에 출력하시오.

		String str = "abc12345def67890ghijk";
		
		for(int i = 0; i < str.length(); i++) {
			char ch = str.charAt(i);
			if(ch >= '0' && ch <= '9') {
			continue;	
			}
			System.out.println(ch);
		}	/* a
			   b
			   c
			   d
			   e
			   f
			   g
			   h
			   i
			   j
			   k */

0개의 댓글