08. 문자열 클래스(String Class) [ JAVA ]

duck-ach·2022년 7월 25일
0

JAVA

목록 보기
8/27

문자열 타입(String type)에 관한 이해

우선 문자열에관한 클래스를 공부하기 전에 문자열이 어떤 형식으로 데이터베이스에 저장이 되는지 알아야 한다.

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

str1과 str2는 같은 0x123 참조값에 저장되므로 0x123 == 0x123 은 true를 반환한다.

만약, 객체를 생성하여 비교를 한다면,

String str3 = new String("hi");
String str4 = new String("hi");
System.out.println(str3 == str4); // false

각 객체는 new로 새로운 주소값을 선언했으므로 0x123 == 0x456은 같지 않다는 false값을 반환한다.

문자열 동등 비교

equals()

문자열 자체가 동등한지 확인할 때는 == 대신 equals()를 사용한다.
앞서 선언했던 객체를 생성하여 비교를 해보겠다.

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

System.out.println(str1.equals(str2)); // true
System.out.println(str3.equals(str4)); // true

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

equalsIsIgnoreCase()

앞서 공부한 equals()는 문자열 중 한 글자만이라도 대소문자가 다르다면 false를 반환한다.

예를 들어, 이름이 Tom인 사람이 있다면 Tom도 tom도 같은 사람이니까 대소문자를 무시한 문자열 동등비교를 해보겠다.

equals동등하다를 의미하며,
Ignore무시,
Case대소문자를 나타낸다.

Upper Case 대문자
Lower Case 소문자

String str5 = "Hello World";
String str6 = "hELLO wORLD";
boolean result3 = str5.equalsIgnoreCase(str6); // true

문자열 길이 반환

length()

문자열의 길이를 구하는 것이다. 예를들면 "우영우" 는 3을 반환한다.
length()메소드는 공백도 문자열에 포함되어 반환한다.

	String name = "Duck ach";
	int length = name.length();
	System.out.println("글자 수 : " + length); // 글자수 : 8

특정 문자(Char) 반환

charAt()

String name = "Duck ach";
	System.out.println(name.charAt(0)); // D
	System.out.println(name.charAt(1)); // u
	System.out.println(name.charAt(2)); // c
	System.out.println(name.charAt(3)); // k
	System.out.println(name.charAt(4)); // 
	System.out.println(name.charAt(5)); // a 

char타입과 String타입은 다르다.( 'H'와 "H"는 다르다. ) 실무에서는 사실 char타입보다 String타입을 이용한 방법을 많이 쓰지만, 공부를 위해 char타입 변환을 먼저 해보았다.

**문자열(String)의 일부 문자열(String)을 반환

**
substring(begin), substring(begin, end)

1) substring(begin) : 인덱스 begin(포함) 부터 끝까지 반환
2) substring(begin, end) : 인덱스 begin(포함)부터 인덱스 end(불포함)까지 반환

String name = "Duck ach";
System.out.println(name.substring(0,5)); // duck
System.out.println(name.substring(5)); // ach

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

indexOf(문자열), lastIndexOf(문자열)

1) indexOf
(1) 만약 중복값이 여러개 있다면, 발견된 첫번째 값을 반환한다.
(2) 해당 값이 발견되지 않았을 때(존재하지 않을 때)는 -1을 반환한다.

String name = "Duck ach";

int idx1 = name.indexOf("Duck");
int idx2 = name.indexOf("k");

System.out.println(idx1); // 0
System.out.println(idx2); // 3

2) lastIndexOf
(1) 발견된 마지막 문자열의 인덱스를 반환
(2) 발견된 문자열이 없는 경우 -1을 반환

String name = "Duck ach";

int idx3 = name.lastIndexOf("Duck");
int idx4 = name.lastIndexOf("k");

System.out.println(idx3); // 0
System.out.println(idx4); // 8

문자열이 특정 패턴으로 시작하는가?

startsWith(문자열)

예를들어 사용자의 성씨를 알고싶다면 아래 코드처럼 앞에 들어오는 문자열을 입력하면 맞는지 아닌지 판별 할 수 있다.

String name = "김덕구";
if(name.startsWith("김")) {
	System.out.println("김씨 입니다.");
	} else {
	System.out.println("김씨가 아닙니다.");
	}
    
    // "김씨 입니다."

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

contains(문자열)

