☕️ Java 2장: Java의 변수 - 1

UMC (Upload My Coding)·2025년 12월 28일
post-thumbnail

📚 참고 문헌 / 출처

남궁 성, 『Java의 정석』, 도우출판, 2016.

⚒️ 공부 기록 리포지토리 (Github)

👉 공부 기록 리포지토리 링크

💻 개발 환경

Intellij / JDK 25
여기서 java 설치는 다루지 않습니다.




📌 1. 기본형 타입

기본형

기본형에는 모두 8개의 타입이 있으며, 크게 논리형, 문자형, 정수형, 실수형으로 구분된다.

분류타입
논리형boolean
true와 false 중 하나를 값으로 갖으며, 조건식과 논리적 계산에 사용된다.
문자형char
문자를 저장하는데 사용되며, 변수에 하나의 문자만 저장할 수 있다.
정수형byte, short, int, long
정수를 저장하는데 사용되며, 주로 int가 사용된다. byte는 이진 데이터를 다룰 때 사용되며, short는 C언어와의 호환을 위해서 추가되었다.
실수형float, double
실수를 저장하는데 사용되며, 주로 double이 사용된다.

문자형인 char는 문자를 내부적으로 정수(유니코드) 로 저장하기 때문에 정수형과 별반 다르지 않으며, 정수형 또는 실수형과 연산도 가능하다.

boolean(논리형)은 다른 기본형과의 연산이 불가능하다.
즉, boolean을 제외한 나머지 7개의 타입은 서로 연산과 변환이 가능하다.

4가지 타입의 정수형 구분

각 타입마다 저장할 수 있는 값의 범위가 다르므로 저장할 값의 볌위에 맞는 타입을 선택하면 되지만, 일반적으로 int를 많이 사용한다.
왜냐하면, int는 CPU가 가장 효율적으로 처리할 수 있는 타입이기 때문이다.
효율적인 실행보다 메모리를 절약하려면, byte, short 타입을 사용한다.

아래는 기본형의 종류와 크기이다. (외워놓는 것이 좋음)

타입크기
boolean, byte1 byte
char, short2 byte
int, float4 byte
long, double8 byte
  • boolean은 true와 false 두 가지 값만 표현할 수 있기에 제일 크기가 작은 1 byte이다.
  • char은 자바에서 유니코드(2 byte 문자체계)를 사용하므로 2 byte
  • byte는 크기가 1 byte라서 byte
  • int 기준으로 짧아서 short (2 byte), 길어서 long (8 byte)
  • float는 실수값을 부동소수점 방식으로 저장하기 때문에 float
  • doublefloat보다 두 배의 크기(8 byte)를 갖기 때문에 double

정수형 타입들과 실수형 타입들의 저장 가능한 값의 범위

1️⃣ 정수형

자료형저장 가능한 값의 범위크기
byte-128 ~ 1278bit, 1 byte
short-32,768 ~ 32,76716 bit, 2 byte
int-2,147,483,648 ~ 2,147,483,64716 bit, 4 byte
long-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,80764 bit, 8 byte

정수형은 -2^(n-1) ~ -2^(n-1) - 1 (n은 bit수) 로 값의 범위는 정확히 외울 필요는 없지만 "이 정도의 값을 구하는 구나" 라는 것만 기억하면 된다.

그리고 int 타입의 변수는 대략 10자리 수(약 20억)을 저장할 수 있다.
통상적으로 7~9자리 수를 계산할 때는 long(약 19자리) 타입으로 변수를 선언하는 것이 좋다.

2️⃣ 실수형

자료형저장 가능한 값의 범위크기
float1.4E-45 ~ 3.4E38 (1.410^-45 ~ 3.410^38)32 bit, 4 byte
double4.9E-324 ~ 1.8E308(4.910^-324 ~ 1.810^308)64 bit, 8 byte

