문제1. 문자열 변경과 분리하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package stringex;
 
public class StringTest04 {
    public static void main(String[] args) {
 
        String name = "lee sun shin";
        
        // sun을 soon으로 변경하기 
        if (name.contains("sun")) {
            name = name.replace("sun""soon");
            System.out.println(name);
        }else {
            System.out.println("sun 이라는 문자열은 없습니다.");
        }
        
        // 성과 이름을 분리하기 
        String firstName = "";
        String lastName = "";
        
        firstName = name.substring(03); // 0~3 
        lastName = name.substring(4);      // 4~last character
        
        System.out.println("성: " + firstName);
        System.out.println("이름: " + lastName);
 
    }
}
 
# 실행 결과
lee soon shin
성: lee
이름: soon shin
cs

# 설명

Line 9: name에 "sun"이 포함되어 있는지 조건문을 통해 확인한다. 

Line 10: 만약 있다면 "soon"으로 바꾸어준다. 

Line 20~21: 성과 이름을 substring() 메소드와 인덱스 번호를 통하여 분리시켜준다.



문제2. 사용자로부터 이름을 입력받을 때, 성과 이름을 공백으로 분리시켜서 입력받자.

    예입력 : 홍 길동 > 출력 : 성   = 홍 / 이름 = 길동 

   입력 : 홍길동 > 출력 : 공백이 없군요. 다시 입력해주세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package stringex;
 
import javax.swing.JOptionPane;
 
public class StringTest05 {
    public static void main(String[] args) {
        
        String msg = "성과 이름을 공백으로 분리하여 입력해주세요.";
        
        String firstName = "";
        String lastName = "";
        
        while(true) {
            String name = JOptionPane.showInputDialog(msg);
            
            // trim() 메서드: 좌우 공백을 제거 
            name = name.trim();
            
            if(name.contains(" ")) {
                int idx = name.indexOf(" ");
                
                firstName = name.substring(0, idx);
                lastName = name.substring(idx + 1);
                break;
            }else {
                msg = "공백이 없습니다. 다시 입력해주세요.";
            }//if
        }//while
        
        JOptionPane.showMessageDialog(null"성: " + firstName + "\n이름: " + lastName);
    
    }
}
cs

# 설명

Line 17: trim() 메소드는 문자열의 좌우 공백을 제거해준다. 

만약 "   abc   " 라는 공백있는 문자열이 있을 때, "   abc    ".trim(); 을 실행하면 "abc"로 좌우 공백이 제거되서 반환된다.

Line 19~24: 공백 " "이 포함되어 있는지에 대한 여부로 만약 있다면 공백" "의 인덱스 번호를 기준으로 성과 이름을 분리해준다.



문제3. "Hello.java" 문자열에서 파일명은 Hello와 확장자인 java를 분리시켜보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package stringex;
 
public class StringTest06 {
    public static void main(String[] args) {
 
        String fullName = "Hello.java";
        
        int idx = fullName.indexOf(".");
        
        String fileName = fullName.substring(0, idx);
        String extName = fullName.substring(idx + 1);
        
        System.out.println("파일명: " + fileName);
        System.out.println("확장자: " + extName);
    }
}
 
# 실행 결과
파일명: Hello
확장자: java
cs

# 설명

Line 8: "."의 인덱스 번호를 기준으로 Hello와 java를 분리시켜준다.



문제4. split() 메소드로 문자열 분리하기 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package stringex;
 
public class StringTest07 {
    public static void main(String[] args) {
 
        String scores = "100, 11, 35, 41";
        String[] arScore = scores.split(", ");
        
        // 총점과 평균 
        int total = 0;
        double avg = 0.0;
        
        for(int i=0; i<arScore.length; i++) {
            total += Integer.parseInt(arScore[i]);
        }
        
        avg = total / arScore.length;
        
        System.out.println("총점: " + total + "점");
        System.out.printf("평균: %.1f점", avg);
        
    }
}
 
// 실행 결과
총점: 187점
평균: 46.0점
cs

# 설명

Line 7: split(String s) 메소드는 s를 기준으로 문자열을 각각 분리시켜준다. 

이 문제에서는 split(", ");을 사용하여 콤마(,)와 공백을 기준으로 분리시켜준다.

그리고 분리된 문자열들을 문자열 배열 arScore에 하나씩 저장한다.



문제5. 사용자로부터 동을 입력받아, 우편번호를 검색해주자.

   예) 입력 : 서초1동 > 출력 : 54321

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package stringex;
 
import javax.swing.JOptionPane;
 
public class StringTest08 {
    public static void main(String[] args) {
 
        String address = "54321 서울시 서초구 서초1동,";
        address += "54322 서울시 서초구 서초2동,";
        address += "54323 서울시 서초구 서초3동,";
        address += "54324 서울시 서초구 서초4동,";
        address += "54325 서울시 서초구 서초5동,";
        
        String[] arAddress = address.split(",");
        
        String msg = "동을 입력하세요.";
        String dong = "";
        
        int idx = -1;
        
        while(true) {
            dong = JOptionPane.showInputDialog(msg);
            
            for(int i=0; i<arAddress.length; i++) {
                if(arAddress[i].contains(dong)) {
                    idx = i;
                    break;
                }else {
                    msg = "다시 입력하세요.";
                }
            }//for
            
            if (idx != -1) {break;}
        }//while
        
        String post = arAddress[idx].substring(05);
        JOptionPane.showMessageDialog(null, post);
        
    }
}
cs

# 설명

Line 14: 콤마(,)를 기준으로 각 주소들을 문자열 배열 arAddress에 저장해준다. 

Line 24~27: 문자열 배열 arAddress의 길이만큼 for문을 돌면서 입력한 변수 dong이 포함되어 있는 주소의 인덱스를 판단한다. 

