▣ 목표
자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
▣ 학습할 내용
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 1차 및 2차 배열 선언하기
- 타입 추론, var
▶ 2-1 프리미티브 타입 종류와 값의 범위 그리고 기본 값
종류 | 자료형 | 크기 | 값의 범위 | 기본 값 | |||
논리형 | boolean | 1 byte ( 8bit ) | true / false | false | |||
문자형 | char | 2 byte ( 16bit ) | '\u0000' ~ '\uffff'(0~65535) | '\u0000' (0) | |||
정수형 | byte | 1 byte ( 8bit ) | -128~127 | 0 | |||
short | 2 byte ( 16bit ) | -32768~32767 | 0 | ||||
int (기본자료형) | 4 byte ( 32bit ) | ~2,147,483,647 | 0 | ||||
long | 8 byte ( 64bit ) | -9,223,372,036,854,775,808 ~9,223,372,036,854,775,807 | 0L | ||||
실수형 | float | 4 byte ( 32bit ) | (1.4*10^-45 ~ 3.4*10^38) | 0.0f | |||
double (기본자료형) | 8 byte ( 64bit ) | (4.9*10^-324~1.8*10^308) | (접미사 생략가능) |
덧붙이자면, 자바 8 이상부터 unsigned 를 적용할 수 있다. signed는, 전체 byte 내에서 첫 번째 bit가 부호를 표현하는 데 사용되기 때문에 표현 범위가 음수부터 0을 포함하여 계산하고 -1을 해준 만큼 실제 표현 범위가 된다. unsigned는 부호 표현을 위해 메모리를 사용하지 않기 때문에 같은 타입의 경우 같은 표현 범위를 가지지만 0부터 기존의 범위만큼 양수로 이동하면 실제 표현범위가 된다. unsigned는 int와 long타입에 적용 가능하다.
▶ 2-2 프리미티브 타입과 레퍼런스 타입
참조형이라 불리는 레퍼런스 타입의 종류는 셀 수 없다. 기본형(프리미티브 타입)과 달리 JVM Runtime Data Area영역 중 heap영역에 할당되는데 레퍼런스 타입의 변수 주소값에는 리터럴, 값이 아닌 heap영역에 할당된 주소가 저장된다.
▶ 2-3 리터럴
'A', 1, 123, 2.15와 같은 값들을 '상수'라고 한다. 프로그래밍에서의 상수는 '값을 한 번 저장하면 변경할 수 없는 저장공간'으로 정의한다. 그래서 실제 상수를 구분해서 부르기 위해 리터럴이라는 단어를 사용하기 시작했다. 원래 우리가 알던 상수가 '리터럴'이라 불리고, 값을 한 번만 저장할 수 있는 공간을 '상수'라 부른다.
▷ 리터럴 타입? 접미사? 접두사?
정수형과 실수형도 여러 타입이 있기 때문에 리터럴에 접미사를 붙여서 타입을 구분 짓는다. long타입은 리터럴에 'l'또는 대문자 'L'을 붙인다. 접미사가 없으면 int타입의 리터럴이다. 실수형 리터럴의 경우 float타입은 'f'또는 'F', double타입은 'd' 또는 'D'를 붙인다.
10진수 외에도 2, 8, 16진수로 표현된 리터럴을 변수에 저장할 수 있다. 2진수의 경우 접두사로 '0b'또는 '0B'를 붙인다. 8진수는 '0', 16진수는 '0x' 또는 '0X'를 붙인다.
▶ 2-4 변수 선언 및 초기화하는 방법

