λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Language/Java

[Java]μžλ°” μ •μˆ˜ νƒ€μž…

by YJ Dev 2024. 4. 20.
728x90
λ°˜μ‘ν˜•
SMALL

μžλ°” ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ •μˆ˜ νƒ€μž…μ€ 핡심적인 역할을 ν•©λ‹ˆλ‹€. 이번 κΈ€μ—μ„œλŠ” μžλ°”μ˜ λ‹€μ„― 가지 μ •μˆ˜ νƒ€μž…μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ³ , 각 νƒ€μž…μ˜ νŠΉμ§•κ³Ό μ‚¬μš© 방법을 μžμ„Ένžˆ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. ν•¨κ»˜ μžλ°” μ •μˆ˜ νƒ€μž…μ„ μ΄ν•΄ν•˜κ³ , ν”„λ‘œκ·Έλž˜λ°μ—μ„œ ν™œμš©ν•˜λŠ” 방법에 λŒ€ν•΄ μ•Œμ•„λ΄…μ‹œλ‹€.

μžλ°” μ •μˆ˜ νƒ€μž…


1. μ •μˆ˜ νƒ€μž…μ˜ μ’…λ₯˜πŸŒˆ

λ³€μˆ˜μ˜ νƒ€μž…μ΄ 정해지면, μ €μž₯ κ°€λŠ₯ν•œ κ°’μ˜ μ’…λ₯˜μ™€ ν—ˆμš© λ²”μœ„λ„ ν•¨κ»˜ κ²°μ •λ©λ‹ˆλ‹€. μ •μˆ˜ νƒ€μž…μ€ 총 5가지가 있으며, λ©”λͺ¨λ¦¬ ν• λ‹Ή 크기와 μ €μž₯ κ°€λŠ₯ν•œ κ°’μ˜ λ²”μœ„λ₯Ό λ‹€μŒκ³Ό 같이 가지고 μžˆμŠ΅λ‹ˆλ‹€.

char νƒ€μž…μ€ ν•œ 개의 문자λ₯Ό 숫자둜 μ €μž₯ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. μ΄λ•Œ μˆ«μžλŠ” 음수둜 맀핑될 수 μ—†κΈ° λ•Œλ¬Έμ— κ°’μ˜ ν—ˆμš© λ²”μœ„μ— μŒμˆ˜κ°€ μ—†μŠ΅λ‹ˆλ‹€.

일반적으둜 μ»΄νŒŒμΌλŸ¬λŠ” μ •μˆ˜ λ¦¬ν„°λŸ΄μ„ int둜 μ²˜λ¦¬ν•˜λ©°, int의 ν—ˆμš© λ²”μœ„λ₯Ό μ΄ˆκ³Όν•˜λŠ” λ¦¬ν„°λŸ΄μ€ 뒀에 'l' λ˜λŠ” 'L'을 λΆ™μ—¬ long νƒ€μž… κ°’μž„μ„ μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ•Œλ €μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

πŸ™Œμ—¬κΈ°μ„œ 잠깐!
λ¦¬ν„°λŸ΄μ΄λž€?
λ¦¬ν„°λŸ΄μ€ μ½”λ“œμ—μ„œ μ§μ ‘μ μœΌλ‘œ 값을 λ‚˜νƒ€λ‚΄λŠ” κ³ μ •λœ ν‘œκΈ°λ²•μž…λ‹ˆλ‹€.

λ¦¬ν„°λŸ΄μ€ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ κ°’ 자체λ₯Ό ν‘œν˜„ν•˜λŠ”λ° μ‚¬μš©λ˜λ©°, μ»΄νŒŒμΌλŸ¬κ°€ ν•΄λ‹Ή 값을 μ΄ν•΄ν•˜κ³  μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

μ •μˆ˜ νƒ€μž… λ©”λͺ¨λ¦¬ 크기, μ €μž₯ ν—ˆμš© λ²”μœ„

