Search
Duplicate
😀

02. 자바 데이터 타입, 변수, 배열

태그
데이터 타입
변수
형변환
타입 추론
배열

Java Data Type

Java의 데이터 타입은 크게 실제 값을 저장하는 기본형(Primitive Type) 과 Heap 영역의 실제 데이터를 참조하는 값을 저장하는 참조형(Reference Type)으로 나뉜다.

Java Primitive Type

실제 value를 담고 있는 Data type
자바 언어에 내장된 기본 유형으로, 기본형 타입을 미리 정의하여 제공한다.
원자성의 데이터를 가지고 있다.
할당된 공간에 Value를 저장하며, 기본값(default value)을 가지고 있다.
실제 값을 저장하는 공간으로 stack 메모리 공간에 저장된다.
각 primitive type마다 객체화를 위한 wrapper class가 존재한다 (int - Integer, char - Chracter)
Search
Primitive Type Table
타입
사이즈
기본값
범위
byte
1 Byte
0
- 128 ~ 127
short
2 Byte
0
- 32,768 ~ 32,767
int
4 Byte
0
- 2,147,483,648 ~ 2,147,483,647
long
8 Byte
0L
- 9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
float
4 Byte
0.0F
- (3.4 x 10^38) ~ (3.4 x 10^38) 의 근사치 값
double
8 Byte
0.0
- (1.7 x 10^308) ~ (1.7 x 10^308) 의 근사치 값
char
2 Byte (UniCode)
'\u0000'
0 ~ 65,535

Java Reference Type

객체를 참조하는 Reference를 담고 있는 Data type
new 연산자를 통해서 힙(heap) 영역에 생성되는 객체를 담는 자료형을 의미
할당된 공간에 Value가 아닌 실 데이터(객체)를 참조하는 Reference를 가지고 있다.
Primitive Type을 제외한 모든 자료형은 Reference Type으로 정의된다.
초기 상태는 빈 객체라는 의미의 Null 상태이다. 값을 할당하지 않은 상태에서 변수에 접근하여 사용 시 Runtime Error가 발생한다.
C언어에서 pointer가 객체의 실제 메모리 주소를 가지고 있던 것과는 다르게 Java의 Reference Type 변수는 실제 메모리 주소를 가지지 않는다. (GC의 원리)
Refernce Type의 4가지
클래스 타입(class type)
인터페이스 타입(interface type)
배열 타입(array type)
열거 타입(enum type)

변수와 Literal

변수는 값의 할당을 통해 변하는 값을 의미하고 리터럴은 변수에 넣는 변하지 않는 데이터 자체를 의미한다.

변수

하나의 값을 저장할 수 있는 메모리 공간
변수 선언을 통해 메모리 공간에 특정 데이터 유형의 데이터를 저장할 수 있다
초기화 및 값 할당을 통해 값이 변경될 수 있다
변수는 각 변수에 할당된 메모리 위치와 연관된다

Literal

고정된 값의 소스 코드 표현
리터럴은 변수 내부에 배치된 고정값과 연결된다.
int a = 1; 에서 1이 리터럴이다. 즉, 1과 같이 변하지 않는 데이터 (boolean, char, double, etc...)를 리터럴이라고 부른다.
일반적으로 인스턴스(클래스 데이터)는 리터럴이 아니다.
하지만 String, Color와 같은 클래스처럼 데이터가 변하지 않도록 설계를 한 불변 클래스로 생성한 불변 객체에 대해 '객체 리터럴' 짧게는 '리터럴'이라고 표현한다. ex) "abc"

변수의 선언 및 초기화

변수의 선언
변수를 사용하기 위해서는 컴퓨터에게 변수가 있다는 것을 알려주어야 한다. 이 과정을 "변수의 선언"이라고 한다.
각 언어에서는 변수선언에 대한 규칙이 존재한다. Java의 경우에는[Data Type] [변수 이름] ; 가 가장 기본적인 형태이다.
변수의 초기화
변수의 저장공간에 원하는 값을 저장하는 것을 "변수의 초기화" 라고 한다.
초기에 변수를 선언하면 의미없는 Default Value 또는 Null이 들어가 있는 상태이기 때문에 원하는 값으로 사용하기 위하여 초기화가 필요하다.
초기화는 = 연산자를 통해 이루어진다.
// int 형 A 변수 선언과 동시에 10으로 초기화 int a = 10;
Java
복사
Java에서는 변수의 네이밍과 관련된 Rule이 존재한다.
1.
첫 번째 글자는 문자이거나, '$', '_' 이어야 하고, 숫자로 시작할 수 없다.
2.
첫 문자는 영어 소문자로 시작하고, 다른 단어가 붙을 경우 문자를 첫 문자를 대문자로 한다.(Camel Case) ex) myPrivateVariable
3.
변수의 이름은 영어 대소문자를 구분한다.
4.
예약어를 사용할 수 없다.

