자바 초보에서 B형까지5 -문자열 필수지식-

1. 공백이 없는 문자열 입력받기

 

문자열의 타입은 String이고 공백이 없는 문자열은 sc.next()로 입력받을 수 있다.

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 여기에 코드를 작성해주세요.

        Scanner sc = new Scanner(System.in);

        String s = sc.next();

        System.out.println(s);
        System.out.println(s);
    }
}

 

문자열은 각각 원소에 대한 참조로 charAt(index) 형태로 참조 가능하다.

 

첫번째 문자를 참조할려면 charAt(0)이다.

 

그래서 문자 하나를 가지고 올때 sc.next().charAt(0);

 

public class Main {
    public static void main(String[] args) {
        String str = "banana";
        System.out.println(str.charAt(0)); // b <- 문자열의 첫 번째 문자 
        System.out.println(str.charAt(1)); // a <- 문자열의 두 번째 문자
        System.out.println(str.charAt(2)); // n <- 문자열의 세 번째 문자
    }
}

 

 

2. 문자열의 길이

 

문자열의 길이는 length() 함수로 얻는다.

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 여기에 코드를 작성해주세요.

        Scanner sc = new Scanner(System.in);

        String s1 = sc.next();
        String s2 = sc.next();

        System.out.println(s1.length()+s2.length());
    }
}

 

참고로 escape sequence \n은 길이를 1로 취급함

 

\랑 n 해서 2인것 같지만 해보면 1이더라?

 

 

 

3. 공백이 포함된 문자열 입력받기

 

sc.next()는 공백단위로 문자열을 구분하여 입력을 받는다.

 

여기서 공백은 space와 new line 모두 포함한다.

 

그래서 hello world를 입력했는데 sc.next() 한번만 쓰면 hello만 얻는다.

 

만약 hello world를 한번에 입력받고 싶으면 문자열 입력 구분단위를 space가 아닌 오직 new line만으로 바꿔주면 된다.

 

sc.nextLine(); 함수를 이용하면 가능하다

 

오직 new line만으로 구분하여 입력받으므로, space를 포함한 문자열을 입력받는다.

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String str = sc.nextLine();
        System.out.println(str);
    }
}

// 입력
>> hello world

// 출력
hello world

 

당연하지만 공백도 하나의 문자로 생각하므로 charAt(5);를 출력하면 5번째 문자인 공백을 출력한다

 

마찬가지로 length() 함수도 공백을 포함해서 길이를 계산한다

 

 

4. equals()

 

equals()는 문자열에만 적용되고 문자에 적용하면 에러나더라

 

 

 

5. nextLine()과 next()의 차이

 

next()는 개행문자 \n을 무시하고 다음 입력을 가져오고, nextLine()은 개행문자를 무시하지 않는다

 

다음과 같이 코드를 작성했다고 해보자.

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 여기에 코드를 작성해주세요.

        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        System.out.println(n);

        for(int i =0; i < n; i++){
            
            String s = sc.nextLine();
            String s2 = sc.next();

            System.out.println(s);
            System.out.println(s2);
        }

    }
}

2
a
bc

2

a

bc

 

2

abc를 입력했다면..

 

2\na\nbc가 입력된 상태

 

sc.nextInt();에서 2만 가져오고.. \na\nbc 가 남아있다

 

다음 sc.nextLine()에서 \n을 가져온다

 

다음 sc.next();에서 a를 가져와서 \nbc가 남아있다

 

다음 sc.nextLine()에서 \n을 가져온다

 

다음 sc.next()에서 bc를 가져온다.

 

그래서...

 

2(공백)a(공백)bc 가 출력된다

 

 

6. 문자를 숫자로 바꾸기

 

기본적으로 (int)같이 형변환하면 문자를 아스키코드로 바꿔줌

 

Character.getNumericValue();을 하면 숫자 문자는 그대로 숫자값을 가져다준다

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 여기에 코드를 작성해주세요.

        Scanner sc = new Scanner(System.in);

        String A = sc.next();

        int sum = 0;

        for(int  i = 0; i < A.length(); i++){

            int a = Character.getNumericValue(A.charAt(i));

            if(a >= 0 && a <= 9){
                sum += a;
            }
        }

        System.out.println(sum);
    }
}

 

 