κ°„λ‹¨ν•œ 예제둜 μ •μˆ˜ νƒ€μž…μ˜ λ²”μœ„λ₯Ό ν™•μΈν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ 각 μ •μˆ˜ νƒ€μž…μ˜ μ΅œμ†Ÿκ°’κ³Ό μ΅œλŒ“κ°’μ„ 좜λ ₯ν•˜λŠ” μ½”λ“œμž…λ‹ˆλ‹€:

public class IntegerRangeExample {
    public static void main(String[] args) {
        System.out.println("Byte νƒ€μž…μ˜ λ²”μœ„: " + Byte.MIN_VALUE + " ~ " + Byte.MAX_VALUE);
        System.out.println("Short νƒ€μž…μ˜ λ²”μœ„: " + Short.MIN_VALUE + " ~ " + Short.MAX_VALUE);
        System.out.println("Int νƒ€μž…μ˜ λ²”μœ„: " + Integer.MIN_VALUE + " ~ " + Integer.MAX_VALUE);
        System.out.println("Long νƒ€μž…μ˜ λ²”μœ„: " + Long.MIN_VALUE + " ~ " + Long.MAX_VALUE);
    }
}


이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ 각 μ •μˆ˜ νƒ€μž…μ˜ μ΅œμ†Ÿκ°’κ³Ό μ΅œλŒ“κ°’μ΄ 좜λ ₯λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 각 μ •μˆ˜ νƒ€μž…μ΄ ν‘œν˜„ν•  수 μžˆλŠ” λ²”μœ„λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.


2.μ •μˆ˜ λ¦¬ν„°λŸ΄μ„ ν‘œν˜„ν•˜λŠ” 4가지 λ°©λ²•πŸŽ›

μ •μˆ˜λ₯Ό ν‘œν˜„ν•  λ•Œ μ‚¬μš©λ˜λŠ” 수 ν‘œν˜„ 방법을 "μ§„μˆ˜"라고 ν•©λ‹ˆλ‹€. JavaλŠ” 기본적으둜 10μ§„μˆ˜λ₯Ό μ‚¬μš©, μ •μˆ˜ λ¦¬ν„°λŸ΄ μž‘μ„±ν•  λ•ŒλŠ” 10μ§„μˆ˜κ°€ 기본적으둜 μ‚¬μš©λ©λ‹ˆλ‹€.

μ •μˆ˜ λ¦¬ν„°λŸ΄μ€ μ½”λ“œμ—μ„œ μ •μˆ˜ 값을 λ‚˜νƒ€λ‚΄λŠ” λ°©λ²•μž…λ‹ˆλ‹€. μžλ°”μ—μ„œλŠ” λ‹€μŒκ³Ό 같은 λ°©λ²•μœΌλ‘œ μ •μˆ˜λ₯Ό ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€

  1. Decimal (10μ§„μˆ˜): κ°€μž₯ ν”ν•œ λ°©λ²•μœΌλ‘œ, 0λΆ€ν„° 9κΉŒμ§€μ˜ 숫자λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
    예λ₯Ό λ“€μ–΄, int number = 42;와 같이 μ‚¬μš©ν•©λ‹ˆλ‹€.
  2. Binary (2μ§„μˆ˜): 0κ³Ό 1둜만 ν‘œν˜„ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. 숫자 μ•žμ— 0bλ‚˜ 0Bλ₯Ό λΆ™μ—¬μ„œ ν‘œν˜„ν•©λ‹ˆλ‹€.
    예λ₯Ό λ“€μ–΄, int binaryNumber = 0b1010;와 같이 μ‚¬μš©ν•©λ‹ˆλ‹€.
  3. Octal (8μ§„μˆ˜): 0λΆ€ν„° 7κΉŒμ§€μ˜ 숫자λ₯Ό μ‚¬μš©ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. 숫자 μ•žμ— 0을 λΆ™μ—¬μ„œ ν‘œν˜„ν•©λ‹ˆλ‹€.
    예λ₯Ό λ“€μ–΄, int octalNumber = 052;와 같이 μ‚¬μš©ν•©λ‹ˆλ‹€.
  4. Hexadecimal (16μ§„μˆ˜): 0λΆ€ν„° 9κΉŒμ§€μ˜ μˆ«μžμ™€ AλΆ€ν„° FκΉŒμ§€μ˜ μ•ŒνŒŒλ²³μ„ μ‚¬μš©ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.
    숫자 μ•žμ— 0xλ‚˜ 0Xλ₯Ό λΆ™μ—¬μ„œ ν‘œν˜„ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, int hexNumber = 0xFF;와 같이 μ‚¬μš©ν•©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ μ •μˆ˜ 값을 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν™œμš©ν•˜λ©΄ λ‹€μ–‘ν•œ μƒν™©μ—μ„œ μœ μ—°ν•˜κ²Œ μ •μˆ˜ 값을 λ‹€λ£° 수 μžˆμŠ΅λ‹ˆλ‹€.

