JavaScript

웹 개발의 필수 언어

동적인 웹 페이지 구현을 위한 핵심 프로그래밍 언어.

Java

객체지향 프로그래밍

안정적이고 확장성 있는 백엔드 개발의 대표 언어.

HTML

웹의 기초

웹 페이지의 구조를 정의하는 마크업 언어.

React

현대적 UI 라이브러리

효율적인 사용자 인터페이스 구축을 위한 JavaScript 라이브러리.

CSS

웹 디자인의 핵심

웹 페이지의 시각적 표현을 담당하는 스타일 언어.

Spring

자바 웹 프레임워크

기업급 애플리케이션 개발을 위한 강력한 프레임워크.

Java

자바 변수 체크 문제

lamarcK 2025. 5. 19. 13:26

문제

자동 타입 변환에서 컴파일 에러가 발생하는 것을 선택하시오.

byte byteNum = 10;
short shortNum = 20;
char charNum = 'A';
int intNum = 30;
long longNum = 40L;
float floatNum = 3.14f;
double doubleNum = 5.5;

1. int result1 = byteNum;
2. char result2 = shortNum;
3. float result3 = longNum;
4. short result4 = charNum;
5. double result5 = floatNum;

정답 : 2번, 4번에서 컴파일 에러 발생

컴파일러의 자동 형변환 판단 기준

  1. 크기가 큰 타입으로의 변환은 자동 변환 허용
  2. 크기가 같더라도 표현 범위가 다르면 자동 변환 불가
  3. 데이터 손실 가능성이 있으면 자동 변환 불가

해설

  1. byte(1byte) → int(4byte): 가능
    • 크기가 큰 타입으로 변환되므로 자동 변환 가능
    • byte 범위: -128 ~ 127 (2^7 ~ 2^7-1)
    • int 범위: -2,147,483,648 ~ 2,147,483,647 (2^31 ~ 2^31-1)
  2. short(2byte) → char(2byte): 불가능
    • 음수 데이터 손실 가능성으로 컴파일 에러
    • short(-32768 ~ 32767)는 음수 포함
    • char(0 ~ 65535)는 양수만 가능
  3. long(8byte) → float(4byte): 가능
    • float가 표현 범위가 더 크므로 자동 변환 가능
    • long 범위: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (2^63 ~ 2^63-1)
    • float 범위: ±3.4E-38 ~ ±3.4E+38
  4. char(2byte) → short(2byte): 불가능
    • char(0 ~ 65535)의 큰 양수값이
    • short(-32768 ~ 32767) 범위를 초과할 수 있어 컴파일 에러
  5. float(4byte) → double(8byte): 가능
    • 크기가 큰 타입으로 변환되므로 자동 변환 가능
    • float 범위: ±3.4E-38 ~ ±3.4E+38
    • double 범위: ±1.7E-308 ~ ±1.7E+308

실제 디버그 결과

result2와 result2는 명시적 형변환을 해줘야 오류가 나지 않는다.

이런 방식의 형변환은 개발자가 데이터 손실 가능성을 인지하고 있다는 것을 명시적으로 표현하기 위해 캐스팅이 필요한 것이다.

문제

강제 타입 변환에서 컴파일 에러가 발생하는 것을 선택하시오.

int num1 = 1000;
float num2 = 3.14f;
String str = "100";
char ch = 'A';
double num3 = 5.7;

1. byte result1 = (byte)num1;
2. int result2 = (int)num3;
3. char result3 = (char)str;
4. long result4 = (long)num2;
5. short result5 = (short)ch;

정답: 3번

컴파일 에러가 발생하는 이유

  1. 기본형(primitive type) ↔ 참조형(reference type) 간의 직접 형변환 불가
  2. String → char 변환은 str.charAt(0) 메소드를 사용해야 함

해설

  1. int → byte: 가능 (데이터 손실 있을 수 있음)
    • 1000 → -24 (byte 범위 초과로 값 손실)
  2. double → int: 가능 (소수점 이하 손실)
    • 5.7 → 5
  3. String → char: 불가능 (컴파일 에러)
    • 참조형과 기본형 간의 직접 형변환 불가
    • str.charAt(문자순서) 사용해야 함
    • "문자열"에서 "문자"로의 변환이기 때문에 데이터 손실 발생
    • 즉 문자열이 1글자 이상일 경우 그 외 글자를 char에 한번에 담을 수 없음 
  4. float → long: 가능
    • 3.14f → 3
  5. char → short: 가능 (데이터 손실 있을 수 있음)
    • 'A'(65) → 65

실제 디버그 결과

String "100"은 문자열이므로 내부적으로는 각 문자의 유니코드(ASCII) 값으로 저장된다.

  • '1' = 49
  • '0' = 48
  • '0' = 48

char 타입 연산

또한 result3은 char 타입인데 char 타입은 내부적으로는 유니코드 값으로 저장되기 때문에 보이는 것은 1이지만 실제 값은 49이다.

때문에 연산을 할 경우 유니코드 값을 기준으로 연한을 하게 된다.

때문에 일반적인 + 연산을 할 경우 수치형(byte, short, int, long, float, double)에 담아야한다.

혹은 연산을 하고 나서 char로 형변환을 해줘야한다.

만약에 char의 문자를 활용하고 싶다면 형변환 규칙을 사용해서 String 등으로 저장할 수 있다.

문제

변수 초기화 중 올바른 것을 고르시오.

