Do it! 알고리즘 입문: 자바 편 (8)[책리뷰 & Book review]
본문 바로가기

컴퓨터공부/책리뷰 & book review

Do it! 알고리즘 입문: 자바 편 (8)[책리뷰 & Book review]

by Life & study 2024. 1. 30.
반응형

 

 

 

자바의 char [] 은 무엇인가? Do it! 알고리즘 입문: 자바 편 (8)[책리뷰 & Book review]


char [] 타입은 문자 배열 타입입니다.

String 타입의 숫자는 문자로 변환되기 때문에, 

숫자를 더하기 위해서는 먼저 문자를 숫자로 변환해야 합니다.

char[] numChar = numbers.toCharArray();



이 문장에서 numbers 문자열을 char 배열로 변환하고 있습니다.

for 문에서 numChar [i]는 i번째 문자를 의미하고,

numChar [i]-'0'

은 해당 문자를 아스키 코드아스키코드 값에서 '0' 문자의 아스키코드 값을 뺌으로써 10진수 숫자로 변환하는 연산입니다.

즉 char[]는 입력으로 주어진 문자열을 문자 단위로 분리하여 처리하기 위한 데이터 타입이라고 할 수 있습니다.

문자를 숫자로 변환해서 더하는 과정에서 사용되고 있습니다.


이 코드의 작동 방식을 도식화한 설명은 다음과 같습니다:

Scanner 객체 sc를 생성하여 키보드 입력을 받습니다.
sc.nextInt()를 사용하여 입력받은 N의 값을 int형으로 저장합니다.
sc.next()를 사용하여 N개의 숫자 문자열을 입력받아 String numbers에 저장합니다.
numbers 문자열을 char 배열로 변환하여 numChar에 저장합니다.
이때 각 문자는 숫자로 저장됩니다.
sum 변수를 0으로 초기화하여 합계를 저장할 변수로 사용합니다.
for문을 돌면서 numChar 배열의 문자를 하나씩 꺼냅니다.
꺼낸 문자를 int형 숫자로 변환합니다.
문자-'0'을 해서 아스키코드 값 차이를 이용하여 10진수 숫자로 변환합니다.
변환된 숫자를 sum 변수에 더합니다.
for문이 N번 돌면 모든 숫자의 합계가 sum 변수에 저장됩니다.
마지막으로 sum 변수 값을 출력하여 문제의 정답을 출력합니다.
이러한 과정을 통해 입력받은 문자열 숫자의 합을 구하고 있습니다.


numbers 문자열을 char 배열로 변환하는 과정과 for문을 이용한 각 문자의 합 계산 과정을 도식화한 설명은 다음과 같습니다:

numbers 문자열은 '5', '4', '3', '2', '1' 문자로 이루어져 있습니다.
char [] numChar = numbers.toCharArray();
numbers.toCharArray() 메서드는 문자열을 문자 단위로 잘라 char 배열로 변환합니다.
numChar 배열에는 ['5', '4', '3', '2', '1'] 문자가 저장됩니다.
int sum = 0;
sum 변수에 0을 할당하여 합계를 저장할 변수로 초기화합니다.
for(int i=0; i<N; i++) {
i는 0부터 N보다 작을 때까지 1씩 증가하는 반복 횟수입니다.
sum += numChar[i]-'0';
numChar [i]는 i번째 문자를 의미합니다.
numChar [i]-'0'은 문자를 10진수 숫자로 변환하는 식입니다.
'0' 문자의 아스키코드 값을 뺌으로써 10진수 숫자가 됩니다.
변환된 숫자를 sum에 더하여 합계를 구합니다.
}로 for문이 끝나면 sum에는 모든 숫자의 합이 저장됩니다.
이러한 과정을 통해 문자열 숫자를 차례로 숫자로 변환하여 합산하고 있습니다.

 

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    
    Scanner sc = new Scanner(System.in);
    
    int N = sc.nextInt();
    
    String numbers = sc.next();
    
    char[] numChar = numbers.toCharArray();
    
    int sum = 0;
    
    for(int i=0; i<N; i++) {
      sum += numChar[i]-'0';
    }
    
    System.out.println(sum);
  }
}

 

 

 

 

