변수란?
하나의 값을 저장할 수 있는 저장공간이다. 우리가 데이터를 저장하면 컴퓨터는 메모리의 특정 공간에 저장하는데, 그 저장되는 메모리 주소가 복잡하기 때문에 보통 메모리 주소 대신 메모리 주소의 이름을 지정한다. 이러한 메모리 주소의 이름, 즉 메모리 위치의 이름을 변수라고 한다.
엄밀히 말하면 변수는 특정 자료형의 값을 저장하는 메모리 공간의 위치를 말한다. 즉 변수는 이름과 자료형을 가지고 있으며, 자료형에 따른 값이 저장된다. 이러한 변수를 사용하려면 먼저 변수를 선언하여 메모리 공간을 할당받고, 필요하면 그 주소에 값을 집어넣어 초기화를 시켜줄 수 있다.
※ 변수 선언과 초기화(대입,저장)
자료형 변수명 = 초기값;
int myVar = 값;
초기화를 시킨다는건 선언한 변수에 대입할 최초의 값을 집어넣는다는 것을 말하는데, 상수가 아닌 이상 변수에는 초기값 이외에도 새로운 값을 저장할 수가 있다.
단, 하나의 변수는 오직 하나의 값만 저장할 수 있기 때문에, 이미 값이 저장된 변수에 새로운 값을 저장하면 기존의 값은 지워지고 새로 저장된 값만 남는다.
※ 자바에서 사용하는 변수는 크게 지역 변수, 정적 변수, 인스턴스 변수로 구분된다.
- 지역변수 : 메서드 내부에 선언된 변수
- 정적 변수 : static 키워드로 정의된 클래스 변수
- 인스턴스 변수 : 클래스 내부에 정의되지만 메서드 내부에는 선언되지 않는 변수
변수의 타입
자바는 변수를 선언할 때, 반드시 변수의 앞에다 적절한 변수의 타입을 지정해야 한다. 변수의 타입을 자료형이라고도 하는데, 자료형의 종류는 크게 프리미티브 타입(Primitive Type)과 논프리미티브 타입(Non-Primitive Type)으로 나눈다.
※ 자료형 : 문자와 숫자 등으로 구성된 데이터의 type에 따라 값이 저장될 공간의 크기와 저장 형식을 정의한 것
※ 자료형의 종류 : 기본형, 참조형
- 기본 타입(프리미티브 타입) : 실제 값(data)을 저장하는 공간, null 리터럴 사용불가, 메모리 영역의 스택영역에 실제 값들이 저장
※ 종류 : 8개
- 정수형 타입 : byte(2진법), short(C언어호환), int, long
- 실수형 타입 : float, double
- 문자형 타입 : char
- 논리형 타입 : boolean
매개변수에 적으면 값을 넘김(Read Only) - 참조 타입(레퍼런스 타입, 객체자료형) : 어떤 값(객체)이 저장되어 있는 주소를 값으로 갖는 공간, 실제 인스턴스는 힙(Heap) 영역에 생성되었고, 그 영역의 주소값을 스택 영역에 저장. 자바는 C언어와 달리 참조형 변수 간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수이다.
※ 종류 : 종류(총 1개), 용도는 다음 3가지
- 배열(Array)에 대한 레퍼런스 : 연관된 변수를 그룹으로 묶어줌
- 클래스(Class)에 대한 레퍼런스 : 객체 전반적인 것을 정의하는 틀, 설계도 (String 즉, 문자열형도 클래스에 해당)
- 인터페이스(Interface)에 대한 레퍼런스 : 동일한 목적하에 동일한 기능을 수행하게끔 강제하는 것으로 사용
매개변수에 적으면 주소를 넘김(Read & Write)
※ 기본 타입 자료형의 종류
| 유형 | 기본값 | 저장공간 | 범위 |
| 정수형 | |||
| byte | 0 | 1 byte (8bit) | -128 ~ 127 (-2⁷ ~ 2⁷-1) |
| short | 0 | 2 byte (16bit) | -32,768 ~ 32,767 (-2¹⁵ ~ 2¹⁵-1) |
| int | 0 | 4 byte (32bit) | -2,147,483,648 ~ 2,147,483,647 (-2³¹ ~ 2³¹ -1, 약 ±20억) |
| long | 0L | 8 byte (64bit) | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807(-2⁶³ ~ 2⁶³ -1) |
* 참고 :
정수형 long보다 큰 값 → BigInteger
실수형 double보다 큰 값 → BigDecimal
* 참고 2 :
정수형의 범위를 일일이 외울 필요는 없고, -2^(n-1) ~ 2^(n-1)-1 라는 정도만 기억하고 있으면 된다. (n은 bit수)
대략 int타입 변수는 10자리 수의 값을 저장할 수 있으므로, 8~9자리의 수를 계산할 때는 넉넉하게 long타입(19자리)로 변수를 선언하는 게 좋다.
| 유형 | 기본값 | 저장공간 | 범위 |
| 실수형 | |||
| float | 0.0f | 4 byte (32bit) | 1.4E - 45 ~ 3.4E38 (1.4 x 10^-45 ~ 3.4 x 10³⁸) |
| double | 0.0d | 8 byte (64bit) | 4.9E - 324 ~ 1.8E308 (4.9 x 10^-324~ 1.8 x 10³⁰⁸) |
| 유형 | 기본값 | 저장공간 | 범위 |
| 문자형 | |||
| char | '0' | 2 byte (16bit) | ' ₩u0000' ~ ' ₩uffff' (0 ~ 2¹⁶-1, 0 ~ 65,535) |
| 논리형 종류 | ||
| boolean | true | 1 byte (8bit) |
| false | 1 byte (8bit) | |
※ 참조 타입의 특징 : 객체를 가리킬 수 있다.
참조 타입은 객체의 주소를 저장(=지정)한다. 기본적으로 Java.lang.Object를 상속받을 경우 참조형이 된다. 즉, 기본형을 제외하고는 참조형이라 생각해도 된다.

