Dev/Java

[Java] 변수, 자료형

syuare 2025. 4. 14. 19:24

변수(Variable)

데이터를 컴퓨터에 저장하기 위한 공간

  • Java 의 데이터들은 메모리에서 관리된다.
// 구조
[자료형] [변수이름][세미콜론]

// 예시
int a;

 

변수 이름 규칙

  • 카멜케이스, 명사 형태로 사용 권장
  • 숫자 시작 X, 공백 사용 X, 예약어 사용 X
  • 특수 문자를 거의 사용하지 않지만 만약에 사용한다면 '_', '$' 정도만 사용 가능

더보기

세미콜론(`;`)

  • Java에서 문장을 끝내는 마침표 > 문장이 끝났다는 것을 컴퓨터에게 알려준다.
  • 세미콜론이 없으면 문장이 끝난 건지 아닌지 컴퓨터가 헷갈려서 오류를 발생시킬 수 있다

세미콜론이 필요

  • 실행 가능한 단일 문(statement)의 끝
    • 변수 선언, 메서드 호출, return 문 등
int number = 10;            // 변수 선언 및 초기화
System.out.println(number); // 메서드 호출
return number;              // return 문

세미콜론이 불필요

  • 구조적 선언일 때
    • 클래스, 메서드, 제어문(반복문 등) 등 중괄호({})를 통해 코드 블록을 구분했을 때는 세미콜론이 불필요하다.
// 예시1. 클래스 선언
public class Main {
    // 클래스 내부에 멤버 변수 및 메서드 선언...
}

// 예시2. 메서드 선언
public void display() {
    System.out.println("Hello");
}

// 예시3. 제어문 코드 블록
if (number > 0) {
    System.out.println("양수입니다.");
} else {
    System.out.println("0 혹은 음수입니다.");
}

// 예시4. 클래스 멤버 변수/메서드 선언
public class Sample {
    private int value;  // 필드 선언에는 세미콜론 필수
    
    public void doSomething() {
        // 메서드 구현, 중괄호로 구분되어 세미콜론 없음
    }
}

 


변수 선언

'데이터 저장 공간을 생성한다 ' 라는 의미

 

변수 값 할당

'생성한 데이터 저장 공간에 데이터를 넣어준다' 라는 의미

  • 변수에 지정된 값이 아닌 미리 선언된 변수도 할당할 수 있다.
// 변수 선언
int a;

// 변수 값 할당
a = 1;

// a 는 변수이름(Variable)
// 1 은 리터럴(literal): 변수 안에 직접 “넣는 값”

// 변수 선언 + 값 할당을 한 번에 할 수 있다. > 초기화
int b = 2;

 

초기화(initialization)

변수에 처음으로 데이터 값이 할당되는 것

 

변수의 재사용 > 데이터 재할당(reassign)

선언된 변수는 재사용 될 수 있으며, 기존 변수에 값을 설정하는 것

기존 변수에 값을 재할당하면, 재할당된 값으로 덮어씌워진다.

int c = 1;

c=4;
c=5;
c=6;

// c는 1이라는 값으로 초기화되었지만
// 값이 재할당되어 최종적으로 할당된 c의 값은 6이다

 

변수에 변수 할당

변수에 미리 선언된 변수를 할당할 수 있다.

int d = 1;
int e = d; // d=1 값이 복사되어 할당됨

d = 10;

System.out.println("d = " + d); // d = 10
System.out.println("e = " + e); // e = 1

// 변수 e에는 d=1 값이 복사되어 할당되었기 때문에
// d 값을 재할당하더라도 변수 e의 값은 이미 복사된 1을 값으로 가진다.

자료형(DataType)

메모리를 사용하는 단위

데이터의 크기를 결정하는 규칙

  • 변수 이름: 데이터의 위치를 표현
  • 자료형: 데이터의 크기를 표현

*컴퓨터에서 메모리는 1바이트 주소로 관리됨

int a = 10; // 4 바이트 크기의 a 변수에 정수형 데이터 10을 넣어 초기화.
int b; // 4바이트 크기의 b 변수에 어떤 값이 저장되 있는지 알 수 없음.

 

자료형 종류 범위 바이트 비트
boolean 논리형 true 또는 false N/A N/A
char 문자형 0 ~ 65535 2 바이트 16 비트
byte 정수형 -128 ~ 127 1 바이트 8 비트
short 정수형 -32,768 ~ 32,767 2 바이트 16 비트
int 정수형 -2,147,483,648 ~ 2,147,483,647 4 바이트 32 비트
long 정수형 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 8 바이트 64 비트
float 실수형 (단정도) 약 ±3.40282347E+38
/ 약 소수점 6~7자리까지
4 바이트 32 비트
double 실수형 (배정도) 약 ±1.79769313486231570E+308
/ 약 소수점 15~17자리까지
8 바이트 64 비트

더보기

float  double 형의 범위를 약이라고 표현한 이유

 

IEEE 754 부동소수점 표현 방식 때문

  • 부동소수점을 표현하는 표준
    • 부동소수점 수: 정수부와 소수부가 분리되어 있는 수를 표현하는 방식
  • 컴퓨터에서 실수를 이진수로 표현하고, 그에 따른 산술 연산을 수행하기 위한 국제 표준