ASCII 코드를 이해하기

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        // Scanner 객체 생성
        Scanner sc = new Scanner(System.in);

        // 숫자 문자열의 길이 N을 입력받음
        int N = sc.nextInt();

        // 숫자 문자열을 입력받음
        String numbers = sc.next();

        // 숫자 문자열을 문자 배열로 변환
        char[] numChar = numbers.toCharArray();

        // 숫자의 합계를 저장할 변수 생성
        int sum = 0;

        // 문자 배열의 각 요소를 순회
        for(int i=0; i<N; i++) {
            // 문자를 숫자로 변환하고 합계에 더함
            int number = numChar[i] - '0';
            sum += number;
        }

        // 합계 출력
        System.out.println(sum);
    }
}

 

 

 

 

 

참조객체와 기본객체를 어떻게 다른가?

 

자바에는 기본 타입(primitive type)과 참조 타입(reference type)이라는 두 가지 데이터 타입이 있습니다.

기본 타입은 boolean, char, byte, short, int, long, float, double 등이 있으며, 이들은 실제 값을 저장합니다.

 

기본타입은 BC숫자

참조 타입은 객체를 참조하며, 클래스, 인터페이스, 배열 등이 있습니다. 

참조 타입의 변수는 객체의 메모리 주소를 저장합니다.

다음은 기본 타입과 참조 타입을 사용하는 간단한 코드 예입니다:

java

public class Main {
    public static void main(String[] args) {

        // 기본 타입
        int num = 10; // 'num' 변수에는 실제로 숫자 10이 저장됩니다.

        // 참조 타입
        String str = new String("Hello");
        // 'str' 변수에는 "Hello" 문자열 객체의 메모리 주소가 저장됩니다.

        // 기본 타입의 값 변경
        num = 20; // 'num' 변수에 저장된 값을 20으로 바꿉니다. 
        이전의 값 10은 변경되거나 영향을 받지 않습니다.

        // 참조 타입의 값 변경
        str = new String("World"); // 'str' 변수에 새로운 "World" 문자열 객체의 메모리 주소를 저장합니다. 
        이전의 "Hello" 문자열 객체는 변경되거나 영향을 받지 않습니다.
    }
}




기본 타입 int num = 10; 은 메모리에 'num'이라는 이름의 공간을 만들고, 그 안에 '10'이라는 값을 저장합니다.
참조 타입 String str = new String("Hello");은 메모리에 'str'이라는 이름의 공간을 만들고, 그 안에 "Hello"라는 문자열 객체의 메모리 주소를 저장합니다.
num = 20;을 실행하면, 'num'이라는 이름의 메모리 공간에 새로운 값 '20'을 저장합니다.
str = new String("World");를 실행하면, 'str'이라는 이름의 메모리 공간에 새로운 문자열 객체 "World"의 메모리 주소를 저장합니다.
이렇게 기본 타입은 실제 값을 저장하고, 참조 타입은 객체의 메모리 주소를 저장하는 차이가 있습니다.

 

 

 

 

 

 

 

 

char [] numChar = numbers.toCharArray(); 은 기본 객체인가? 참조객체인가?

 

char[] numChar = numbers.toCharArray();

에서 numChar는 참조 객체입니다. 

numChar는 char 타입의 배열을 참조하고 있습니다.

Java에서는 원시 타입(primitive type)과 참조 타입(reference type)이 있습니다. 

원시 타입에는 boolean, byte, char, short, int, long, float, double이 있으며, 나머지 모든 타입은 참조 타입입니다.

char []는 원시 타입인 char의 배열이며, 배열 자체는 참조 타입입니다. 

따라서 numChar는 참조 타입인 char []를 참조하고 있습니다.

이를 도식적으로 표현하면 아래와 같습니다.

Memory Layout
-------------------
| numChar | ---- | ---> | '1' | '2' | '3' | '4' | ... |
-------------------