그리고 그 인덱스를 가리키는 idx에 대입한다. 

Line 33: 만약 dong이 포함되어 있는 주소가 없다면 while문을 탈출한다.

Line 36: dong이 있는 문자열 배열에서 앞에 있는 5개의 숫자를 잘라내어 문자열 변수 post에 대입한다. 



문제6. 문자열 결합 시 인스턴스 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package stringex;
 
public class StringTest09 {
    public static void main(String[] args) {
 
        String a = "a";
        String b = "b";
        String c = "c";
        
        c = a + b;
        System.out.println(c);
        
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());
        System.out.println(c.hashCode());
    
    }
}
 
// 실행 결과
ab
97
98
3105
cs

# 설명

- 연산자를 이용해 문자열을 결합하는 경우, 인스턴스 내의 문자열이 '변경' 되는 것이 아니라

새로운 문자열("ab")이 담긴 String 인스턴스가 새로 '생성' 되는 것이다. 

때문에 문자열을 다루는 작업이 많이 필요한 경우, String 클래스 대신 StringBuffer 클래스를 사용하는 것이 좋다. 


Line 13~15: a, b, c의 각 주소값을 10진수로 출력한다.

Line 22~24: 출력 결과로 보게 되면 주소값이 각각 다른 것을 볼 수 있다.



문제7. StringBuffer 클래스를 활용하여 문자열 처리하기 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package stringex;
 
public class StringTest10 {
    public static void main(String[] args) {
 
        StringBuffer sb = new StringBuffer("This");
        System.out.println(sb + ": " + sb.hashCode());
        
        // sb = sb + "연결";
        sb.append(" is apple.");    // 문자열 덧붙이기
        System.out.println(sb + ": " + sb.hashCode());
        
        sb.insert(7" my");
        System.out.println(sb + ": " + sb.hashCode());
        
        sb.replace(810"your");
        System.out.println(sb + ": " + sb.hashCode());
        
        sb.delete(813).insert(7" an");
        System.out.println(sb + ": " + sb.hashCode());
        
    }
}
 
// 실행 결과
This: 1973538135
This is apple.: 1973538135
This is my apple.: 1973538135
This is your apple.: 1973538135
This is an apple.: 1973538135
cs

# 설명

- StringBuffer 클래스로 인스턴스화를 하게 되면 생성된 문자열이 각각 다르게 실행되더라도 같은 주소값을 참조하고 있는 것을 알 수 있다. 

Line 10: append() 메소드는 문자열 덧붙이기를 할 수 있다.

Line 13: insert(삽입하고자 하는 문자열의 인덱스, 삽입하고자 하는 문자열)

Line 19: 문자열 인덱스 번호 8~13의 문자열을 삭제하고(delete(8, 13);) 

문자열 인덱스 번호 7에 " an"을 삽입하는(insert(7, " an");) 체인 시스템 방식이다. 



문제8. StringTokenizer을 이용하여 query 처리하기 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package stringex;
 
import java.util.StringTokenizer;
 
public class StringTest11 {
    public static void main(String[] args) {
 
        String query = "name=gildong&addr=seoul&age=15";
        
        StringTokenizer str1 = new StringTokenizer(query, "&");
        int length = str1.countTokens();
        
        for(int i=0; i<length; i++) {
            String token = str1.nextToken();
            System.out.println(token);
        }
        
        StringTokenizer str2 = new StringTokenizer(query, "&=");
        while(str2.hasMoreTokens()) {
            System.out.println(str2.nextToken());
        }
        
    }
}
 
// 실행 결과
name=gildong
addr=seoul
age=15
name
gildong
addr
seoul
age
15
cs

# 설명

Line 10: StringTokenizer 클래스를 사용하여 query를 '&' 기준으로 나누기 위한 token을 생성한다.

Line 11: token의 길이를 반환한다.

Line 13~16: token의 길이만큼 for문을 돌며 다음 token을 기준으로 문자열을 출력한다.

Line 18: query를 '&'과 '='를 기준으로 나누기 위한 token을 생성한다.

Line 19~21: while문에서 다음 토큰이 있는지에 대한 여부를 따져 문자열을 출력한다.



문제9. Scanner 클래스를 이용해서 한 줄 읽고, 공백으로 분리된 "단어"가 몇 개 들어 있는지 확인해보자.

   "그만"을 입력할 때까지 반복하는 프로그램이다.

   예) 입력 : Java Programming > 출력 : 단어의 개수는 2

                입력 : 자바 수업은 2층 C클래스 > 출력 : 단어의 개수는 4

                입력 : 그만 > 출력 : 프로그램 종료

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package stringex;
 
import java.util.Scanner;
 
public class StringTest12 {
    public static void main(String[] args) {
 
        Scanner sc = new Scanner(System.in);
        System.out.println(">> 단어 개수 확인하기 <<");
        
        while(true) {
            System.out.print("입력: ");
            String str = sc.nextLine();
            
            if (str.equals("stop")) {
                System.out.println("프로그램 종료");
                break;
            }
            
            String[] arStr = str.split(" ");
            System.out.println("단어의 개수: " + arStr.length);
        }//while
        
    }
}
 
// 실행 결과
>> 단어 개수 확인하기 <<
입력: Java Programming
단어의 개수: 2
입력: 자바 수업은 2층 C클래스
단어의 개수: 4
입력: stop
프로그램 종료
cs

# 설명

Line 20: 입력받은 문자열을 공백(" ")을 기준으로 나누어 문자열 배열에 저장하게 된다. 

Line 21: 문자열 배열의 길이는 곧 단어의 개수와 일치하기 때문에 이를 출력한다.