s: 부호 비트 (0이면 양수, 1이면 음수)
M: 가수(mantissa) 또는 유효숫자 (정규화된 경우 1.f 와 같이 표현됨)
E: 지수(exponent)

(... 일단 여기까지만 알아봅시다. // 언젠가 알 수 있을 날이 오기를...)

 

Java의 float  double 2진수 기반의 부동소수점으로 저장

  • 10진수에서 정확한 자릿수를 보장하지 못하는 경우가 있기 때문
  • 즉, 정확하게 표현이 안되기 때문에 '약'으로 표현

소수점을 표현하는 실수형을 사용할 때는 보통 double을 사용한다.

  • double이 높은 정밀도를 제공함에 따라 계산의 안정성과 정확성을 보장하기 때문!
    • 과거에는 메모리 사용, 계산 속도 측면에서 float가 유리했지만,
    • 현재는 대부분의 cpu, 하드웨어 성능이 발전하여 float와 double의 성능 차이가 거의 없고,
      double 연산을 효율적으로 처리할 수 있다고 한다.
  • 또한 실수형 리터럴들은 디폴트로 double 타입으로 인식된다.
    • 만약 float로 사용하고 싶으면 소수 값 뒤에 f(혹은 F)를 붙여서 사용해야한다.

 

float f = 3.14f; // float형 리터럴
double d = 3.14; // double형 리터럴 (기본값)

더보기

(깜짝 예제) 실제 값에 float가 가질 수 있는 자료형 크기보다 더 큰 값을 할당하면 어떻게 될까?

  • float는 대략 소수점 6~7자리 표현된다고 하는데, 만약 할당된 값이 더 많은 소수점을 가질 경우라면?
// 실수형 (소수점, 보통 double을 많이 사용한다)
float floatBox = 0.12345678f;

floatBox = 0.1234567890f;
System.out.println("floatBox = " + floatBox);

// 답: floatBox = 0.12345679 

// 표현되는 소수점까지 표기 후 반올림하여 값을 표현, 그러나 그마저도 값이 정확하지는 않다.

// → 0.1234567까지 보여주고, 9에서 반올림을 하여  0.12345679  값을 출력한다. (값도 정확하지 않다.)


자료형 사용 예시

더보기
public class Main {
    
    //프로그램 시작점
    public static void main(String[] args) {
        
        //변수 선언;
        
        // 정수형
        int a = 1;
        a = 2;
        System.out.println("a = " + a);
        
        // 논리형
        boolean booleanBox = true;
        booleanBox = false;
        System.out.println("booleanBox = " + booleanBox);
        
        // 문자형
        char charBox = 'a'; // 문자형에는 문자 하나만 담아야 한다.
        charBox = 'b';
        System.out.println("charBox = " + charBox);
        
        // 큰 정수형
        long longBox = 1; // 굉장히 큰 박스에 1을 담았다...
        longBox = 2;
        System.out.println("longBox = " + longBox);

        // 실수형 (소수점, 보통 double을 많이 사용한다)
        float floatBox = 0.12345678f;
        floatBox = 0.1234567890f;
        System.out.println("floatBox = " + floatBox);
        
        double doubleBox = 0.1234567890;
        System.out.println("doubleBox = " + doubleBox);

        // 캐스팅(Casting)
        // 다운캐스팅: 큰 데이터를 -> 작은 상자에 넣는 방식
        double bigBox = 10.123;
        int smallBox = (int) bigBox;
        System.out.println("smallBox = " + smallBox);

        // 업캐스팅: 작은 데이터를 -> 큰 상자에 넣는 방식
        int smallBox2 = 10;
        double bigBox2 = smallBox2;
        System.out.println("bigBox2 = " + bigBox2);

        // 문자열 데이터
        char a1 = 'a'; // 문자형은 작은 따옴표 (' ')
        String str = "안녕하세요!"; // 문자열은 큰 따옴표(" ")
        System.out.println("str = " + str);
        
        // 정수형
        int a2 = 1;
        long a3 = 1;
        
        // 논리형
        boolean b1 = true;

    }
    
}

형 변환 (Casting)

변수의 자료형을 다른 자료형으로 변경하는 것

 

다운캐스팅(DownCasting): 큰 데이터를 -> 작은 상자에 넣는 방식

  • 작은 자료형으로 변환되었기에 데이터가 소실됨

업캐스팅(UpCasting): 작은 데이터를 -> 큰 상자에 넣는 방식

  • 큰 자료형으로 변환되었기에 데이터가 소실되지 않음 (보전됨)
// 캐스팅(Casting)
// 다운캐스팅
double bigBox = 10.123;
int smallBox = (int) bigBox;
System.out.println("smallBox = " + smallBox); // 10

// 업캐스팅
int smallBox2 = 10;
double bigBox2 = smallBox2;
System.out.println("bigBox2 = " + bigBox2); // 10.0

 

 

'Dev > Java' 카테고리의 다른 글

[Java] 제어문(조건문)  (0) 2025.04.16
[Java] 연산자  (0) 2025.04.15
[Java] 문자열 데이터 비교 / 비교연산자(==) vs .equals()  (0) 2025.04.15
[Java] 입출력(Input, OutPut)  (0) 2025.04.15
[Java] Java 개념  (0) 2025.04.14