[Codeit Review]/자바 (JAVA)

[01] Java와 변수

uzlru 2026. 1. 15. 13:38

01. JAVA

JAVA란 플랫폼 독립성, 객체 지향, 안정성을 강점으로 하는 프로그래밍 언어다. 전 세계적으로 백엔드, 모바일(Android), 임베디드, 금융 시스템 등 다양한 영역에서 널리 사용된다. JAVA는 여러 버전이 존재하며, 버전에 따라서 성능과 문법 차이가 있다. 실무에서는 Java 17 이상을 사용하는 경우가 많다.

 

JAVA의 특징  
Write Once, Run Anywhrere 자바 가상 머신(JVM) 위에서 실행되므로 운영체제에 상관없이 작동
>> JRE(자바 가상 머신 + 표준 클래스 라이브러리) 설치되어 있는 모든 운영체제에서 실행 가능
객체 지향 언어(OOP) 클래스를 기반으로 설계하여, 확장성이 좋고 유지보수에 용이함
자동 메모리 관리 (GC) 개발자가 직접 메모리를 해제하지 않아도 됨
>> 가바지 컬렉터(Garbage Collector)를 실행 시켜 자동으로 사용하지 않는 메모리를 수거
함수형 프로그래밍 지원 자바 8부터 함수형 프로그래밍을 지원하는 문법인 람다식과 스트림이 추가
>> 코드가 간결해지고, 컬렉션의 요소를 필터링, 매핑, 집계 처리하기 용이

 

1. 자바 실행 환경

구성 요소   개발 도구 포함
JDK JAVA 개발에 필요한 모든 것을 포함한 패키지 포함함
JRE JAVA로 작성된 프로그램을 실행하기 위한 환경 포함하지 않음
JVM 바이트 코드를 실행하는 가상 머신으로, OS에 맞춰 자동 최적화 됨 해당 사항 없음

 


 

02. 변수와 자료형

 

1. 변수란?

변수란 말 그대로 '변할 수 있는 값'을 저장하는 메모리 공간을 의미한다. 메모리는 수많은 1 Byte 크기의 셀들이 모여 있는 구조로, 각 셀에는 고유 번호가 부여된다. 하지만 이러한 메모리 주소를 사람이 직접 사용하기에는 불편할 뿐만 아니라 데이터를 덮어쓰는 위험 요소가 존재하기 때문에, 메모리 공간에 '변수'라는 이름을 붙여 사용하는 것이다.

 

2. 변수 선언과 값 할당

이러한 변수를 프로그램에서 사용하려면 반드시 선언(Declare)값 할당(Assign) 과정을 거쳐야 한다.

 

우선 변수 선언이란 저장할 값의 크기만큼 메모리 공간을 확보하고, 확보한 공간에 이름을 붙이는 과정을 의미한다. 그리고 이러한 변수에 값을 넣는 행위값 할당이라고 한다. 변수에 처음 수행하는 할당을 초기화라고 하며, 이후 할당은 재할당으로 초기화 했던 값을 새로운 값으로 덮어쓴다.

 

int num;		// 변수 num 선언

num = 1;		// 변수 num에 값 1 할당

num - 2;		// 재할당

int num = 1;		// 변수 선언과 동시에 초기화

 

3. 변수 이름 규칙 (명명 규칙, Naming Convention)

변수의 이름은 다른 사람이 쉽게 변수의 의미를 파악할 수 있도록 의미있게 지어야 한다. 즉, 재사용되는 변수에 문맥을 설명할 수 있는 이름을 사용하여 코드의 가독성을 높이는 것이 변수 이름 규칙의 목표이다.

 

변수 이름 규칙    
카멜케이스(camelCase) 사용 두 번쨰 단어부터 대문자로 작성 userAge, totalScore
숫자로 시작 불가능 변수의 첫 글자는 문자 혹은 _, $만 가능 1age >> 불가능
대소문자 구분 num과 NUM은 다른 변수  
예약어 사용 불가 JAVA 키워드 사용 금지 int, class 등

 

4. 상수(Constant)

상수란 변수와 같이 선언하고 할당하여 사용할 수 있지만, 재할당이 금지된 변수를 의미한다. 상수는 final 키워드를 사용하여 선언할 수 있으며, 관례로 대문자에 언더바(_)를 넣어 구분하는 SCREAMING_SNAKE_CASE를 사용한다. 이러한 상수는 다음과 같은 상황에 주로 사용된다.

 

상수를 사용하는 이유  
프로그램이 실행되면서 값이 변하면 안 되는 경우 프로그래머가 값을 변경하면 안 되는 상수에 재할당하는 것을 방지한다.
코드 가독성을 높이고 싶은 경우 자주 사용하는 불변값을 상수 명을 통해 사용하여, 코드 가독성이 향상한다.
코드 유지관리를 손쉽게 하고자 하는 경우 상수의 값을 변경하고자 할 때, 상수를 할당한 위치만 수정하면 된다.
final double CALCULATOR_PI = 3.14;
CALCULATOR_PI = 2.13			// 불가능

 