실수형은 정수형과 저장형식이 달라 같은 크기라도 훨씬 큰 값을 표현할 수 있으나 오차가 발생할 수 있다는 단점이 있다. 그래서 정밀도 가 중요한데, 정밀도가 높을수록 발생할 수 있는 오차의 범위가 줄어든다.
예를 들어 float의 정밀도가 7자리일 경우 이것을 10진수로 7자리의 수를 오차없이 저장할 수 있다는 뜻이다.

float 는 약 10^38과 같이 큰 값을 저장할 수 있지만, 정밀도가 7자리 밖에 되지 않으므로 보다 높은 정밀도가 필요한 경우엔 변수의 타입으로 double을 선택해야한다.




📌 2. 상수와 리터럴

1️⃣ 상수

상수는 변수처럼 '값을 저장하는 공간'이지만, 변수와 달리 한 번 값을 저장하면 다른 값으로 변경할 수 없다. 상수를 선언하는 방법은 변수와 동일하며, 단지 변수의 타입 앞에 키워드 final 을 붙여주기만 하면 된다.

그리고 상수는 반드시 선언됨과 동시에 초기화해야 하며, 그 후 부터는 상수의 값을 변경하는 것이 허용되지 않는다.

final int MAX_SPEED; // 오류: 상수는 선언과 동시에 초기화해야 함.
final int MAX_VALUE = 100; // 굿. 선언과 동시에 초기화한 예시
MAX_VALUE = 200; // 오류: 상수의 값은 변경할 수 없다.

상수의 이름은 모두 대문자로 하는 것이 암묵적 룰이고, 여러 단어로 이루어져 있는 경우 '_'로 구분한다.

2️⃣ 리터럴

원래 12, 123, 3,14, 'A'와 같은 값들이 상수인데 프로그래밍에서 상수를 값을 저장하면 변경할 수 없는 저장공간이기에 이와 구분하기 위해 상수를 다른 이름으로 불러야기에 리터럴이라는 용어로 대신 구분하게 되었다.

즉, 리터럴은 기존에 알고 있는 상수의 다른 이름일 뿐이고, 그 자체의 값을 의미하는 것이다.

// 변수: year, 상수: MAX_VALUE, 리터럴: 2014, 100

int year = 2014;
final int MAX_VALUE = 100;

1) 리터럴의 타입과 접미사

변수에 타입이 있는 것처럼 리터럴에도 타입이 있다.
만일 리터럴에 타입이 없다면 변수의 타입도 필요없을 것이다.

정수형과 실수형에는 여러 타입이 존재하므로, 리터럴에 접미사를 붙여서 타입을 구분한다.

예를 들어, long타입의 리터럴에 접미사 'l', 'L'을 붙이고, 접미사가 없으면 int타입의 리터럴이다. byte와 short 타입의 리터럴은 별도로 존재하지 않으며 byte와 short 타입의 변수에 값을 저장할 때는 int타입의 리터럴을 사용한다.

10진수 외에도 2, 8, 16진수로 표현된 리터럴을 변수에 저장할 수 있으며 16진수는 접두사 0x, 8진수엔 접두사 0을 붙인다.

종류리터럴접미사
논리형false, true없음
정수형123, 0b0101, 077, 0xFF, 100LL
실수형3.14, 3.0e8, 1.4f, 0x1.0p-1f, d
문자형'A', '1', '\n'없음
문자열"ABC", "123", "A", "true"없음

실수형에서는 float 타입의 리터럴에 접미사 f 혹은 F 를 붙여준다. 그리고 double 타입은 d 혹은 D를 붙여준다.

실수형 리터럴에는 접미사를 붙여서 타입을 구분하며, float타입 리터럴에는 f를, double 타입 리터럴에는 d를 붙인다. 정수형에는 int가 기본 자료형인 것처럼 실수형은 double이 기본 자료형이라서 접미사는 생략이 가능하다.

float pi = 3.14f;
double rate = 1.618d;