현업에서는 유효성검사라기엔 조금 부실하여 못쓰지만, 첨부파일 제한을 하거나 파일 유효성 검사를 할 때 특정 문자를 포함하는지 조사할 수 있다.

String email = "disd2@gmil.com";
	if(email.contains("@") && email.contains(".")) {
		System.out.println("이메일 입니다.");
	} else {
		System.out.println("이메일이 아닙니다.");
	}
    // 이메일 입니다.

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

trim()

사용자가 이름을 입력한 후 괜히 스페이스바를 한번 더 친다던지, 앞에 알 수 없는 공백이 입력되더라도 나중에 공백하나로 데이터에 오류가 날 확률이 늘어나므로 데이터베이스는 앞뒤 공백은 제거 하고 받아야한다.

앞, 뒤, 중간 spacebar 2번씩 각각 들어간 데이터로 공백을 제거해 보겠다.

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

대소문자 변환하기

toUpperCase(), toLowerCase()

String source = "best of best";
	System.out.println(source.toUpperCase()); // BEST OF BEST
	System.out.println(source.toLowerCase()); // best of best

문자열 중에 해당되는 문자를 찾아 바꿔주기.

replace(old, new), replaceAll(old, new)

replace(old, new)

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

best를 찾아 문장 안의 모든 best들을 worst로 바꿔주었다.

replaceAll(old, new)
주의 replacedAll() 메소드는 특정 문자열을 찾아서 변환하는 것이 아니다.

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

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

isEmpty(), isBlank()

isEmpty()
공백도 문자열로 인식한다.

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

완전히 빈 공백을 문자열로 인식하는 방법은

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

isBlank()
공백을 무시한다.
isBlank는 JDK 11에 출시되었음. (신기술)
trim을 넣지 않게 하기위해 출시하였지만
빈 문자열을 그냥 무시하고 두게되므로 되도록 이용하지 않는게 좋다.
최신코드는 항상 조심해야 한다.

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

연습 예제

파일이름을 파일명과 확장자로 분리. 단, jpg, gif, png 이미지인 경우에만 작업을 진행한다.

String fullName = "apple.jpg";
String fileName = ""; // apple
String extName = ""; // jpg

int idxOfDot = fullName.lastIndexOf("."); // .을 기준으로 파일명과 확장자 분리
	fileName = fullName.substring(0, idxOfDot);
	extName = fullName.substring(idxOfDot + 1);
    
	System.out.println(fileName);
	System.out.println(extName);

확장자를 나타낼 때 항상 사용되는 마침표(.)를 기준으로 인덱스를 나누어 파일명과 확장자를 나누어주면 된다.

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

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);
		}

개인적으로 좀 헤맸던 문제다. for문안에 한번에 이렇게 식을 짜주면 코드 몇줄로 구현이 되던거였는데 한참 생각했다.
그리고 continue를 사용하는 것도 이 예제에는 잘 어울리는 것 같다.

StringBuilder를 활용하여 대문자 6자리로 구성된 인증코드 작성하기

StringBuilder sbCode = new StringBuilder();
		
	for(int i=0; i<6; i++) {
		sbCode.append((char)((int)(Math.random() * 26) + 'A'));
	}
	String code = sbCode.toString();
	System.out.println("인증코드 : " + code);

이렇게 일정하지 않은 사용자에게 랜덤한 코드를 부여하기 위해서는 random메소드를 활용하여 문제를 풀면된다.
알파벳은 26개이므로, 그것을 이용하여 char타입을 이용했다.

Scanner를 활용하여 1 2 3 4 5 6 7 8 9 10 만들기

Scanner sc = new Scanner(System.in);
StringBuilder sbPaging = new StringBuilder();
		
		for(int n = 1; n <= 10; n++) {
			sbPaging.append(n + " ");
		}
		String paging = sbPaging.toString();
		System.out.println(paging);
        sc.close();

Scanner메소드는 백준 풀면서 진짜 밥먹듯이 써봐서 익숙해서 너무 쉽고 재밌었다.

char 타입의 성별을 입력 받기 ( 남 / 여 )

Scanner sc = new Scanner(System.in);
System.out.print("성별(남/여)을 입력하세요 >>> ");
		char gender = sc.next().charAt(0);
		System.out.println(gender);
		sc.close();

char타입으로 받게되면 사용자가 "남자"라고 입력하더라도 '남' 이라고 변해서 입력이된다.

profile
자몽 허니 블랙티와 아메리카노 사이 그 어딘가

0개의 댓글