[Java] 변수와 자료형

Yumya's record·2025년 4월 18일

SKALA

목록 보기
21/25
post-thumbnail

🦈 자바 변수와 자료형 정리 🦈

변수

variable
데이터를 저장할 수 있는 메모리 상의 공간

int a; // 변수 a의 자료형은 int
double x; //변수 x의 자료형은 double

 a = 123; // int형 변수 a에 값 123 대입
 x = 12.23; // double형 변수 x에 값 12.23 대입
 
 String b = "Hello world" // 선언과 동시에 문자 대입
  • 데이터 타입에 해당하는 단 하나의 값만 저장 가능
  • 변수의 이름은 변수 명명 규칙에 따라 개발자 마음대로 지정 가능
  • 자료형 + 변수명 형태로 선언

변수 명명 규칙

  • 변수명은 숫자로 시작 불가능
  • _$ 외의 특수 문자 사용 불가능
  • 자바의 키워드(ex. int, class, return 등)는 변수명으로 사용 불가능

자바 키워드

특정 단어를 미리 정해 두어 자바 언어를 동작하는 것

abstract  continue  for         new        switch
assert    default   goto        package    synchronized
boolean   do        if          private    this
break     double    implements  protected  throw
byte      else      import      public     throws
case      enum      instanceof  return     transient
catch     extends   int         short      try
char      final     interface   static     void
class     finally   long        strictfp   volatile
const     float     native      super      while

데이터 타입(자료형)

변수에 적재할 데이터가 메모리에 어떻게 저장되고 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 키워드
크게 기본형, 참조형으로 나뉜다.

기능기본형참조형
null 초기화OX
Generic 타입에서 사용XO
숫자 간 산술 연산OX
값 비교==equals()

overflow : 해당 타입이 표현할 수 있는 최대 표현 범위보다 큰 수를 저장할 경우 발생
underflow : 해당 타입이 표현할 수 있는 최소 표현 범위보다 작은 수를 저장할 경우 발생

기본형

값을 직접 저장하는 타입

  • 모두 소문자로 시작
  • 비객체 타입임으로 null 값을 가질 수 없다.
  • 변수의 선언과 동시에 메모리 생성
  • 모든 값 타입은 메모리의 스택에 저장

논리형

  • boolean : 1byte, true(참)/false(거짓)
boolean x = true;
boolean y = (1 == 2); // false

문자형

  • char : 2byte, 0 ~ 65,535
    • 한 개의 문자 값에 대한 자료형이며, 문자값을 ''로 감싸주어야 한다.
char x = 'a'; // 문자값
char y = 97'; // 아스키코드
char z = '\u0061`; // 유니코드

a라는 문자를 문자값, 아스키코드, 유니코드로 표현할 수 있다.

  • 아스키코드 : ANSI가 정의한 미국 표준 정보교환 코드
    7bit의 이진수 조합으로 만들어져 총 128개의 부호 표현
  • 유니코드 : 각 나라별 언어를 모두 표현하기 위한 코드 체계
    사용 중인 운영체제, 프로그램, 언어와 상관없이 모든 문자를 16bit로 표현해 최대 65536자 표현

정수형

  • byte : 1byte, -128 ~ 127
  • short : 2byte, -32,768 ~ 32,767
  • int : 4byte, -2,147,483,648 ~ 2,147,483,647
  • long : 8byte, -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
    • long 변수에 값 대입 시 int형 자료형의 최대값인 2147483647보다 큰 경우 접미사 L를 붙여 컴파일 에러를 방지해야 한다.
int x = 10;
long y = 100;

주로 int, long 형을 사용한다.
정수형 데이터 타입 사용 시 데이터의 최소, 최대 크기를 고려해야 한다.
정수 overflow 또는 underflow가 발생하게 되면 전혀 다른 값이 저장될 수 있다.

underscore 표기법을 이용해 값을 표현할 수 있으며, 큰 수를 한눈에 파악할 수 있다.
이는 jdk 7부터 지원하며, 일상에서 수를 표현하는 단위인 콤마 , 대신 언더바 _ 를 사용해 수를 표현하는 문법이다.

int x = 1000_000_000 // = 1000,000,000