float pi = 3.14; // 에러. float타입 변수에 double타입 리터럴 저장불가
double rate = 1.618; // 접미사 d는 생략할 수 있다.

위의 코드에서 3.14 리터럴은 f가 안붙었으니 double 타입 리터럴로 간주 된다.
그래서 에러가 발생하니 접미사 f를 붙여준다.

2) 타입 불일치

리터럴의 타입은 저장될 변수의 타입과 일치하는 것이 보통이지만, 다른 타입일 때 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용된다.

int i = 'A'; // 문자 리터럴 A의 유니코드가 65니 int 범위에 해당 되기에 저장 가능
long l = 123; // long 타입의 범위가 int 타입의 범위보다 넓어서 저장 가능
double d = 3.14f; // double 타입의 범위가 float 타입의 범위보다 넓어서 저장 가능

하지만 반대로 범위가 좁은 타입에 넓은 타입의 범위는 컴파일 에러가 발생한다.

int i = 0x123456789; // 에러. int 타입의 범위를 넘는 값을 저장
float f = 3.14; //에러. float 타입보다 double 타입의 범위가 넓다.

byte와 short타입의 리터럴은 따로 존재하지 않아 int 리터럴 타입을 사용한다. 단. short 타입의 변수가 담는 범위 안엔 포함되어 있어야 한다.

byte b = 65; byte타입의 범위 안에 포함되어 있다.
short s = 0x1234; short타입에 저장 가능한 범위 안에 int 타입 리터럴

3) 문자 리터럴과 문자열 리터럴

A와 같이 작은따옴표로 문자 하나를 감싼 것을 문자 리터럴이라고 한다.
두 문자 이상은 큰 따옴표로 감싸야 하며 문자열 리터럴이라고 한다.

char ch = 'J'; // char ch = 'Java' 이렇게 여러 개의 문자로 이루어진 리터럴은 char 타입에 저장이 안된다.
String name = "Java" // String 타입은 문자열 리터럴 저장 가능

char 타입의 변수는 단 하나의 문자만 저장할 수 있으므로, 여러 문자(문자열)를 저장하기 위해서 String 타입을 사용해야 한다.
문자열 리터럴은 "" 안에 아무런 문자도 넣지 않는 것을 허용하며, 이를 빈 문자열이라고 한다.
그러나 문자 리터럴은 반드시 큰 따옴표 안에 하나의 문자가 있어야 한다.

char ch ''; // 에러: 문자 리터럴은 무조건 공백이라도 문자가 하나 있어야 한다.
char ch ' '; // 공백 문자로 변수를 초기화
String str ""; // 문자열 리터럴은 공백도 없는 빈 문자열이 허용된다.

원래 String은 클래스이므로 연산자 new를 사용해야 하지만 위처럼 표현하는 것도 허용된다.

그리고 덧셈 연산자를 사용해 문자열을 결합할 수 있다.
덧셈 연산자는 양 쪽 모두 숫자일 때는 두 수를 더하지만, 어느 한 쪽이 String이면 나머지 한 쪽을 먼저 String으로 변환한 다음 두 String을 결합한다.
기본형과 참조형의 구별 없이 어떤 타입의 변수도 문자열과 덧셈연산을 수행하면 그 결과가 문자열이 되는 것이다.
그리고 덧셈은 왼쪽에서 오른쪽으로 연산을 진행하기에 결합순서에 따라 결과가 달라지는 것에 주의해야한다.

//문자열 + 아무 타입 -> 문자열 + 문자열 => 문자열
//아무 타입 + 문자열 -> 문자열 + 문자열 => 문자열

7 + " " -> "7" + " " = "7 "
" " + 7 -> " " + "7" = " 7"
7+7+"" -> 14 + "" = "14" + "" = "14"
true + "" -> "true" + "" = "true"
null + "" -> "null"
profile
웹 서비스 개발자를 꿈꾸는 여행 일지

0개의 댓글