Back-End (Web)/JAVA

[JAVA] 변수와 변수 종류

JABHACK 2024. 11. 11. 10:41

변수는 상자

 

프로그래밍에서 변수는 데이터를 저장하는 "이름이 있는 저장 공간"이다. 프로그램 실행 중에 특정 값을 저장하고, 필요할 때마다 그 값을 쉽게 불러오거나 변경할 수 있다.(상수는 변수와 비슷하지만 값이 변경이 안된다는 특징이 있다.)

 

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