5. 타입 (Type)

타입이란 값의 종류와 형태를 정의하는 규칙 집합이다. 즉, 타입이란 컴퓨터에게 값이 차지하는 메모리 크기와 값이 저장되는 방식, 두 가지 정보를 제공하는데 이 두 기준을 기반으로 크게 기본 타입(Primitive Type)참조 타입(Reference Type)로 나뉜다.

 

  기본 타입 참조 타입
저장 값 실제 값(value) 그 자체를 저장 실제 값이 저장된 메모리 주소(reference)를 저장
저장 위치 Stack Stack + Heap
출력 형태 값 그대로 클래스명@주소
>> Object의 기본 toString() 출력 규칙
참조 타입 "변수는 132 페이지 참고"와 같은 색인 책에서 "변수는 ~이다"라고 직접 설명된 문장

 

[기본 타입 저장]
┌─────────────┐
│ primitive   │──────►  1
└─────────────┘

[참조 타입 저장]
┌─────────────┐          ┌───────────────────────┐
│ reference   │──────►   │  Object 인스턴스        │
└─────────────┘          │  (실제 데이터 저장)       │
                         └───────────────────────┘

 

public class Main {
    public static void main(String[] args) {
        int primitive = 1;
        Object reference = new Object();

        System.out.println(primitive);		// 값인 1이 출력
        System.out.println(reference);		// reference가 저장된 메모리 주소값이 출력
    }
}

 

기본 타입 종류 저장되는 값 구체적인 종류 크기
정수형 정수 byte 1 byte
    short 2 byte
    int 4 byte
    long 8 byte
실수형 실수 float 4 byte
    double 8 byte
문자형 유니코드 문자 char 2 byte
논리형 true / false boolean JVM 구현에 따라 다름

 

6. 리터럴 (Literal)

리터럴이란 문자가 가리키는 값 그 자체를 의미한다. 즉, int num = 1; 에서 변수 num에 할당하는 1이 바로 리터럴에 해당하는 것이다. 이러한 리터럴을 실수형 변수에 할당할 때는 각각 접미사 f, L을 붙여야 한다.

 

// 정수형 리터럴 20을 정수형 변수 currentAge에 할당
int currentAge = 20;

// 실수형 리터럴 3.14159를 실수형 변수 pi에 할당
double pi = 3.14159;

// 논리형 리터럴 true를 논리형 변수 boolean에 할당
boolean isGenius = true;

// 문자형 리터럴 'A'를 문자형 변수 firstAlphabet에 할당
char firstAlphabet = 'A';

// 문자열 리터럴 "Spring"를 문자열 타입 변수 learnedAt에 할당
String learnedAt = "Spring";

float weight = 74.5f;				// 접미사 f
final long LIGHT_YEAR = 9460730472580L;		// 접미사 L

float = 9460730472580.0F;
double = 9460730472580.0D;

 

7. 정수 타입

정수 타입이란 숫자를 나타내는 타입으로, byte, short, int, long 총 4가지 타입으로 분류된다. 각각 차지하는 메모리의 크기가 다르며, 그에 따라 나타낼 수 있는 숫자의 범위 또한 다르다. 즉, 데이터 타입의 크기가 데이터의 표현 범위를 결정한다.

 

또한 이러한 정수 타입에는 정수형 리터럴이 할당되는데, 이때 long 타입 리터럴의 경우에는 앞서 언급한 것처럼 정수형 리터럴 뒤에 접미사 L 또는 l을 붙여야 한다. 하지만 일반적으로 숫자 1과 혼용하지 않기 위해 대문자 L을 붙인다.

타입 메모리 표현 비트 수 범위
byte 1byte 8 -128(-27) ~ 127(27 - 1)
short 2byte 16 -32,768(-215) ~ 32,767(215 - 1)
int 4byte 32 -2,147,483,648(-231) ~ 2,147,483,647(231 - 1)
long 8byte 64 -9,223,372,036,854,775,808(-263) ~ 9,223,372,036,854,775,807(263 - 1)

 

// 각 데이터 타입의 표현 범위에 맞는 값을 할당
byte  byteNum  = 123;
short shortNum = 12345;
int   intNum   = 123456789;
long  longNum  = 12345678910L;

// 오버플로우
byte  byteNum  = 130;
short shortNum = 123456;
int   intNum   = 12345678910;

// 숫자가 길면 언더바로 구분 가능
int   intNum   = 12_345_678_910;
long  longNum  = 12_345_678_910L;

 

위에 보이는 것처럼 각 데이터 타입의 표현 범위에 벗어난 값을 할당하고자 할 때 , 경우에 따라 오버플로우 혹은 언더플로우가 발생할 수 있다. 

  오버플로우