위의 메모리 레이아웃에서 numChar는 char[] 배열을 참조하고 있으며, 이 배열은 각각의 char 원소를 가지고 있습니다.

numbers.toCharArray(); 부분은 numbers라는 String 객체의 메서드를 호출하여, 문자열을 char 배열로 변환하는 작업을 수행합니다. 이때, toCharArray() 메서드는 문자열의 각 문자를 복사하여 새로운 char [] 배열을 생성하고, 이 배열의 참조를 반환합니다.

이를 코드와 함께 설명하면 다음과 같습니다.

java

String numbers = "1234";        // 문자열 생성
char[] numChar = numbers.toCharArray();  // 문자열을 char 배열로 변환

// 이제 numChar는 {'1', '2', '3', '4'}이라는 char 배열을 참조하게 됩니다.
// numChar[0]은 '1', numChar[1]은 '2' 등으로 각 원소에 접근할 수 있습니다.


이런 방식으로, 문자열의 각 문자를 순회하며 필요한 연산을 수행할 수 있습니다.




 

 

 

 

 

.getNumericValue 은 어떤 문법인가?

 

Character.getNumericValue()는 Java에 내장된 Character 클래스의 정적 메서드입니다.

 이 메서드는 주어진 문자(Unicode)가 숫자를 나타내는 경우 해당 숫자를 정수형으로 반환합니다. 만약 문자가 숫자를 나타내지 않는 경우 -1을 반환합니다.

예를 들어, Character.getNumericValue('3')는 정수 3을 반환하고, Character.getNumericValue('A')는 -1을 반환합니다.

따라서 이 메서드는 문자열 내의 각 문자를 숫자로 변환하는데 유용하게 사용할 수 있습니다. 위에서 제시한 코드에서는 이 메서드를 사용해 문자열의 각 문자를 숫자로 변환하고, 이를 합계에 더하는 방식으로 문자열 내의 숫자들의 합을 계산하고 있습니다.


java의 Character 클래스는 문자에 대한 다양한 연산을 지원하는 여러 정적 메서드를 제공합니다. 이 중 일부를 아래에 소개하겠습니다. 자바의 API 문서를 참조하면 더 많은 메서드를 찾아볼 수 있습니다.

Character.getNumericValue(char ch): 주어진 문자에 대응하는 숫자를 반환합니다. 만약 문자가 숫자를 나타내지 않는 경우 -1을 반환합니다.
Character.isDigit(char ch): 주어진 문자가 숫자인지 판단합니다. 숫자이면 true, 아니면 false를 반환합니다.
Character.isLetter(char ch): 주어진 문자가 알파벳인지 판단합니다. 알파벳이면 true, 아니면 false를 반환합니다.
Character.isLowerCase(char ch): 주어진 문자가 소문자인지 판단합니다. 소문자이면 true, 아니면 false를 반환합니다.
Character.isUpperCase(char ch): 주어진 문자가 대문자인지 판단합니다. 대문자이면 true, 아니면 false를 반환합니다.
Character.toLowerCase(char ch): 주어진 문자를 소문자로 변환합니다. 이미 소문자이거나 알파벳이 아닌 경우 그대로 반환합니다.
Character.toUpperCase(char ch): 주어진 문자를 대문자로 변환합니다. 이미 대문자이거나 알파벳이 아닌 경우 그대로 반환합니다.
Character.isWhitespace(char ch): 주어진 문자가 공백 문자인지 판단합니다. 공백 문자이면 true, 아니면 false를 반환합니다.
Character.isAlphabetic(int codePoint): 주어진 유니코드 코드 포인트 값이 알파벳 문자를 나타내는지 판단합니다.
Character.isBmpCodePoint(int codePoint): 주어진 유니코드 코드 포인트 값이 기본 다국어 평면(BMP)에 속하는지 판단합니다.
이외에도 Character 클래스는 다양한 문자 관련 메소드를 제공하며, 이를 활용하여 문자와 관련된 다양한 작업을 수행할 수 있습니다.