변수의 scope & Life Time

변수의 Scope란 해당 변수가 사용 가능한 범위를 의미하며 (변수가 선언된 블록) 변수의 Life Time이란 해당 변수가 메모리에 언제까지 살아있는지를 의미한다.
변수의 종류는 선언되는 위치에 따라 인스턴스 변수, 클래스 변수, 지역 변수로 나뉜다.

인스턴스 변수 (Instance Variables)

클래스 안에 선언되어 있고, 어떠한 method나 block 안에 선언되어 있지 않은 변수
scope - static method를 제외한 클래스 전체
lifetime - 인스턴스 참조가 없어 GC가 객체를 소멸시킬 때까지

클래스 변수 (Class Variables)

인스턴스 변수와 선언 위치가 동일하나, static 키워드가 붙은 변수
scope - 클래스 전체
Lifetime - 프로그램 종료시까지

지역 변수 (Local Variables)

인스턴스 변수, 클래스 변수가 아닌 모든 변수
scope - 변수가 선언된 블록 내부
Lifetime - 변수가 선언된 블록 내부에 있는 동안

타입 변환

변수 or 상수의 타입을 다른 타입으로 변환하는 것을 의미한다. 타입 캐스팅, 타입 프로모션의 2가지 종류가 존재한다.
타입 캐스팅(명시적 형변환)
크기가 더 큰 자료형을 크기가 작은 자료형에 대입하는 것을 의미
데이터 크기의 축소로 인한 데이터 손실 및 변형이 존재할 수 있다.
(자료형) [변수이름] 으로 타입 캐스팅이 가능하다.
int a = 10; byte b = (byte)a; System.out.println(b); // -> 10 //(byte 는 -256~255까지 표현할 수 있음으로 타입캐스팅을 했음에도 데이터 변형이나 // 손실은 오지 않았다) int a = 10000; byte b = (byte)a; System.out.println(b); // -> 16 // (표현범위를 벗어나는 값을 강제로 타입캐스팅해 데이터에 변형이 생겼다)
Java
복사
타입 프로모션(묵시적 형변환)
타입 캐스팅과 반대로, 작은 데이터 타입에서 큰 데이터 타입으로 형변한
프로모션의 경우에는 데이터 손실이나 변형이 없으므로, 캐스팅처럼 명시적으로 표현할 필요가 없다.
자료형의 크기

1차원, 2차원 배열의 선언

1차원 배열

1차원 배열의 선언을 위해선 []을 사용한다.
변수명 앞에 or 뒤에 []을 붙여서 선언할 수 있다.
배열 역시 객체이기 때문에 new 연산자를 통해 선언이 필요하다.
{ }를 통해 초기화가 가능하다.
// int형 1차원 배열 arr 선언 int[] arr1; int arr2[]; // 10의 크기를 가지는 int형 배열 선언 arr1 = new int[10]; int[] arr3 = new int[10]; // 5 size의 1차원 배열의 선언 및 1,1,1,1,1 값으로 초기화 int arr4[] = new int[5]{1,1,1,1,1}; int arr5[] = {1,1,1,1,1}; int arr6[] = new int[5]; arr[0] = arr[1] = arr[2] = arr[3] = arr[4] = 1;
Java
복사

2차원 배열

2차원 배열도 1차원 배열과 비슷하게 사용 가능하다.
1차원 배열과 동일한 규칙이지만, 2차원 배열의 선언을 위해선 [][]을 사용한다.
// int형 2차원 배열 arr 선언 int[][] arr1; int arr2[][]; // 2 * 2의 크기를 가지는 int형 배열 선언 arr1 = new int[2][2]; int[][] arr3 = new int[2][2]; // 2 * 2 size의 1차원 배열의 선언 및 (1,1), (2,2) 값으로 초기화 int arr4[][] = new int[2][2]{{1,1} , {2,2}}; int arr5[] = {{1,1} , {2,2}};
Java
복사

타입 추론, var

타입 추론이란 데이터 타입을 소스코드에 명시하지 않아도, 컴파일 단계에서 컴파일러가 타입을 유추해 정해주는 것을 의미한다
1.5 버전부터 추가된 Generic이나, 자바 8버전에서 추가된 lambda에서 타입 추론이 사용된다.
자바 10부터 이러한 타입 추론을 사용하는 var라는 지역 변수 Type-Inference가 추가되었다.
for ( var person : personList){ // ... }
Java
복사