혹은 다음과 같이 할수도 있다

 

문자가 '0'이상 '9'이하이면 숫자라는 뜻이고, '0'의 아스키코드가 48이고 '1'은 49, '2'는 50,...이어서..

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        System.out.println((int)'0');
        System.out.println((int)'1');
        System.out.println((int)'2');
        System.out.println((int)'3');
        System.out.println((int)'4');
        System.out.println((int)'5');
        System.out.println((int)'6');
        System.out.println((int)'7');
        System.out.println((int)'8');
        System.out.println((int)'9');

    }
}

48
49
50
51
52
53
54
55
56
57

 

(숫자 문자) - '0'하면 해당하는 값을 가져다줌

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 문자열을 정의합니다.
        String str;
        int ans = 0;
        
        // 문자열을 입력받습니다.
        str = sc.next();

        // 문자열을 순회하여 숫자들만 골라 더해줍니다.
        for(int i = 0; i < str.length(); i++) {
            if(str.charAt(i) >= '0' && str.charAt(i) <= '9')
                ans += (str.charAt(i) - '0');
        }

        System.out.print(ans);
    }
}

 

 

7. 문자열끼리 덧셈

 

자바도 문자열끼리 덧셈이 가능하다.

 

문자열끼리 더하면 문자열을 그대로 이어붙인다

 

문자열과 숫자를 더하면 숫자를 문자열로 바꿔서 이어줌

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 여기에 코드를 작성해주세요.

        Scanner sc = new Scanner(System.in);

        String A = sc.nextLine();

        String s = "";

        char c = A.charAt(0);
        int count = 0;

        for(int i = 0; i < A.length(); i++){
            if(A.charAt(i) == c){
                count++;
            } else{

                s += c;
                s += count;

                c = A.charAt(i);
                count = 1;
            }
        }

        s += c;
        s += count;

        System.out.println(s.length());
        System.out.println(s);
    }
}

aaabbbbcbb

8
a3b4c1b2

 

초기 문자열 변수를 ""으로 초기화하고 계속 더해주면 이어붙여줌

 

public class Main {
    public static void main(String[] args) {
        String a = "apple", b = "banana", c = "candy";
        String totStr = "";
        
        totStr += a;
        totStr += b;
        totStr += c;
        System.out.println(totStr);
    }
}

>> applebananacandy

public class Main {
    public static void main(String[] args) {
        String[] a = new String[]{"apple", "banana", "candy"};
        String totStr = "";
        
        for(int i = 0; i < 3; i++) {
            totStr += a[i];
        }
        System.out.println(totStr);
    }
}

>> applebananacandy

 

8. substring()

 

문자열.substring(시작,끝);

 

문자열의 시작 인덱스부터 끝 인덱스 전까지로 이루어진 문자열의 부분문자열을 반환

 

public class Main {
    public static void main(String[] args) {
        String s = "appleabanana";
        System.out.println(s.substring(5, 7));
        System.out.println(s.substring(5, 7) == "ab");
    }
}

>> 
ab
false

 

여기서 비교연산 결과가 false로 예상과는 다른데, 자바에서는 문자열 비교 연산에 반드시 ==이 아니라 equals를 사용해야함

 

==은 두 문자열의 주소값이 일치하는지 판단하는 연산이기 때문이다

 

값이 일치하는지 비교하기 위해 str1.equals(str2)

 

public class Main {
    public static void main(String[] args) {
        String a = "aba";
        String b = "aba";
        System.out.println(a == b);
        System.out.println(a.equals(b));
    }
}

>> 
false
true

 

9. contains()

 

문자열.contains(부분문자열);

 

문자열 내에 부분문자열이 존재하면 true, 아니면 false를 반환

 

public class Main {
    public static void main(String[] args) {
        String s = "appleabanana";
        int length = s.length();
        boolean exists = false;

        if (s.contains("ab")) {
            exists = true;
        }

        if (exists == true) {
            System.out.println("true");
        }
        else {
            System.out.println("false");
        }
    }
}