public class IntegerLiteralsExample {
    public static void main(String[] args) {
        // Decimal (10μ§„μˆ˜)
        int decimalNumber = 42;
        long bigDecimalNumber = 1234567890L; // long νƒ€μž…μ—λŠ” λ¦¬ν„°λŸ΄ 뒀에 'L' λ˜λŠ” 'l'을 λΆ™μž…λ‹ˆλ‹€.

        // Binary (2μ§„μˆ˜)
        int binaryNumber = 0b1010;

        // Octal (8μ§„μˆ˜)
        int octalNumber = 052;

        // Hexadecimal (16μ§„μˆ˜)
        int hexNumber = 0xFF;

        // 좜λ ₯
        System.out.println("Decimal: " + decimalNumber);
        System.out.println("Big Decimal: " + bigDecimalNumber);
        System.out.println("Binary: " + binaryNumber);
        System.out.println("Octal: " + octalNumber);
        System.out.println("Hexadecimal: " + hexNumber);
    }
}

3.이진데이터 ν‘œν˜„πŸ–₯

μ»΄ν“¨ν„°λŠ” 10μ§„μˆ˜ 데이터λ₯Ό 2μ§„μˆ˜ λ°μ΄ν„°λ‘œ λ³€ν™˜ν•˜μ—¬ μ €μž₯ν•˜λŠ”λ°, 이 λ•Œ λ³€ν™˜λœ 데이터λ₯Ό λ‹΄λŠ” μ΅œμ†Œ 곡간 λ‹¨μœ„λ₯Ό λΉ„νŠΈ(bit)라고 ν•©λ‹ˆλ‹€. λ©”λͺ¨λ¦¬μ˜ μ •μˆ˜ νƒ€μž…μ€ κ³ μ •λœ 크기의 λΉ„νŠΈ νŒ¨ν„΄μœΌλ‘œ μ €μž₯λ©λ‹ˆλ‹€.

byte, short, int, long은 λͺ¨λ‘ λΆ€ν˜Έκ°€ μžˆλŠ” μ •μˆ˜ νƒ€μž…μœΌλ‘œ, κ°€μž₯ μ΅œμƒμœ„ λΉ„νŠΈλŠ” λΆ€ν˜Έλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. μ–‘μˆ˜μΌ 경우 μ΅œμƒμœ„ λΉ„νŠΈλŠ” 0으둜, 음수일 경우 1둜 ν‘œν˜„λ©λ‹ˆλ‹€. λ‚˜λ¨Έμ§€ λΉ„νŠΈλŠ” κ°’μ˜ λ²”μœ„λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.

이진데이터 ν‘œν˜„μ •μˆ˜νƒ€μž… 2μ§„μˆ˜


