변수(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 |