1) char var1 = '';
2) long var2 = 10000000000;
3) byte var3 = 300;
4) String var4 = 'Hello';
5) double var5 = 3.14f;
6) String var6 = """
                 Hello
                 World
                 ;

 

정답 : 5번

해설

  1. char는 빈 문자('')를 가질 수 없음
  2. long 타입은 숫자 뒤에 L을 붙여야 함 (10000000000L)
  3. byte의 범위는 -128~127이므로 300은 저장할 수 없음
  4. String은 작은따옴표가 아닌 큰따옴표("")를 사용해야 함
  5. float 값을 double에 저장하는 것은 가능하므로 올바른 초기화
  6. Text block의 마지막 """ 이 누락됨

"""(Text Block)는 Java 15부터 도입된 기능으로, 여러 줄의 문자열을 보기 좋게 작성할 수 있게 해준다.

///일반 문자열 표현
// 한 줄
String str1 = "Hello";

// 여러 줄 (기존 방식)
String str2 = "Hello\n" +
              "World\n" +
              "Java";

Text Block(""") 사용:
String str3 = """
              Hello
              World
              Java
              """;

실제 디버그 결과

var3의 경우 byte에 저장하려고 하면 범위가 다르기 때문에 자릿수가 잘리게 된다.

만약에 형변환을 통해 byte로 저장할 경우 300이 44로 변환되는데 과정은 다음과 같다.

  1. byte의 크기는 8비트(1바이트)이며, 표현 범위는 -128 ~ 127
  2. 300을 2진수로 변환하면: 300 = 100101100 (9비트)
  3. byte는 8비트만 저장할 수 있으므로, 맨 앞의 1이 잘리고 00101100만 저장
  4. 00101100을 10진수로 다시 변환하면 : 00101100 = 44

이것을 Truncation(잘림) 현상이라고 한다. 비트 길이에 따라 8비트만 남기고 8비트 앞의 비트가 모두 잘려버린다.

때문에 1300일 경우 앞쪽 비트가 잘려서 20이 나오는 것을 확인할 수 있다.

이는 자바의 자료형이 고정된 비트 길이를 사용하기 때문이다. 예를 들어 byte는 8비트, short는 16비트, int는 32비트와 같이 정해진 비트 크기로 데이터를 저장한다.

1. byte Truncation_byte = (byte) 1300;
1300 = 101 00010100 (11비트)
        ↓↓↓ (앞의 3비트 잘림)
        00010100 (8비트) = 20

2. short Truncation_short = (short) 123456789;

123456789 = 0111 0101 1011 1100 0101 0101 (27비트)
            ↓↓↓↓↓↓↓↓↓↓↓ (앞의 11비트 잘림)
                        1011 1100 0101 0101 (16비트) = -17291

3. int Truncation_int = (int) 123456789000L;

123456789000 = 0001 1100 1001 1110 1001 1010 1000 0010 1000 (40비트)
                ↓↓↓↓↓↓↓↓ (앞의 8비트 잘림)
                        1001 1110 1001 1010 1000 0010 1000 (32비트) = -1097262040

2의 보수법

음수가 되는 이유는 컴퓨터가 2의 보수법을 사용하여 음수를 표현하기 때문이다.
가장 왼쪽 비트(Most Significant Bit, MSB)가 부호 비트로 사용된다.
0: 양수
1: 음수 

예를 들어 short의 경우 (123456789 → -17291)

123456789 = 0111 0101 1011 1100 0101 0101
truncation 후 = 1011 1100 0101 0101

여기서 맨 앞이 1이므로 음수로 해석된다.

문제

콘솔에 값을 입출력하는 방법에 대해 잘못 설명한 것을 선택하시오.

1) System.out.print()는 출력 후 줄바꿈을 수행한다.
2) System.out.printf("%d", 변수)는 변수값을 형식에 맞게 변환하여 저장한다.
3) Scanner의 next()는 공백 전까지의 문자열을 읽는다.
4) System.out.println()은 출력 후 줄바꿈을 수행한다.
5) Scanner의 nextLine()은 Enter키 입력 전까지의 문자열을 읽는다.

정답 : 2번

해설

System.out.printf()는 변수값을 저장하는 것이 아니라, 지정된 형식에 맞춰 출력만 한다.

올바른 설명 : System.out.printf("%d", 변수)는 변수값을 형식에 맞게 변환하여 출력한다.

int num = 10;
System.out.printf("%d", num);    // 10 출력
System.out.printf("%x", num);    // a 출력 (16진수) 디버그에선 10으로 출력 실제 콘솔에선 a
System.out.printf("%4d", num);   // '  10' 출력 (4자리 정수)

문제

연산식의 타입 변환 중에서 컴파일 에러가 발생하는 것을 선택하시오.

byte byteValue = 10;
double doubleValue = 5.5;
float floatValue = 5.5F;

1) byte result1 = byteValue + byteValue;
2) int result2 = 15 + byteValue;
3) float result3 = 15 + floatValue;
4) double result4 = 15 + doubleValue;

정답 : 1번

해설

Java에서 정수 연산의 기본 타입은 int다. byte + byte의 연산 결과는 자동으로 int로 변환된다. 따라서 int 타입의 결과를 byte 타입의 변수에 저장하려면 명시적 형변환이 필요하다.

실제 디버그 결과

byte 타입으로 저장할거라면 (byte)로 형변환을 해줘야한다. 혹은 int로 변수를 선언하면 해결 된다.

'Java' 카테고리의 다른 글

Java와 JavaScript의 배열 차이점  (0) 2025.05.10
자바의 연산자  (0) 2025.04.30