[Java] 입력한 알파벳의 대소문자 변경하기 (ASCII code)

jina·2024년 3월 24일
0

Java

목록 보기
3/10
post-thumbnail
post-custom-banner

❔ 문제

알파벳의 대소문자를 변경하는 프로그램을 만드는 문제입니다. 사용자에게 입력을 받고, 알파벳 외의 값은 예외 처리가 필요합니다.

💭 풀이

접근 방법

  • 알파벳 대소문자의 아스키 코드 값을 참고해 각 대소문자에 해당하는 값의 연관성을 연산으로 알아낸다.
  • 사용자가 입력한 값이 알파벳 대소문자라는 입력 조건에 부합하는지 확인하는 조건식을 만든다.
  • 입력 조건에 부합하면 대소문자를 변경해 주는 연산을 통해 값을 출력한다.

코드 작성

원하는 알파벳의 아스키 코드 값을 참고하기 위해 아래처럼 메소드를 만들었습니다. 매번 검색해서 표를 보지 않고도 빠르게 확인할 수 있어서 유용했습니다.

    public static void asciiCode() {
        int a = 'a';
        System.out.println("a = " + a);
        int z = 'z';
        System.out.println("z = " + z);
        int A = 'A';
        System.out.println("A = " + A);
        int Z = 'Z';
        System.out.println("Z = " + Z);
    }
    

다음 아스키 코드 출력 결과를 확인하니 각 알파벳의 대소문자 값은 32만큼의 차이가 나는 것을 계산해 볼 수 있었습니다.

== 아스키코드 참고 ==
a = 97
A = 65
z = 122
Z = 90

이러한 내용을 활용해 알파벳 문자 하나를 입력받고 대소문자로 변환하는 메소드를 이렇게 작성했습니다.

 public static void solution() {

        System.out.print("변환할 알파벳을 입력하세요: ");
        Scanner sc = new Scanner(System.in);
        char[] cArr = sc.nextLine().toCharArray();

        int c = cArr[0];
        int result = 0; //아스키 코드 결과 값을 담을 변수

        if (cArr.length >= 2) { //입력받은 문자가 하나인지 검증하는 조건
            System.out.println("잘못된 입력입니다");
            return;
        } if (97 <= c && c <= 122) { //문자가 하나라면 대소문자를 구별하는 조건
                result = c - 32;
            } else if (65 <= c && c <= 90) {
                result = c + 32;
            } else { //영어 대문자나 소문자가 아니 경우
                System.out.println("잘못된 입력입니다.");
                return;
            }
        System.out.println("변환 결과: " + (char) result); //최종 결과
        }
    }

Scanner의 목적 중 하나는 다양한 데이터 타입을 사용자에게 입력받아서 처리하는 것인데, 여러 문자로 이루어진 String 데이터는 받는 반면 문자 하나를 담는 데이터인 char는 받지 않습니다. 직접적으로 문자 하나만을 저장하는 char를 처리하는 것은 Scanner의 목적과 다소 거리가 있다고 생각하니, 문제를 풀며 String을 Char로 변환해야 하는 번거로움을 받아들이는 데 약간 도움이 되었습니다... (╯°□°)╯︵ ┻━┻

Scanner가 받을 데이터가 String 타입이라는 점을 고려해 위 코드를 작성했습니다. 문자 하나가 아닌 여러 문자를 입력할 경우가 있을 것을 고려해서 toCharArray() 메소드를 사용해 배열로 넣었고, 배열 갯수가 1개가 아니면 잘못된 입력으로 처리했습니다.

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

주어진 문제에서는 입력 문자를 하나로 제한한다는 조건을 언급하지는 않았기 때문에, 입력 문자는 오직 한 개라고 전제할 때, 아래 코드처럼 charAt(index)를 사용해서 String 문자열의 지정된 index에 위치한 문자를 골라 char로 형변환할 수 있습니다.

char character = sc.nextLine().charAt(0);

다만 이 경우 'hello'를 입력받으면 변환 결과는 'H'로 출력됩니다. 좀 더 나아가 String으로 받은 문자열 전체를 변환하는 메소드로 수정해 보고 싶었습니다.

코드 수정

    public static void solution() {

        System.out.print("변환할 알파벳을 입력하세요: ");
        Scanner sc = new Scanner(System.in);
        String character = sc.nextLine();
        char[] cArr = character.toCharArray();

        int gap = 'a' - 'A'; //각 알파벳 간 대소문자의 차는 32
        int num = 0; //변환 결과 값 선언 및 초기화

        for (int i = 0; i < cArr.length; i++) { //배열에 들어온 모든 문자를 돌면서 실행한다
            if ('a' <= cArr[i] && cArr[i] <= 'z') { //소문자를 다룬다는 조건을 직관적으로 볼 수 있게 수정
                num = cArr[i] - 32;
                cArr[i] = (char) num; //변환된 값으로 배열에 대체
            } else if ('A' <= cArr[i] && cArr[i] <= 'Z') { //대문자를 다룬다는 조건을 직관적으로 볼 수 있게 수정
                num = cArr[i] + 32;
                cArr[i] = (char) num; //변환된 값으로 배열에 대체
            } else { //영어 문자열이 아닌 경우
                System.out.println("잘못된 입력입니다.");
                return;
            }
        }
        String result = new String(cArr); //char 배열을 String 문자열로 변환
        System.out.println("변환 결과: " + result);
    }

문자 배열을 돌면서 수행하도록 코드를 수정하니 문자열 전체를 대소문자로 변환할 수 있었습니다. 변환된 문자 배열 char[]을 다시 String 문자열로 바꾸는 코드는 String 생성자를 이용해 아래처럼 사용했습니다.

String result = new String(cArr);

위에서 작성한 메소드를 실행한 결과입니다.

변환할 알파벳을 입력하세요: hello
변환 결과: HELLO

❕ 정리

  • Scanner 클래스는 nextLine()을 통해 String을 받을 수 있지만 char를 직접 받지 않습니다.
  • toCharArray() 메소드는 String 문자열에 포함된 모든 문자를 char 배열에 넣을 수 있습니다.
  • charAt(index) 메소드는 String 문자열 중에 지정된 인덱스에 있는 문자를 char로 변환해 줍니다.


참고
https://st-lab.tistory.com/92 (Scanner)
https://sirobako.co.kr/detail/62 (Scanner)
https://java119.tistory.com/106 (char-String)
https://hianna.tistory.com/541 (char[] -> String)
https://colossus-java-practice.tistory.com/31 (charAt())

profile
오늘의 기록은 내일의 보물
post-custom-banner

0개의 댓글