1. String 메서드?
자바스크립트에서도 자주 사용했던 String.
이것은 문자열 관련 클래스를 통칭하는 단어이다.
이 String 안에서 사용할 수 있는 여러 메서드를 알아보자.
1) equals()
만약 클래스에서 문자열과 문자열을 서로 비교하고 싶을 때 어떻게 해야할까?
아래의 코드를 확인해보자.
String str="HAPPY";
String name = new String("HAPPY");
if(str==name) {
System.out.println("같다");
} else {
System.out.println("다르다");
} // if end
결과가 어떻게 나올까?
다르다로 나온다.
왜냐하면 == 는 데이터들의 주소값을 찾기 때문이다.
그래서 이때는 equals() 메서드를 사용해야한다.
// 문자열의 내용을 비교하는 경우 == 연산자 사용하지 말고 equals() 함수를 이용할 것
if(str.equals(name)) {
System.out.println("같다");
} else {
System.out.println("다르다");
} // if end
이 경우에는 데이터의 문자열 값 자체를 두고 비교를 하기에 같다 라는 값이 출력되게 된다.
2) isEmpty()
이 함수는 문자열의 갯수가 0인지를 확인해주는 함수이다.
if(str.isEmpty()) {
System.out.println("빈문자열이다");
} else {
System.out.println("빈문자열이 아니다");
} // if end
3) split()
이 함수는 특정 문자를 기준으로 문자열을 분리하는 함수이다.
이 때 배열로 분리되므로 참조 변수는 String[ ] 의 형태로 선언이 된다.
str=new String("Gone With The Wind");
String[] word= str.split(" ");
for(int i=0; i<word.length; i++) {
System.out.println(word[i]);
} // for end
여기서 split() 안에 " "를 주어 공백문자를 기준으로 분리하였다.
4) StringTokenizer()
StringTokenizer st= new StringTokenizer(str, " ");
여기서 StringTokenizer() 안에 " "를 주어 공백문자를 기준으로 분리하였다.
StringTokenizer 안에는 세가지 값이 들어올 수 있다.
① StringTokenizer(문자열); : 띄어쓰기 기준으로 문자열을 분리한다
② StringTokenizer(문자열, 구분자); : 구분자를 기준으로 문자열을 분리
③ StringTokenizer(문자열, 구분자, true/false); : 구분자를 기준으로 넣을 때 구분자도 하나의 토큰으로 사용할지(true) 아닐지(false) / 기본값은 false이다.
이 메서드를 사용해서도 문자열을 분리해서 출력시킬 수 있다.
StringTokenizse 에서 사용하는 메서드를 알아보자.
메서드명 | 리턴값 | 역할 |
hasMoreTokens() | boolean | 남아있는 토큰이 있으면 true를 리턴, 더 이상 남은 토큰이 없으면 false |
nextToken() | String | 객체에서 다음 토큰을 반환 |
nextToken(String delim) | String | delim(구분자)을 기준으로 다음 토큰을 반환 |
hasMoreElements() | boolean | hasMoreTokens와 동일한데 엘레먼트보다 토큰으로 된 메서드를 주로 사용 |
nextElement() | Object | nextToken 메서드와 동일하지만 문자열이 아닌 객체로 리턴한다 |
countTokens() | int | 남아있는 토큰의 개수를 리턴한다 |
우선 가장 간단한 방법인 nextToken을 사용해보려한다.
StringTokenizer st= new StringTokenizer(str, " ");
System.out.println(st.countTokens()); // 토큰 수 세기
System.out.println(st.nextToken()); // 토큰 하나씩 출력
System.out.println(st.nextToken());
System.out.println(st.nextToken());
System.out.println(st.nextToken());
다음은 hasMoreTokens의 true 값을 반환하는 성질을 사용하여 한번에 출력시키는 방법이다.
// hasMoreTokens 사용하기
System.out.println(st.hasMoreTokens());
while(st.hasMoreTokens()) {
System.out.println(st.nextToken());
} // while end
그런데 위의 코드를 모두 입력한 뒤 F11을 입력하면 hasMoreTokens()의 결과물은 아무것도 반환되지 않는다.
왜냐면 위에서 토큰을 모두 사용했기 때문이다.
이처럼 토큰을 얼마나 사용했는지도 잘 확인하며 출력시켜야한다.
2. 문자열의 연산속도
자바에서는 String 객체를 불변의 객체라고 부른다.
한번 선언이 되면 바꾸지 못하기 때문이다.
그래서 자바에서는 String객체를 연산하여 다른 요소를 추가시킨다.
즉, 문자열도 연산이 된다.
아래의 코드를 살펴봐보자.
String s1="";
System.out.println(s1.length());
s1=s1+"one";
System.out.println(s1.length()+s1);
s1=s1+"two";
System.out.println(s1.length()+s1);
s1=s1+"three";
System.out.println(s1.length()+s1);
// 모든 문자열 지우기
s1="";
System.out.println(s1.length()+s1);
그런데 이 문자열의 연산이 100만개를 넘는다면?
자바에서 문자열을 연산할 때 점점 속도가 느려지고 부하가 걸리게 된다.
그래서 문자열을 보다 빠르게 연산하는 것들이 개발되고 있다.
자바에서 문자열을 연산할 때 사용하는 세가지 방법이 있다.
String < StringBuffer < StringBuilder
오른쪽으로 갈 수록 연산의 속도가 더 빠르다(사실 1,2번째 요소들은 속도차이가 크지 않다).
이 중 가장 연산이 빠른 StringBuilder를 사용하는 방법을 알아보자.
StringBuilder s2 = new StringBuilder();
s2.append("SEOUL");
System.out.println(s2.length()+s2.toString());
1) StringBuilder : append (문자열 추가하기)
먼저 StringBuilder의 객체를 new로 생성해준 뒤 .append()를 통하여 문자열을 추가해준다.
출력시에는 toString()을 사용하여 출력시킨다.
이 .append는 반복사용도 가능하다.
s2.append("JEJU");
System.out.println(s2.length()+s2.toString());
s2.append("BUSAN").append("DAEJUN");
System.out.println(s2.length()+s2.toString());
2) StringBuilder : delete (모든 문자열 지우기)
s2.delete(0, s2.length()); // 몇 번째 문자열까지 지울 것인지
System.out.println(s2.length());
3. 문자열 연습문제
- .indexOf(delim) : 객체에서 delim(구분자)가 등장한 시점을 카운트한다.
- .lastIndexOf(delim) : 객체에서 delim(구분자가)가 마지막으로 등장한 시점을 카운트한다.
- .substring(a, b) : 문자열의 a번째부터 b번째 문자까지만 출력한다.
package oop0908;
import java.util.StringTokenizer;
public class Test04_quiz {
public static void main(String[] args) {
// String 관련 연습문제
//문1) 이메일 주소에 @문자 있으면
// @글자 기준으로 문자열을 분리해서 출력하고
// @문자 없다면 "이메일주소 틀림" 메세지를 출력하시오
/*
출력결과
webmaster
itwill.co.kr
*/
String email=new String("webmaster@itwill.co.kr");
/*
내 풀이
StringTokenizer st= new StringTokenizer(email, "@");
if(st.countTokens()==1) {
System.out.println("이메일 주소 틀림");
} else {
while(st.hasMoreTokens()) {
System.out.println(st.nextToken());
} // while end
} // if end
*/
// 강사님 풀이
if(email.indexOf("@")==-1) {
System.out.println("이메일 주소 틀림!!");
} else {
System.out.println("이메일 주소 맞음");
int pos=email.indexOf("@");
// System.out.println(pos); // 9 > 골뱅이는 9번째에 있음
String id = email.substring(0, pos); // 문자의 꼬리말 공간 확보
String sever = email.substring(pos+1);
System.out.println(id);
System.out.println(sever);
}
//문2) 이미지 파일만 첨부 (.png .jpg .gif)
/*
출력결과
파일명 : sky2022.09.08
확장명 : png
*/
String path=new String("i:/frontend/images/sky2022.09.08.png");
/*
내 풀이
String[] word = path.split("/");
String tmp = new String(word[word.length-1]);
String[] ext = tmp.split("");
System.out.println(ext.length);
// 파일명 출력하기
System.out.print("파일명 : ");
for(int i=0; i<ext.length; i++) {
if(i<ext.length-4) {
System.out.print(ext[i]);
} // if end
} // for end
// 확장명 출력하기
System.out.print("\n확장명 : ");
for(int i=0; i<ext.length; i++) {
if(i>ext.length-4){
System.out.print(ext[i]);
} // if end
} // for end
System.out.println();
*/
// 강사님 풀이
// 마지막 "/" 기호의 순서값
int lastSlash=path.lastIndexOf("/");
// System.out.println(lastSlash); // 18
// 전체 파일명
String file = path.substring(lastSlash+1);
// System.out.println("전체 파일명 : " + file);
int lastDot = file.lastIndexOf(".");
// System.out.println(lastDot); // 13
String fname = file.substring(0, lastDot); // 문자의 꼬리말 공간 확보
String ename = file.substring(lastDot+1);
System.out.println("파일명 : " + fname);
System.out.println("확장명 : " + ename);
// 확장명을 전부 소문자로 치환
ext=ext.toLowerCase();
if(ext.equals("png") || ext.equals("jpg") || ext.equals("gif")) {
System.out.println("파일이 전송되었습니다");
} else {
System.out.println("이미지 파일만 가능합니다");
}
} // main() end
} // class end
'⁂ Java > : 기본 익히기' 카테고리의 다른 글
[JAVA] #6-1 Static (0) | 2022.09.13 |
---|---|
[JAVA] #5-5 This와 This() (0) | 2022.09.13 |
[JAVA] #5-3 생성자 함수(Constructor) (0) | 2022.09.08 |
[JAVA] #5-2 New 연산자 - 참조 자료형을 이해해보자 (0) | 2022.09.08 |
[JAVA] #5-1 클래스(Class) (2) | 2022.09.08 |