>> true

 

10. indexOf()

 

문자열.indexOf(부분문자열);

 

문자열 내에 해당 부분문자열이 존재하면 가장 앞에 나오는 부분문자열의 위치

 

존재하지 않으면 -1

 

public class Main {
    public static void main(String[] args) {
        String s = "appleabanana";

        System.out.println(s.indexOf("ab"));
    }
}

>> 5

 

두번째 인자로 s.indexOf(부분문자열, position);을 주면..

 

position부터 s에서 부분문자열이 존재하는지 검사해준다.

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 부분문자열의 개수 구하기

        Scanner sc = new Scanner(System.in);

        String A = sc.nextLine();
        String B = sc.nextLine();

        int i = 0;
        int count = 0;

        while(true){

            if(A.indexOf(B,i) == -1){
                break;
            } else {
                i = A.indexOf(B,i)+1;
                count++;
            }

        }

        System.out.println(count);
    }
}

 

 

11. toCharArray()

 

문자열.toCharArray();는 문자열의 각 문자를 원소로 가지는 배열로 바꿔준다

 

public class Main {
    public static void main(String[] args) {
        String s = "baaana";
        char[] arr = s.toCharArray();
        for(int i = 0; i < arr.length; i++)
            System.out.print(arr[i] + " ");
    }
}

>> b a a a n a

 

12. String.valueOf()

 

String.valueOf(문자 배열)을 하면 문자 배열을 String으로 바꿔준다

 

public class Main {
    public static void main(String[] args) {
        String s = "baaana";
        char[] arr = s.toCharArray();

        arr[2] = 'n';
        s = String.valueOf(arr);

        System.out.println(s);
    }
}

>> banana

 

13. 문자열의 문자 변경

 

java도 python처럼 문자열은 immutable이어서 문자열에서 직접적으로 원소를 바꿀 수는 없다

 

그래서 문자열을 새로 만들어서 원하는 부분의 문자를 바꾸든가

 

아니면 toCharArray()로 배열로 바꿔준다음에, 해당 위치의 문자를 바꾸고 valueOf()로 문자열로 바꿔준다

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 여기에 코드를 작성해주세요.

        Scanner sc = new Scanner(System.in);

        char[] arr = sc.nextLine().toCharArray();

        arr[1] = 'a';
        arr[arr.length-2] = 'a';

        System.out.print(String.valueOf(arr));
    }
}

leebroscode

laebroscoae

 

 

참고로 배열은 arr.length로 크기를 구할 수 있고 문자열은 s.length()로 크기를 구한다...

 

배열에서 arr.length()하면 에러나더라

 

 

14. 문자열 밀기

 

주어진 문자열을 왼쪽으로 1칸 밀어내는 코드는 어떻게 작성해야할까?

 

예를 들어 "abc"를 왼쪽으로 1칸 밀면, "bca"이다.

 

이는 substring을 이용해서 1번부터 끝까지를 앞에 + 0번 문자를 맨 뒤에 붙여주면 된다

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 여기에 코드를 작성해주세요.

        Scanner sc = new Scanner(System.in);

        String s = sc.next();

        System.out.println(s.substring(1)+s.substring(0,1));
    }
}

 

 

15. 아스키코드

 

문자를 (int)로 형변환하면 그 문자의 아스키코드로 변환된다

 

public class Main {
    public static void main(String[] args) {
        int a = (int)'A';
        System.out.println(a);
    }
}

>> 65

 

반대로 스키코드값을 (char)로 형변환하면 해당하는 문자를 얻는다

 

public class Main {
    public static void main(String[] args) {
        char c = (char) 65;
        System.out.println(c);
    }
}

>>
A

 

16. 대소문자 판단하고 변환하기

 

아스키코드를 이용해서 대문자에 32를 더하면 소문자가 되고 소문자에 32를 빼면 대문자가 된다

 

public class Main {
    public static void main(String[] args) {
        System.out.print((char)('a'-32));
        System.out.print((char)('Z'+32));
    }
}

Az

 

문자끼리 비교연산을 하면 아스키코드를 기준으로 비교연산을 수행한다.

 