(Overflow)
언더플로우
(Underflow)
발생 시점 자료형이 표한할 수 있는 최댓값 이상을 표현한 경우 지료형이 표현할 수 있는 최솟값 이하를 표현한 경우
발생 결과 해당 데이터 타입의 최솟값으로 값이 순환 해당 데이터 타입의 최댓값으로 값이 순환

 

8. 실수 타입

실수란 소수점을 가지는 값으로, float형과 double형 두 가지로 분류된다. 또한 리터럴 접미사가 선택인 double 형 타입과 달리, float 형은 반드시 리터럴 접미사 f를 붙여야 한다.

 

또한 컴퓨터는 실수를 저장할 때 부동소수점 방식으로 저장하는데, 그 과정에서 약간의 오차가 발생한다. 오차의 크기는 실수 데이터를 더 정밀하게 표현할수록 줄어들며, 이러한 정밀도는 데이터 타입의 크기가 클수록 높아진다. 즉, double 형 float 형보다 더 큰 실수를 더 정확하게 저장할 수 있다.

  메모리 비트 수   정밀도
float 4 byte 32 음수 : -3.4 * 1038 ~ -1.4 * 10-45
양수 : 1.4 * 10-45 ~ 3.4 * 1038
7자리
double 8 byte 64 음수 : -1.8 * 10308 ~ -4.9 * 10-324
양수 : 4.9 * 10-324 ~ 1.8 * 10308
16자리

 

// float형 리터럴을 float형 변수에 할당
float num1 = 3.14f;

// double형 리터럴을 double형 변수에 할당
double num2 = 3.141592d;
double num2 = 3.141592;

 

실수형에서도 정수형과 마찬가지로 오버플로우 혹은 언더플로우가 발생할 수 있지만, 그 결과가 다른 양상을 보인다.

  오버플로우
(Overflow)
언더플로우
(Underflow)
발생 시점 자료형이 표한할 수 있는 최댓값 이상을 표현한 경우 지료형이 표현할 수 있는 최솟값 이하를 표현한 경우
발생 이후 값 무한대 0

 

9. 논리 타입

논리 타입의 종류는 boolean 형 하나로, boolean 형은 참(true) 또는 거짓(false)을 저장할 수 있는 데이터 타입이다.

boolean isRainy = true;
boolean isAdult = false;

 

10. 문자 타입

문자 타입 또한 논리 타입과 마찬가지로 char 형 하나만 존재하며, char 형은 오직 하나의 문자형 리터럴을 저장할 수 있는 데이터 타입이다. 이러한 하나의 문자형 리터럴을 작성할 때에는 컴파일러가 문자열 리터럴과 혼동하지 않기 위해 반드시 큰따옴표("")가 아닌 작은따옴표('')를 사용해야 한다.

 

또한 문자형 리터럴은 유니코드를 활용하여 표현한다. 유니코드란 전 세계의 모든 문자를 컴퓨터에서 일관되게 다루기 위한 국제 표준으로, 각 문자에 숫자 코드를 부여한 것이다.

char letter1 = 'a';
char letter2 = 'ab';		// error: 단 하나의 문자형 리터럴만 할당 가능
char letter3 = "a"		// error: 큰따옴표 사용 불가능

char letter = 65;
System.out.print(letter);	// 출력 결과 : A

 

11. 타입 변환

boolean을 제외7개의 기본 타입은 서로 타입을 변환할 수 있다. 컴파일러가 자동으로 형변환을 수행하는 자동 형변환과 개발자가 직접 타입을 명시하는 명시적 형변환이 존재한다.

 

구분 자동 형변환
(Promotion)
명시적 형변환
(Casting)
핵심 개념 크기가 작은 타입에서 큰 타입으로,
덜 정밀한 타입에서 더 정밀한 타입으로 변환
크기가 큰 타입에서 작은 타입으로 강제로 변환
컴파일러 자동으로 처리해줌
>> 안정성 보장
개발자가 직접 코드에 명시해야 함
>> 캐스팅 연산자 () 사용
데이터 손실 데이터 보존 데이터 손실 발생 가능
방향 byte  int  double double  int  byte

 

byte(1) -> short(2)/char(2) -> int(4) -> long(8) -> float(4) -> double(8)

// float이 long보다 정밀하므로, 자동 형변환
long  longValue  = 12345L;
float floatValue = longValue;		// 12345.0

//int 타입으로 선언된 변수 intValue를 더 작은 단위인 byte로 변환
int intValue = 128;
byte byteValue = (byte)intValue;	// -128 (오버플로우)

'[Codeit Review] > 자바 (JAVA)' 카테고리의 다른 글

[03] 배열  (0) 2026.01.16
[02] 문자열과 제어문  (0) 2026.01.15