| 종류 | 자료형 | 저장 가능한 값의 범위 | 크기 | |
| bit | byte | |||
| 논리형 | boolean | true, false | 8 | 1 |
| 문자형 | char | ' ₩u0000' ~ ' ₩uffff' (0 ~ 2¹⁶-1, 0 ~ 65,535) | 16 | 2 |
| 정수형 | byte | -128 ~ 127 (-2⁷ ~ 2⁷-1) | 8 | 1 |
| short | -32,768 ~ 32,767 (-2¹⁵ ~ 2¹⁵-1) | 16 | 2 | |
| int | -2,147,483,648 ~ 2,147,483,647 (-2³¹ ~ 2³¹ -1, 약 ±20억) | 32 | 4 | |
| long | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807(-2⁶³ ~ 2⁶³ -1) | 64 | 8 | |
| 실수형 | float | 1.4E - 45 ~ 3.4E38 (1.4 x 10^-45 ~ 3.4 x 10³⁸) | 32 | 4 |
| double | 4.9E - 324 ~ 1.8E308 (4.9 x 10^-324~ 1.8 x 10³⁰⁸) | 64 | 8 | |
상수란? 리터럴이란?
상수(constant) :
변수와 마찬가지로 데이터를 저장할 수 있는 메모리 공간이지만, 프로그램이 실행되는 동안 변경할 수 없는 데이터를 말한다. 반드시 선언과 동시에 초기화해야 하며, final 키워드를 이용하여 선언한다.
상수에 저장된 값은 변경하는 것이 불가능하다.
final int EX = 100; // 상수의 선언과 값 저장
EX = 200; // 불가능
상수에 넣는 데이터는 숫자만 오는 것이 아니라 클래스나 구조체 같은 객체도 가능하다.
이때 주의해야할 것은 객체 즉, 참조타입의 참조변수를 상수로 지정할 때, 참조변수 안의 속성의 데이터까지도 변하지 않는다고 생각할 수 있다. 하지만 참조변수 메모리의 주소값이 변하지 않는다는 의미일 뿐, 그 주소가 가리키는 데이터들은 변할 수 있다.
const a = { name: "JY", age: 20 };
a = [ apple, banana ]; // 불가능
a.age = 10; // 가능
리터럴(literal) :
리터럴을 한마디로 정의하면 '값 그 자체'라고 할 수 있겠다. 엥? 이게 무슨 소리야? 싶지만 수학에서의 상수개념을 생각하면 쉽다.
원래 수학에서의 상수는 12, 3.14, 'A'와 같은 값들을 의미했다. 하지만 프로그래밍에서의 상수는 '이러한 값들을 한 번 저장하면 변경할 수 없는 저장공간'으로 정의를 했고, 수학에서의 상수처럼 이러한 저장공간에 담은 값들을 의미하는 용어를 따로 정의할 필요가 있었다.
그렇게 나온 개념이 리터럴이고, '존재자체가 그 값을 의미하는 것'으로 리터럴을 정의하게 되었다. 어렵게 생각할 필요없이, '리터럴'은 그냥 기존에 수학에서 쓰던 '상수'라는 용어를 이름만 바꾼 것이다.
int yeah = 2023;
변수 리터럴
final ina max_value = 100;
상수 리터럴
리터럴의 타입과 접미사
변수에 타입이 있는 것처럼 리터럴에도 타입이 있다. 변수의 타입은 저장될 '값의 타입(리터럴의 타입)'에 의해 결정된다. 애초에 변수의 타입 자체가 그 변수안에 넣을 값의 타입을 지정하기 위한 것이므로, 만일 리터럴에 타입이 없다면 변수의 타입도 필요없을 것이다.
리터럴의 타입에는 논리형, 정수형, 실수형, 문자형, 문자열의 5가지가 있는데, 이 중에서 접미사가 필요한 건 정수형, 실수형 두 가지이다.
| 리터럴 접미사 종류 | 접미사 | 기본형 |
| 정수형 | L (또는 l) // long 타입 | int형 |
| 실수형 | f (또는 F), d (또는 D) // float, double타입 | double형 |
정수형 접미사는 접미사가 없으면 기본형인 int형으로 인식하고 실수형에서는 접미사 생략시 double을 기본형으로 인식한다. 또한 byte와 short타입의 리터럴은 따로 없으므로 두 타입의 값은 int타입의 리터럴을 사용하게 된다.
이 외에도 16진수, 8진수의 리터럴이 있는데, 각각 접미사에 '0x' (또는 '0X'), '0'을 붙인다.
- 문자 리터럴과 문자열 리터럴
char ch = 'A' ; // 문자 리터럴, 문자 하나만 저장가능, 작은따옴표 사용('')
char ch = ''; (x) // 문자 리터럴에는 공백 불가능
char str = ' '; (o) // 단, 공백 문자(blank)는 문자로 취급하기때문에 가능
String str = "ABC"; // 문자열 리터럴, 문자 여러개 저장가능, 큰따옴표 사용("")
String str = ""; (o) // 문자열 리터럴은 공백 허용
- 부호 있는 정수, 2의 보수에 대해서는 여기서 다루기에 약간 복잡한 개념이므로 잘 정리된 다른 블로그의 링크로 대체한다.
-> https://sudo-minz.tistory.com/6
문자열 결합
숫자 뿐만 아니라 두 개이상의 문자열을 합치는 것도 가능하다. 그러나 이때에는 일정한 규칙이 있다.
바로 어떤 타입의 변수도 문자열과 덧셈연산을 수행하면, 그 결과가 문자열이 되는 것이다.
예를 들어보자
ex) String str = name + 8.0;
위의 str 변수는 String 타입인 문자 name과 Long 타입인 실수 8.0을 String 타입으로 담고 있다.
상식적으로 생각하면 숫자인 8.0이 있으니 String 타입이 되면 안 되는거 아닌가 싶지만, 프로그래밍에서는 피연산자 중 어느 한 쪽이 String이면 나머지 한 쪽을 먼저 String으로 변환한 다음 두 String을 결합하기때문에 가능한 것이다.
같은 방식으로, 7 + "7"을 계산할 때, "7"이 String 타입이므로, 나머지 한 쪽인 정수 7을 String 타입으로 먼저 변환한 다음, "7" + "7"을 수행하여 "77"이라는 문자열을 결과로 반환한다.
비슷한 요령으로 7 + 7을 문자열 결과값으로 만들고자 한다면, 앞에 ""을 더해두면 된다.
"" + 7 + 7 이런식으로 말이다.
'백엔드 > Java' 카테고리의 다른 글
| [JAVA] JAVA 배열과 forEach문 (1) | 2023.12.26 |
|---|---|
| [Java] 5. 배열(Array) (0) | 2023.07.31 |
| [Java] 3. 주의해야할 연산자 특징들 (0) | 2023.07.31 |
| [Java] 1. 자바와 JVM (0) | 2023.07.31 |
| [Java] 4. 제어문(조건문과 반복문)에서 주의할 점 (0) | 2023.07.31 |
댓글