우선 문자열에관한 클래스를 공부하기 전에 문자열이 어떤 형식으로 데이터베이스에 저장이 되는지 알아야 한다.
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타입으로 받게되면 사용자가 "남자"라고 입력하더라도 '남' 이라고 변해서 입력이된다.