예λ₯Ό λ“€μ–΄, byte νƒ€μž…μ€ 8λΉ„νŠΈλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 이 μ€‘μ—μ„œ κ°€μž₯ μƒμœ„ λΉ„νŠΈλŠ” λΆ€ν˜Έ λΉ„νŠΈλ‘œ μ‚¬μš©λ˜λ©°, λ‚˜λ¨Έμ§€ 7λΉ„νŠΈλŠ” κ°’μ˜ λ²”μœ„λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ ꡬ쑰 λ•Œλ¬Έμ— byte νƒ€μž…μ€ -128λΆ€ν„° 127κΉŒμ§€μ˜ μ •μˆ˜ 값을 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λΆ€ν˜Έ λΉ„νŠΈκ°€ 0이면 μ–‘μˆ˜λ₯Ό, 1이면 음수λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 이λ₯Όν…Œλ©΄, 8λΉ„νŠΈμ—μ„œ 첫 번째 λΉ„νŠΈκ°€ 0이면 ν•΄λ‹Ή 값은 μ–‘μˆ˜λ₯Ό λ‚˜νƒ€λ‚΄κ³ , 1이면 음수λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. λ‚˜λ¨Έμ§€ λΉ„νŠΈλŠ” ν•΄λ‹Ή 값을 λ‚˜νƒ€λ‚΄λ©°, 이 λΉ„νŠΈλ“€μ˜ 쑰합에 따라 λ‹€μ–‘ν•œ μ–‘μˆ˜μ™€ 음수λ₯Ό ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


