프로그래밍에서 변수는 데이터를 저장하는 "이름이 있는 저장 공간"이다. 프로그램 실행 중에 특정 값을 저장하고, 필요할 때마다 그 값을 쉽게 불러오거나 변경할 수 있다.(상수는 변수와 비슷하지만 값이 변경이 안된다는 특징이 있다.)
int number; // number 라는 이름의 int(숫자)타입의 저장공간을 선언
String name; // name 이라는 이름의 String(문자열)타입의 저장공간을 선언
위의 상자 예시를 기준으로
- int는 상자의 종류(골판지인지 플라스틱인지)
- number는 상자 앞에있는 myNum처럼 닉네임
- 10은 상자에 저장할 값이다.
final int number = 10; // 1. 상수로 선언 (데이터 타입 앞에 final 을 붙이면 됩니다.)
+ 상수는 위와 같이 선언하면 된다.
변수는 크게 3가지의 형태가 존재한다.
기본형 변수 | 기본형 변수는 실제 데이터 값을 직접 저장하는 간단한 형태의 변수 (여긴 stack 자체에 값이 저장된다.) [ int, char, boolean ] |
참조형 변수 | 참조형 변수는 데이터가 저장된 메모리 주소를 참조 (여긴 stack에 주소, heap에 값이 저장된다.) [ String, ArrayList, MyClass ] |
래퍼 클래스 변수 | 기본형 변수를 객체로 다룰 수 있도록 감싸주는 클래스 |
+ 알아두면 좋은 상식 : 기본형 변수는 소문자로 참조형은 대문자로 시작한다
1. 기본형 변수 (Primitive Type)
기본형 변수는 실제 데이터 값을 직접 저장하는 간단한 형태의 변수입니다. Java에서는 8가지 기본형이 있으며, 대표적인 예시는 아래와 같습니다.
#### 논리형 (boolean)
- **`boolean`**: 참(true) 또는 거짓(false)만 저장할 수 있습니다.
boolean flag = true;
#### 문자형 (char)
- **`char`**: 하나의 문자만 저장합니다. 작은 따옴표('')로 문자를 감싸서 사용합니다.
char alphabet = 'A';
- 문자 (char)
- 문자 뒤에 \0(널문자)가 없습니다. (1 byte만 쓰기 때문에 끝을 알아서 데이터만 저장하면 됩니다.)
- 문자열 (String)
- 문장의 끝에 \0(널문자=빈공간)가 함께 저장이 됩니다. (몇 개의 byte를 쓸지 모르기 때문에 끝을 표시해야 합니다.)
#### 정수형 (byte, short, int, long)
- **정수형**은 정수를 저장하며, 사용할 범위에 따라 다양한 타입을 제공합니다.
- **`byte`**: -128 ~ 127
- **`short`**: -32,768 ~ 32,767
- **`int`**: -2,147,483,648 ~ 2,147,483,647
- **`long`**: 매우 큰 수 범위, 숫자 뒤에 **`L`**을 붙여 표기
int number = 2147483647;
long largeNumber = 9223372036854775807L;
#### 실수형 (float, double)
- **실수형**은 소수점을 가진 실숫값을 저장합니다. 사용 범위에 따라 `float`와 `double`로 나뉩니다.
- **`float`**: 소수점 이하 약 7자리까지 저장 가능, 숫자 뒤에 **`f`**를 붙여 표기
- **`double`**: 소수점 이하 약 16자리까지 저장 가능
float decimal = 3.14f;
double largeDecimal = 3.141592653589793;
---
2. 참조형 변수 (Reference Type)
참조형 변수는 데이터가 저장된 메모리 주소를 참조합니다. 참조형 변수의 주요 종류는 다음과 같습니다.
= 기본형 변수와 다르게 상자에 물건을 직접 담는게 아니라 물건이 있는 주소를 상자에 넣는다는 것이다.
- 기본형 변수 : 원본 값이 Stack 영역에 있다.
- 참조형 변수 : 원본 값이 Heap 영역에 있다.
- Stack 영역에는 따로 저장 해둔 원본 값의 Heap 영역 주소를 저장합니다.
- 주소값(객체 위치, 변수 위치)을 저장하는 변수
#### 문자열 (String)
- **`String`**: 여러 문자를 조합한 문자열을 저장합니다. 큰 따옴표("")로 감싸서 사용합니다.
String message = "Hello World";
= String은 message라는 상자에 "Hello World"를 넣는 것이 아닌 Hello World가 저장된 주소를 저장한다.
- "Hello World"라는 문자열이 메모리의 힙 영역에 저장됩니다.
- 변수 message는 스택 영역에 저장되고, 이 변수는 "Hello World"가 있는 메모리 위치를 참조(가리키는)합니다.
- 이렇게 message 변수를 사용하면 "Hello World"가 있는 위치로 접근할 수 있게 됩니다.
#### 객체, 배열, 리스트 (Object, Array, List 등)
- 다양한 형태의 데이터나 객체들을 저장하는 변수 타입입니다.
int[] numbers = {1, 2, 3}; // 배열 예시
---
3. 래퍼 클래스 변수 (Wrapper Class)
기본형 변수를 객체로 다룰 수 있도록 감싸주는 클래스입니다. 예를 들어, `int` 기본형 변수는 `Integer` 래퍼 클래스로 사용할 수 있습니다. Java의 객체지향 기능을 활용할 때 유용합니다.
// 박싱 VS 언박싱
// 박싱
// Integer 래퍼 클래스 num 에 21 의 값을 저장
int number = 21;
Integer num = new Integet(number);
// 언박싱
int n = num.intValue(); // 래퍼 클래스들은 inValue() 같은 언박싱 메서드들을 제공해줍니다.
- 박싱 VS 언박싱
- 기본 타입에서 래퍼 클래스 변수로 변수를 감싸는 것을 “박싱”이라고 부르며
- 래퍼 클래스 변수를 기본 타입 변수로 가져오는 것을 “언박싱”이라고 부릅니다.
변수형 변환
- 형변환에 대한 이해
- Java 프로그래밍을 하다 보면 문자열로 입력받은 변수를 숫자로 변환해서 계산을 하고 싶은 경우, 문자열에 숫자 값을 추가하고 싶은 경우 등… 어떤 변수형을 다른 형으로 변환이 필요한 경우가 많습니다.
- 형변환은 주로 기본형 변수인 정수 ↔ 실수 ↔ 문자 들 사이에서 일어나며 방법은 아래와 같습니다.
- 정수형, 실수형 간 발생하는 형변환
- Double, Float to Int
- (Int) 캐스팅 방식으로 실수를 정수로 치환하는 방법입니다.
- 이때 실수형의 소수점 아래 자리는 버려집니다.
double doubleNumber = 10.101010;
float floatNumber = 10.1010
int intNumber;
intNumber = (int)doubleNumber; // double -> int 형변환
intNumber = (int)floatNumber; // float -> int 형변환
- Int to Double, Float
- (Double, Float) 캐스팅으로 정수형을 실수형으로 변환하는 방법입니다.
int intNumber = 10;
double doubleNumber = (double)intNumber; // int -> double 형변환
float floatNumber = (float)intNumber; // int -> float 형변환
- 자동 형변환
- Java 프로그래밍에서 형변환을 직접적으로 캐스팅하지 않아도 자동으로 형변환 되는 케이스가 있습니다.
- 프로그램 실행 도중에 값을 저장하거나 계산할 때 자동으로 타입 변환이 일어납니다.
1) 자동 타입 변환은 작은 크기의 타입에서 큰 크기의 타입으로 저장될 때 큰 크기로 형변환이 발생합니다.
-
-
더보기
📌 변수 타입별 크기 순서
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 (소수점이 추가된 실수출력)
2) 작은 크기의 타입이 큰 크기의 타입과 계산될 때 자동으로 큰 크기의 타입으로 형변환이 발생합니다.
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형 연산 -> 소수점 저장)
- 🔥 자동 형변환 vs 강제 형변환
- 작은 타입 > 큰 타입 형변환 시 (자동 형변환)
- 더 큰 표현 범위를 가진 타입으로 변환되는 것이라 값의 손실이 없습니다.
- 값의 손실 없이 변환이 가능하기 때문에 컴파일러가 자동으로 형변환을 해줍니다.
- 큰 타입 > 작은 타입 형변환 시 (강제 형변환 = 캐스팅)
- 더 작은 표현 범위를 가진 타입으로 변환된는 것이라 값의 손실이 생깁니다.
- 값의 손실이 생기기 때문에 자동으로 형변환을 해주지 않고 개발자가 선택하여 형변환을 합니다.
- 작은 타입 > 큰 타입 형변환 시 (자동 형변환)
+ 비트&바이트
비트(Bit)와 바이트(Byte)는 컴퓨터에서 데이터의 가장 작은 단위로, 모든 디지털 데이터는 이 단위로 이루어져 있습니다.
Byte(바이트)는 8개의 Bit(비트)로 구성되어 있습니다.
- Bit
- Bit(비트)는 0,1 형태의 2진수 데이터로써 컴퓨터가 저장(표현) 할 수 있는 최소 단위입니다.
- 정수형 값은 10진수 숫자(0~10범위의 숫자)이며 2진수(0~1범위) Bit로 저장(표현) 합니다.
- 4개의 Bit로 16진수 숫자(0~F(16) 범위의 숫자)를 2진수(0~1범위) Bit로 저장(표현) 합니다.
- 2진수(0~1)를 10진수, 16진수로 변환된 값 예시
- Byte = 8 Bit
- Byte(바이트)는 8개의 Bit(비트)로 구성되어 있습니다.
- 1 Byte 내에서 숫자 변수는 Bit 2진수를 10진수로 저장(표현)을 합니다.
- 10진수로는 0~255(2의8승)까지 저장(표현) 합니다.
- 1 Byte 내에서 문자 변수의 경우만 Bit 2진수를 16진수로 저장(표현) 합니다.
'Back-End (Web) > JAVA' 카테고리의 다른 글
[JAVA] 조건문 (0) | 2024.11.11 |
---|---|
[JAVA] 연산자 (0) | 2024.11.11 |
[JAVA] 자바 개발을 위한 준비물 IntelliJ (0) | 2024.11.11 |
[JAVA] JVM은 뭘까? (1) | 2024.11.11 |
[JAVA] 자바란 무엇일까? (0) | 2024.10.31 |