실수형

  • float : 4byte, (3.4 X 10-38) ~ (3.4 X 1038) 의 근사값
    • 지수 : 8bit / 가수 : 23bit
    • 소수점 약 6~7자리까지 표현
    • 연산 속도의 향상이나 메모리 절약이 필요한 경우 사용
    • float 변수에 값을 대입할 때는 접미사 F를 붙여 컴파일 에러를 방지해야 한다.
  • double : 8byte, (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값
    • 지수 : 11bit / 가수 : 52bit
    • 소수점 약 15~16자리까지 표현
    • 정확한 실수의 정밀도가 필요한 경우 사용
float x = 1.0
double y = 1.23;

컴퓨터 메모리는 한정적이기 때문에 실수의 소숫점을 표현할 수 있는 수의 제한이 존재한다.
이를 해소하기 위해 부동 소수점 방식을 사용한다.

float x = 3.14; // 3.14를 float로 저장
부호 = 0
지수 = 128 (즉, 2^(1))
가수 = 1.57 (이진수로 변환됨)

부동 소수점 방식 : 정수는 고정된 자리수로 저장, 실수는 소수점 위치가 유동적
부호, 지수, 가수로 나뉘어져 있으며 10^-38 ~ 10^38 범위의 널은 범위의 실수를 표현할 수 있다.

  • 정밀도 손실 : 무한 소수 저장 시 메모리 한계때문에 잘라서 저장하게 되면서 오차가 있는 근사값을 저장한다.
  • 오차 누적 : ==를 사용해 값 비교 시 비교하고자 하는 값과 근사값을 비교하게 될 경우가 존재한다.
    이에 "거의 같음"과 같은 근사치를 허용하는 방식을 사용해야 한다.
    또는 정수형을 사용해 값 계산 후 100, 1000 등으로 나눠 소수점을 표현할 수 있다.
double a = 0.1 + 0.2;
double b = 0.3;
if (Math.abs(a - b) < 1e-9) {
    System.out.println("거의 같음");
}

실수형에서 overflow가 발생할 경우 무한대의 값을 가지게 되며, underflow가 발생할 경우 0이 된다.

참조형

기본형을 제외한 나머지 자료형
클래스, 사용자 정의 클래스, 배열, 열거 타입 등이 포함
객체를 가리키는 4byte의 참조값을 가지며, 초기값이 null이다.

Person p = new Person();

Person이라는 p 변수는 4byte로 Stack에 저장되고,
new Person()로 생성된 객체는 객체 크기만큼 Heap에 저장된다.

JVM 환경에 따라 참조값이 달라진다.
32bit JVM : 일반적으로 4byte
64bit JVM : 8byte일 수 있으나, 일부 JVM이 Compressed OOP를 사용해 4byte로 유지하기도 한다.

String 클래스

문자열을 표현하는 자료형
다양한 내장 메서드를 가져 여러 기능을 구현할 수 있다.

String a = "Hello world"; // 리터럴 방식
String b = new String("Hello"); // 생성자 방식

String 인스턴스는 한 번 생성하면 Read only로, 변경 불가능하다. = 불변 객체
따라서 덧셈 연산자를 이용해 문자열 결합을 수행하면 기존 문자열에 할당되는 것이 아니라 새로운 String 인스턴스가 생성된다.

String x = "123";
String y = "사오육칠";

x += y; // "123사오육칠"이라는 값을 저장하는 주소 값을 새로운 Stack 메모리 영역에 할당한다.

래퍼 클래스

포장 클래스, 기본 타입을 객체로 다루기 위해 사용하는 클래스

  • 래퍼 클래스로 감싸고 있는 기본 타입 값은 외부에서 변경 불가

  • 값 변경 시 새로운 포장 객체를 생성해야 한다.

  • java.lang 패키지에 포함되어 제공

  • 각 타입에 해당하는 데이터를 파라미터로 전달받아 해당 값을 가지는 객체로 생성

  • Boxing : 기본 타입을 래퍼 클래스로 변환하는 과정

  • Unboxing : 래퍼 클래스를 기본 타입으로 변환하는 과정

Java 1.5 이상에서는 Auto Boxing/Unboxing되며, 이전 버전에서는 수동으로 값 변환을 해야한다.

//Java 1.5 이상
int a = 1;
Integer b = a; // auto boxing
int c = b; // auto unboxing

// Java 1.5 미만
int a = 1;
Integer b = new Integer(a); //boxing

int c = b.intValue(); // unboxing

참고-변수
참고-위키독스-점프투자바
참고-기본 자료형
참고-자료형
참고-래퍼 클래스

profile
🍀 ٩(ˊᗜˋ*)و 🍀

0개의 댓글