따라서 대소문자인지 판단하는 방법은.. 'A'부터 'Z'안에 있으면 대문자이고 'a'부터 'z'안에 있으면 소문자

 

char x;
if ('A' <= x && x <= 'Z') {
    System.out.println("Upper case");
}

char x;
if ('a' <= x && x <= 'z') {
    System.out.println("Lower case");
}

 

 

toUpperCase()는 모든 문자열을 대문자로 변환하고

 

toLowerCase()는 모든 문자열을 소문자로 변환한다.

 

Character.isLowerCase(c)는 해당 문자 c가 소문자인지 판단하고

 

Character.isUpperCase(c)는 해당 문자 c가 대문자인지 판단한다

 

c가 알파벳이 아니면 두 메소드 모두 false를 반환

 

비슷하게 Character.toUpperCase(c)는 c를 대문자로 바꿔준다.

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String s = sc.next();

        for(int i = 0; i < s.length(); i++){
            
            if(Character.isLowerCase(s.charAt(i)) == true){
                System.out.print(Character.toUpperCase(s.charAt(i)));
            } else if (Character.isUpperCase(s.charAt(i)) == true){
                System.out.print(s.charAt(i));
            }
        }
    }
}

2021.Leebros.Hello
LEEBROSHELLO

 

17. 숫자 판단

 

'0'부터 '9'안에 있으면 해당 문자는 0~9의 숫자이고..

 

Character.isDigit(c)로 c가 숫자이면 true 아니면 false를 반환

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 여기에 코드를 작성해주세요.

        Scanner sc = new Scanner(System.in);

        String s = sc.next();

        for(int i = 0; i < s.length(); i++){
            if(Character.isDigit(s.charAt(i)) == true){
                System.out.print(s.charAt(i));
            } else if('a' <= s.charAt(i) && s.charAt(i) <= 'z'){
                System.out.print(s.charAt(i));
            } else if('A' <=s.charAt(i) && s.charAt(i) <= 'Z'){
                System.out.print((char)(s.charAt(i) + 32));
            }
        }
    }
}

LeeBros123@Naver.Com
leebros123navercom

 

 

18. Integer.parseInt()

 

정수 문자열을 주면 정수로 변환해준다

 

public class Main {
    public static void main(String[] args) {
        String a = "123";
        int aInt = Integer.parseInt(a) + 1;

        System.out.println(aInt);
    }
}

>> 124

 

 

19. Integer.toString()

 

정수를 문자열로 바꿔준다

 

public class Main {
    public static void main(String[] args) {
        int a = 123;
        String aStr;

        aStr = Integer.toString(a);
        System.out.println(aStr);
    }
}

>> 123

 

 

20. compareTo();

 

str1.compareTo(str2);는 str1과 str2중 누가 사전순으로 더 앞선지 비교해주는 메소드

 

0이면 두 문자열이 일치하고 0보다 작으면 str1이 str2보다 더 앞서고

 

0보다 크면 str2가 str1보다 사전순에서 앞선다

 

public class Main {
    public static void main(String[] args) {
        String a = "abc";
        String b = "abd";
        String c = "aba";

        System.out.println(a.compareTo(b)); // -1
        System.out.println(a.compareTo(c)); // 2
        System.out.println(a.compareTo(a)); // 0
    }
}

 

 

21. 문자열을 거꾸로 출력하는 메소드

 

StringBuffer 클래스에 주어진 문자열을 넣어 새로운 클래스 객체를 만들고

 

reverse() 메소드를 호출한 후에 toString()으로 변환해주면 주어진 문자열을 뒤집어준다.

 

StringBuffer sb = new StringBuffer(str);

String s = sb.reverse().toString();

 

public class StringReverse {
    public static void main(String[] args) {
 
        // 문자열
        String str = "ABCDE";
 
        // 문자열 reverse
        StringBuffer sb = new StringBuffer(str);
        String reverse = sb.reverse().toString();
 
        // 결과 출력
        System.out.println(sb); // "EDCBA"
        System.out.println(reverse); // "EDCBA"
 
    }
}
TAGS.

Comments