변수를 선언하면, 메모리의 빈 공간에 위에서 설명한 변수 타입들에 맞는 크기의 저장공간이 생성된다. 해당 공간에 변수명을 짓고 변수명을 통해 저장공간을 사용할 수 있다.
변수의 초기화란, 변수를 사용하기 전에 처음으로 값을 저장하는 것을 의미한다. 메모리는 여러 프로그램이 공유하는 자원이므로 전에 다른 프로그램에 의해 저장된 garbage value가 남아있을 수 있기 때문에 지역변수의 경우 사용하기 위해 반드시 초기화가 필요하다.
▶ 2-5 변수의 스코프와 라이프타임
변수가 선언되는 위치에 따라 구분하자면,
- 클래스 변수 (Class or Static Variable)
- 인스턴스 변수 (Instance Variable)
- 지역 변수 (Local Variable)
로 구분할 수 있다. 클래스 변수는 클래스가 로드될 때 함께 생성되기 때문에 전체 클래스에 적용되고, 인스턴스 변수는 객체가 생성될 때 함께 생성된다. 인스턴스 참조를 통해 사용할 수 있는 변수이다. 마지막으로 지역변수는 메서드 안에 선언되어 메서드 안에서만 사용할 수 있다.
구분 | 선언 위치 | 생성시기(메모리 할당 시기) | 변수의 스코프 |
클래스 변수 | 클래스 영역 | 클래스가 메모리에 로드될 때 | (클래스 기반으로 생성된 각각의 인스턴스에 공유됨) |
인스턴스 변수 | 클래스 영역 | 인스턴스 생성 시 | 각각의 인스턴스 |
지역 변수 | 메서드 영역 | 변수 선언문이 수행되었을 때 | 메서드 내 |
▶ 2-6 타입 변환, 캐스팅 그리고 타입 프로모션
- 캐스팅 (Casting, 명시적 형변환)
변수 또는 상수의 타입을 다른 타입으로 변환하는 것을 의미한다. 형변환은 연산이 필요한 경우에 도움을 준다. 자바에서 연산을 하기 위해선 동일한 데이터 타입에서만 가능하다. 크기가 큰 자료형을 상대적으로 작은 자료형에 대입할 때, 자료형을 명시해서 강제로 타입을 변환한다.
명시적 형변환 방법은 간단하다.
(타입)피연산자
예를 들어 double d = 12.34;를 int타입으로 바꾼다면..
int score =(int)d; //double타입의 변수를 int타입으로 변환한다.
int score=12;
큰 타입 → 작은 타입의 형변환에서 메모리 크기가 작아지면서 값이 잘려나갈 수 있으므로 값의 손실에 주의해야 한다.
(기본형에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하다. 하지만 기본형에서 참조형으로의 형변환은 불가능하다.)
- 타입 프로모션 (Type Promotion, 자동 형변환)
기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환된다. 표현 범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우 값의 손실 위험이 없다.

▶ 2-7 1차 및 2차 배열 선언하기
배열이란?
같은 타입의 여러 변수를 하나의 묶음으로 다루기 위한 자료구조를 의미한다. 선언과 초기화하는 과정에서 반드시 배열의 크기를 미리 지정해야한다. 요소의 위치를 나타내는 인덱스를 가지고 접근할 수 있기 때문에 인덱스 값이 중요하다. 인덱스는 0부터 시작한다.
▷ 1차원 배열 선언하기
int[] arrA; int arrB []; //OK arrA = new int[3]; // 배열 요소별로 값 저장 arrA[0]=1; arrA[1]=2; arrA[2]=3; // 한꺼번에 초기화 arrA = {1,2,3};
▷ 2차원 배열 선언하기
int[][] arrC = new int[3][3]; arrC[0][0]=1; arrC[0][1]=2; arrC[0][2]=3; arrC[1][0]=1; arrC[1][1]=2; ...... arrC = {{1,2,3},{1,2,3},{1,2,3}} // OK
▶ 2-8 타입 추론, var
타입 추론은 데이터 타입을 명시하지 않아도 컴파일 타임에 컴파일러가 타입을 유추해서 지정하는 것을 뜻한다. 자바 5버전부터 추가된 Generic이나 8버전부터 추가된 람다에서 타입추론이 사용된다. 자바 10에서 이런 타입추론을 사용하는 var라는 local variable type-inference가 추가되었다.
var str = "hi"; // String str = "hi"; var num = 10; // int num 10;
'Java' 카테고리의 다른 글
[자바 스터디] #9 - 예외처리 (0) | 2021.02.18 |
---|---|
[자바 스터디] #7 - 패키지 (0) | 2021.02.17 |
[자바 스터디] #8 - 인터페이스 (1) | 2021.02.16 |
[자바 스터디] #3 - 연산자 (0) | 2021.02.04 |
[자바 스터디] #1 - JVM과 컴파일 (0) | 2021.01.26 |
댓글