μ΄μ§„λ°μ΄ν„°μ—μ„œ μ–‘μˆ˜μ™€ 음수λ₯Ό ν‘œν˜„ν•˜λŠ” 방식은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. μ–‘μ˜ μ •μˆ˜ ν‘œν˜„ (Unsigned Integer Representation):
    β–  μ–‘μ˜ μ •μˆ˜λŠ” μ΄μ§„μˆ˜λ‘œ κ·ΈλŒ€λ‘œ ν‘œν˜„λ©λ‹ˆλ‹€.
    β–  예λ₯Ό λ“€μ–΄, 10μ§„μˆ˜ 5λŠ” μ΄μ§„μˆ˜λ‘œ 101둜 ν‘œν˜„λ©λ‹ˆλ‹€.
  2. 음의 μ •μˆ˜ ν‘œν˜„ (Signed Integer Representation):
    β–  음의 μ •μˆ˜λŠ” 보수λ₯Ό μ‚¬μš©ν•˜μ—¬ ν‘œν˜„λ©λ‹ˆλ‹€.
    1) 1의 보수 (One's Complement): λͺ¨λ“  λΉ„νŠΈλ₯Ό λ°˜μ „μ‹œν‚΅λ‹ˆλ‹€.
    예λ₯Ό λ“€μ–΄, 10μ§„μˆ˜ -5의 1의 λ³΄μˆ˜λŠ” μ΄μ§„μˆ˜λ‘œ 010이 λ©λ‹ˆλ‹€.
    2) 2의 보수 (Two's Complement): 1의 λ³΄μˆ˜μ— 1을 λ”ν•©λ‹ˆλ‹€.
    예λ₯Ό λ“€μ–΄, 10μ§„μˆ˜ -5의 2의 λ³΄μˆ˜λŠ” μ΄μ§„μˆ˜λ‘œ 011이 λ©λ‹ˆλ‹€.

2의 보수λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” λ§μ…ˆ μ—°μ‚°μ˜ νŽΈμ˜μ„±κ³Ό μ •ν™•μ„± λ•Œλ¬Έμž…λ‹ˆλ‹€. μ΄μ§„μˆ˜λ‘œ ν‘œν˜„λœ 음의 μ •μˆ˜λŠ” κ°€μž₯ μ™Όμͺ½ λΉ„νŠΈκ°€ 1인 κ²ƒμœΌλ‘œ μΈμ‹λ˜μ–΄ μŒμˆ˜μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.


CPUλŠ” 데이터에 λŒ€ν•œ λ§μ…ˆ 연산을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ κ°€μ‚°νšŒλ‘œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λΊ„μ…ˆ 연산을 μ²˜λ¦¬ν•˜λŠ” λ°μ—λŠ” κ°μ‚°νšŒλ‘œλ₯Ό μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. CPUλŠ” 주둜 가산에 νŠΉν™”λœ λͺ…λ Ή 처리 μž₯μΉ˜μž…λ‹ˆλ‹€. 이둜 인해 μ»΄ν“¨ν„°λŠ” λΊ„μ…ˆ 연산을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ 보수 κ°œλ…μ„ μ±„νƒν•©λ‹ˆλ‹€.

λ³΄μˆ˜λŠ” 각 자리의 숫자의 합이 μΌμ •ν•œ μˆ˜κ°€ λ˜λ„λ‘ λ§Œλ“œλŠ” μˆ˜μž…λ‹ˆλ‹€. μ»΄ν“¨ν„°μ—μ„œλŠ” 음수λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•΄ 보수 κ°œλ…μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. 이진 λ°μ΄ν„°μ—μ„œ 음수λ₯Ό ν‘œν˜„ν•˜λŠ” 주된 방법은 2의 보수λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 2의 λ³΄μˆ˜λŠ” μ–΄λ–€ 수의 보수λ₯Ό μ·¨ν•˜λ©΄ ν•΄λ‹Ή μˆ˜μ— λŒ€ν•œ 음수λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 8λΉ„νŠΈμ—μ„œμ˜ -5λŠ” 5의 2의 보수λ₯Ό μ·¨ν•¨μœΌλ‘œμ¨ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ λ°©μ‹μœΌλ‘œ 보수λ₯Ό μ‚¬μš©ν•˜μ—¬ 음수λ₯Ό ν‘œν˜„ν•¨μœΌλ‘œμ¨ CPUκ°€ λΊ„μ…ˆ 연산을 μˆ˜ν–‰ν•  수 있게 λ©λ‹ˆλ‹€. μ΄λŠ” 컴퓨터가 λ§μ…ˆ μ—°μ‚°λ§ŒμœΌλ‘œ λͺ¨λ“  μ’…λ₯˜μ˜ μ‚°μˆ  연산을 μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•΄μ€λ‹ˆλ‹€.

이진 데이터 μŒμˆ˜ν‘œν˜„

음의 μ •μˆ˜λŠ” κ°€μž₯ μƒμœ„ λΉ„νŠΈκ°€ 1둜 음수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 경우λ₯Ό μ‚΄νŽ΄λ΄…μ‹œλ‹€. 이 경우, 남은 λΉ„νŠΈλ₯Ό λͺ¨λ‘ λ°˜μ „(1은 0, 0은 1둜 λ°”κΎΈκΈ°) ν•œ ν›„ 1을 λ”ν•˜μ—¬ ν•΄λ‹Ή 값을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. μœ„ μ΄λ―Έμ§€μ—μ„œ 11111110은 -2의 1의 λ³΄μˆ˜μž…λ‹ˆλ‹€. 1의 보수λ₯Ό μ·¨ν•˜λ©΄ 각 λΉ„νŠΈλ₯Ό λ°˜μ „ν•œ 결과인 0000001을 μ–»μŠ΅λ‹ˆλ‹€. 그런 λ‹€μŒ 이 값에 1을 더해야 ν•©λ‹ˆλ‹€. 1을 λ”ν•œ 값은 0000010이 되고, 이 값을 10μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜λ©΄ -2κ°€ λ©λ‹ˆλ‹€.


4.핡심 λ‚΄μš©πŸ‘€

μžλ°” μ •μˆ˜ νƒ€μž…
728x90
λ°˜μ‘ν˜•
LIST