[Java] 변수

허경두·2025년 4월 1일

Java

목록 보기
2/12

변수란?

변수(variables) : 단 하나의 값을 저장할 수 있는 기억 공간 (읽고 쓰는 게 가능)

  • 읽기(Read) : 변수의 이름 적기
  • 쓰기(Write) : '=' 대입 연산자로 값 할당
    int a; // 선언
    int b = 10; // 초기화(처음으로 값 저장)
    b = 20; // 쓰기
    int c = a + 1; // 변수 a 읽기

변수의 명명규칙

  1. 대소문자가 구분되며 길이에 제한이 없다
  2. 예약어를 사용하면 안된다
  3. 숫자로 시작하면 안된다
  4. 특수문자는 '_'(언더바) 와 '$'만을 허용한다

변수의 종류

변수 유형설명선언 위치메모리 할당 시점접근 제한
클래스 변수 (static 변수)클래스에 속하며 모든 인스턴스가 공유클래스 내부, static 키워드 사용클래스가 메모리에 로드될 때public, private, protected, default
인스턴스 변수객체(인스턴스)마다 개별적으로 존재클래스 내부객체 생성 시public, private, protected, default
지역 변수특정 메서드나 블록 내에서만 유효메서드 또는 블록 내부변수 선언 시없음 (해당 블록 내에서만 접근 가능)
매개변수메서드 호출 시 전달되는 변수메서드의 매개변수 목록메서드 호출 시없음 (메서드 내부에서만 사용 가능)
상수 (final 변수)한 번 할당되면 변경 불가클래스 내부 또는 메서드 내부선언 시 또는 생성자에서 할당public, private, protected, default
  • 지역 변수는 반드시 수동으로 초기화 해야 함

리터럴이란?

리터럴(literal) : 값 자체 (상수) → 타입이 존재함
e.g. 100, 200 'a', ...

문자열 리터럴은 클래스 로드 시에 메모리에 저장된다

String s = "ABC";
String t = "ABC"; // "ABC" 라는 문자열 리터럴이 이미 메모리에 할당되어 있기 때문에 참조해서 사용한다
String u = new String("ABC");
String v = new String("ABC"); // 새로운 메모리 공간에 할당하기 때문에 좋지 않다

타입

  • primitive type : 실제 값 저장 → 원소

  • reference type : 메모리 주소값 저장(객체의 주소값) → 집합
    (32bit 운영체제 - 4byte, 64bit 운영체제 - 8byte)

  • primitive 타입별 크기 및 범위

    타입크기최소값최대값정밀도
    byte1바이트-1281278비트 정수
    short2바이트-32,76832,76716비트 정수
    int4바이트-2,147,483,6482,147,483,64732비트 정수
    long8바이트-9,223,372,036,854,775,8089,223,372,036,854,775,80764비트 정수
    float4바이트±1.4E-45±3.4E38약 7자리 소수 정밀도
    double8바이트±4.9E-324±1.8E308약 15자리 소수 정밀도
    char2바이트'\u0000' (0)'\uffff' (65,535)유니코드 문자
    boolean1바이트※true 또는 falsetrue 또는 false1비트 (이론상)※※

    boolean의 크기는 JVM 구현에 따라 다를 수 있음
    ※※ boolean은 1비트만 필요하지만, 실제 메모리 사용량은 JVM이 최적화하여 결정함
    - 지수 표기법 : E-8 = 10^(-8), E+02 = 10^2

  • 할당 시 타입의 범위가 변수 >= 리터럴 인 경우에만 할당 가능

  • char의 인코딩과 디코딩
    인코딩(encoding) : 'A'(문자) → 65(ASCII 코드)
    디코딩(decoding) : 65(ASCII 코드) → 'A'(문자)

    정수형의 overflow

    십진수 값32비트 이진수 표현설명
    2,147,483,6460111 1111 1111 1111 1111 1111 1111 1110정상 범위
    2,147,483,6470111 1111 1111 1111 1111 1111 1111 111132비트 정수(int)의 최댓값
    오버플로우 발생1000 0000 0000 0000 0000 0000 0000 00002,147,483,647 + 1 → -2,147,483,648로 순환
    -2,147,483,6481000 0000 0000 0000 0000 0000 0000 000032비트 정수(int)의 최솟값
    -2,147,483,6471000 0000 0000 0000 0000 0000 0000 0001정상 범위
    언더플로우 발생0111 1111 1111 1111 1111 1111 1111 1111-2,147,483,648 - 1 → 2,147,483,647로 순환

형변환

형변환(casting) : 변수 또는 상수의 타입을 다른 타입으로 변환하는 것

형변환 규칙

  1. boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다
  2. 기본형과 참조형은 서로 형변환할 수 없다
  3. 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다 (자동형변환) → 기존의 값을 최대한 보존할 수 있다
    float a = 3.14 // 리터럴의 타입은 double(8byte), 변수의 타입은 float(4byte) 이므로 불가
    float f = (float) 3.14 // 명시적으로 형변환하면 할당 가능
    float g = 3.14F // 리터럴 타입을 float하여 타입을 일치시키면 가능
    int b = 'a' // 리터럴의 타입은 char(2byte), 변수의 타입은 int(4byte) 이므로 자동 형변환

진법

printf


추가 지식

  • 실수의 저장 방식

    타입부호 비트 (Sign)지수부 (Exponent)가수부 (Mantissa)총 비트 수
    float1비트8비트23비트32비트
    double1비트11비트52비트64비트

    값 = (-1)^S * M * 2^E
    (M은 1.XXXX의 이진수로 표현되고 XXXX 부분을 가수부에 저장)

  • 부동 소수점에 오차가 발생하는 경우

    1. 값 자체에 오차가 있는 경우
    2. 10진수를 2진수로 변환하면서 오차가 생기는 경우
    3. 저장공간(정밀도)에 의해 오차가 생기는 경우
  • 정수는 오차가 없으나 범위가 좁고 실수는 오차가 있으나 범위가 넓음 → 오차가 없어야만 하는 상황이 존재하므로 잘 선택해서 사용

  • CPU가 싱글 코어에서 멀티 코어로 변하면서 변수에서 공유 자원에 대한 접근 문제가 생겨 변수 대신 상수를 선호 → 상수는 필요할 때마다 새로 메모리를 할당해야 함 → 메모리 용량도 늘어나서 감당 가능 (메모리를 해제하는 비용은 존재)

  • 값을 직접 쓰지 않고 변수나 상수에 할당해서 사용해야 함
    왜? 같은 값을 코드에서 일일이 수정해야 하는 상황 발생

  • 가독성을 위해 정수형 값에 _(언더바) 사용 가능

    int a = 100_000;

0개의 댓글