변하는 값을 저장하는 공간
int number = 10; // 1. number라는 이름의 int 타입의 변수로 선언 및 초기화
number = 11; // 2. 변수의 값을 변경 (덮어쓰기)
변하지 않는 값을 저장하는 공간
final int number = 10; // 1. number라는 이름의 int 타입의 상수로 선언 (데이터 타입 앞에 final)
number = 11; // e2. 변수의 값 변경시 에러!
0,1,2,99 와 같은 정수형 숫자값을 저장
📌 오버플로우(Overflow)
각 변수 표현 범위를 넘는 숫자를 넣게되면 오버플로우가 발생하고, 해당 숫자를 출력해보면 입력값과 다른 값으로 표현되므로 항상 주의!!!!
(표현 범위를 초과한것이기 때문에 입력한 값보다 작거나 음수값 출력됨)
byte byteNumber = 127; // byte 는 -128 ~ 127 범위의 숫자만 저장 가능합니다.
short shortNumber = 32767; // short 는 -32,768~32,767 범위의 숫자만 저장 가능합니다.
int intNumber = 2147483647; // int 는 -21억~21억 범위의 숫자만 저장 가능합니다.
long longNumber = 2147483647L; // long 은 숫자뒤에 알파벳 L 을 붙여서 표기하며 매우 큰수를 저장 가능합니다.
📌 정수형 리터럴 구분값(리터럴 = 데이터값)
int
와long
의 데이터값(리터럴)을 구분하기 위한 구분자로 long으로 담을 숫자뒤에L
을 붙임이런식으로 데이터값(리터럴) 뒤에 붙이는 구분값을 “접미사”라고 부름
📌 데이터 표현 단위 정리
- Binary Digit(Bit): 데이터 표현 최소 단위, 0과1형태의 2진수 데이터
- Byte: 8 Bit
- KiloByte(KB): 2^10 Byte
- MegaByte(MB): 2^20 Byte
- GigaByte(GB): 2^30 Byte
...
📌 실수도 동일하게 각 변수 표현 범위를 넘는 숫자를 넣게되면 오버플로우가 발생하고, 해당 숫자를 출력해보면 입력값과 다른 값으로 표현된다.
특히, 실수는 표현범위가 매우 넓어서 정수형 변수에서 담지 못할 수 있다.
3.4 * -10^38
~ 3.4 * 10^38
(long 보다 큼)1.7 * -10^308
~ 1.7 * 10^308
(long 보다 큼)❓ float 는 4byte 만쓰는데 어떻게 long 보다 더 넓은 범위를 표현가능한가?
float 라는 단어의 뜻은 “부동” 이라는 의미를 가지고 있으며 소수점이 움직인다는 의미의 “부동 소수점 방식”으로 숫자를 저장한다.
- 부동 소수점 방식 : 가수와 지수를 구분해서 저장하고 이값들을 곱한 값을 저장(표현)하는 방식
✋ float 가 long 보다 더 넓은 범위를 표현하기 때문에 자동 형변환이 안됨!
float floatNumber = 0.123f; // float 는 4byte 로 3.4 * 10^38 범위를 표현하는 실수값
double doubleNumber = 0.123123123; // double 은 8byte 로 1.7 * 10^308 범위를 표현하는 실수값
📌 실수형 리터럴 구분값(리터럴 = 데이터값)
float 와 double 의 데이터값(리터럴)을 구분하기 위한 구분자로 float으로 담을 숫자뒤에f
를 붙임
char alphabet = 'A'; // 문자 하나 저장
📌 아스키 코드(ASCII Code)
저장공간에 저장하는 값은 0,1 을 통한 숫자값을 저장한다.
그럼 문자는 어떻게 숫자로 저장할까?
바로, 숫자(int
)를 문자(char
)로 매핑해서(짝을 지어서) 표현한다!
숫자를 문자로 매핑하는 방법은 여러가지 방법이 있다.
그중에 Java 에서는 기본적으로 아스키 코드라는 규칙으로 문자를 저장(표현)하고 있다.
그래서 문자와 숫자는 서로 형변환 가능하다..!char ch = (char)asciiNumber; // 숫자 -> 문자 int asciiNumber = (int)letter; // 문자 -> 숫자
boolean flag = true; // 1. 논리형 변수 boolean 으로 선언 및 True 값으로 초기화
flag = false; // 2. False 값 저장
다른 기본형 변수가 실제 값을 저장하는 저장공간 이라면
참조형 변수는 실제 값이 아닌 원본값의 주소값을 저장
따라서 주소형 변수라고도 불림
📌 메모리 구조
- Stack: 정적으로 할당된 메모리 영역
- 크기가 몇 byte 인지 정해져 있는 기본형 변수 저장
- 추가로, 크기가 정해져 있는 참조형 변수의 주소 값도 저장
- Heap: *동적으로 할당된 메모리 영역
- 크기가 계속 늘어날 수 있는 참조형 변수의 원본 저장합
\0
(널문자)가 함께 저장이 됨!String message = "Hello World"; // 문자열 저장
List<int> alphabet = [0,1,2,3]; // 리스트: 기본형 변수 여러개 저장
래퍼 클래스(Wrapper Class)는 말 그대로 “기본형 변수를 클래스로 한번 랩핑(감싸는) 변수”
기본 타입 | 래퍼 클래스 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
클래스로 변수를 관리하면 객체지향의 많은 기능을 사용할 수 있음
// 박싱: int -> Integer
int number = 21;
Integer num = new Integer(number);
// 언박싱: Integer -> int
int n = num.intValue();
작은 타입
> 큰 타입
형변환시 (자동 형변환)큰 타입
> 작은 타입
형변환시 (강제 형변환 = 캐스팅)📌 변수 타입별 크기 순서
byte(1) → short(2) → int(4) → long(8) → float(4) → double(8)
byte byteNumber = 10;
int intNumber = byteNumber; // byte -> int 형변환
System.out.println(intNumber); // 10
char charAlphabet = 'A';
intNumber = charAlphabet; // char -> int 형변환
System.out.println(intNumber); // A의 유니코드 : 65
intNumber = 100;
long longNumber = intNumber; // int -> number 형변환
System.out.println(longNumber); // 100
intNumber = 200;
double doubleNumber = intNumber; // int -> double 형변환
System.out.println(doubleNumber); // 200.0 (소수점이 추가된 실수출력)
int intNumber = 10;
double doubleNumber = 5.5;
double result = intNumber + doubleNumber; // result 에 15.5 저장됨 (int -> double)
intNumber = 10;
int iResult = intNumber / 4; // iResult 에 2 저장됨 (int형 연산 -> 소수점 버려짐)
intNumber = 10;
double dResult = intNumber / 4.0; // dResult 에 2.5 저장됨 (double형 연산 -> 소수점 저장)
(Int)캐스팅 방식으로 실수를 정수로 치환하는 방법
이때 실수형의 소수점아래자리는 버려짐
double doubleNumber = 10.101010;
float floatNumber = 10.1010
int intNumber;
intNumber = (int)doubleNumber; // double -> int 형변환
intNumber = (int)floatNumber; // float -> int 형변환
(Double,Float) 캐스팅으로 정수형을 실수형으로 변환하는 방법
int intNumber = 10;
double doubleNumber = (double)intNumber; // int -> double 형변환
float floatNumber = (float)intNumber; // int -> float 형변환
+) 변수 초기화
자바에는 멤버변수, 클래스변수(static), 지역변수가 있는데
멤버변수, 클래스변수(static) 들은 기본값 초기화가 되지만,
지역변수는 초기화되지 않는다..!!!
🔗 스파르타코딩클럽 Java 문법 종합반
🔗 메모리구조 사진 자료