🎯 목표
자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
🖋 학습할 것
프리미티브 타입 종류와 값의 범위 그리고 기본 값프리미티브 타입과 레퍼런스 타입리터럴변수 선언 및 초기화하는 방법변수의 스코프와 라이프타임타입 변환, 캐스팅 그리고 타입 프로모션1차 및 2차 배열 선언하기타입 추론, var
1. 프리미티브 타입 종류와 값의 범위 그리고 기본 값
프리미티브 타입 (primitive type)은 원시 타입 또는 기본형 타입이라고도 한다. 값을 할당할 때 변수의 주소 값에 값이 그 자체로
저장되는 데이터 타입이다. 해당 데이터 타입은 값이 할당되면 JVM Runtime Data Area 영역 중 Stack 영역에 값이 저장된다.
타입이란 '데이터 타입'을 줄인 말로 '자료형'이라고 하기도 한다. 컴퓨터 관점에서 타입은 데이터가 메모리에 어떻게 저장될 것이고
또, 어떻게 다뤄져야 하는지에 대해 알려주는 것이다.
Java에서 primitive type의 종류는 8가지이다.
2. 프리미티브 타입과 레퍼런스 타입
레퍼런스 타입 (reference type) : 참조 타입은 Java에서는 실제 값이 저장되어 있는 곳의 위치를 저장한 값(주소 값)을 뜻한다.
참조 타입의 종류는 배열, 열거, 클래스 그리고 인터페이스가 있다.
참조형 타입은 기본값이 Null이다.
기본 타입과 참조 타입을 구분하는 방법은
저장되는 값이 '실제 값' 그 자체인가 아니면 메모리의 '주소 값'인가에 따라 구분 가능하다.
이 값은 JVM의 Runtime Data Area에 저장된다. 그중에서도
기본형 타입은 스택 메모리에 저장하고 참조형 타입은 heap 메모리에 저장된다.
3. 리터럴
변수나 상수에 저장되는 값 그 자체를 의미한다.
변수에 저장된 상수 값을 '리터럴' 혹은 'constant'라고 한다.
고정된 값을 표현하는 리터럴은 정수를 표현하는 리터럴, 실수, 문자, boolean을 표현하는 리터럴, 문자열을 표현하는 리터럴 등이 있다.
예)
- 정수 리터럴 : int a = 10; // 10
- 실수 리터럴 : double a = 0.1; // 0.1
- 문자 리터럴 : char a = 'a'; // a
- 문자열 리터럴 : String a = "abc"; // abc
- boolean 리터럴 : boolean a = true;
여기서 주목할 점은 리터럴들은 프리미티브 타입의 값을 표현하기 위해 존재한다. 그런데 문자열(String)은 레퍼런스 타입이다.
그럼에도 String 타입은 '리터럴'을 지원하는데 리터럴 방식으로 String에 값을 주면 Heap 영역에서 String constant pool이라는
특수한 영역에 값이 저장된다. 그리고 동일한 값을 쓰는 경우에 다른 일반적인 레퍼런스 타입처럼 Heap 영역에 또 올라가지 않고
String constant pool에 존재하는 값을 참조하는 방식으로 작동한다.
4. 변수 선언 및 초기화하는 방법
- 변수를 선언하는 방법은 변수의 타입(자료형) 다음에 변수의 이름을 작성하는 것으로 한다.
예)
int a; // 정수형 타입의 변수 a를 선언
int b; // 정수형 타입의 변수 b를 선언
int c, d, e; // 한 번에 여러 개의 변수를 선언
- 초기화한다는 것은 선언한 변수에 실제 값을 넣는다는 의미이다.
예)
int a = 10; // 선언과 동시에 초기화
int b;
b = 10;
// 선언한 다음 초기화
- 위의 것들은 프리미티브 타입의 선언과 초기화이다. 레퍼런스 타입의 방법을 알아보자.
예)
A a = new A();
5. 변수의 스코프와 라이프타임
- 변수의 스코프 : 변수를 사용할 수 있는 범위
- 라이프타임 : 변수가 메모리에 할당된 시점부터 반환되는 시점까지의 시간
- 자바의 변수 (클래스, 인스턴스, 지역변수) : 변수의 선언 위치에 따라 종류가 달라진다.
변수의 종류 | 선언 위치 | 생성 시기 |
클래스 변수 | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수 | 인스턴스가 생성될 때 | |
지역 변수 | 클래스 이외의 영역 | 변수 선언문이 수행 되었을 때 |
예) public class test { int a; // 인스턴스 변수 static int b; // 클래스 변수
void method() { int c; // 지역 변수 } } |
✚
지역 변수 : 메소드 내부에 선언되며 메소드 안에서만 사용 가능
메소드 호출 시 stack 메모리에 생성되고, 종료 시 소멸
접근제어자가 public인 경우, 같은 패키지의 다른 클래스에서도 사용 가능
추후 Garbage Collection에 의해 수거됨
클래스 변수 (static 변수) : 프로그램 실행 시 클래스 메모리에 로드되면서 데이터 영역에 생성됨
미리 생성되어 있어 속도는 빠르지만 종료될 때까지 메모리에서 해체되지 않음
6. 타입 변환, 캐스팅 그리고 타입 프로모션
- 타입 변환, 캐스팅 : 크기가 더 큰 자료형 -> 크기가 더 작은 자료형에 대입
데이터 크기가 더 크기 때문에 변환 과정에서 데이터의 손실이나 변형이 올 수 있다.
- 타입 프로모션 : 크기가 더 작은 자료형 -> 크기가 더 큰 자료형에 대입
데이터 손실이나 변형이 오지 않는다.
📌 메모리 크기가 아닌 데이터 표현 범위를 따져봐야 한다.
예 )
float(4byte), long(8byte) : float 데이터 값을 long 타입으로 변환할 때, 타입 프로모션이 아님.
7. 1차 및 2차 배열 선언하기
배열 선언하는 방법 : 1. int[] arr;
2. int arr[];
선언한 배열 변수에 값을 할당하는 방법 : 1. int[] arr = new int[5];
2. int[] arr = {10, 20, 30 ,40, 50};
3. int[] arr = new int[]{10, 20, 30 ,40, 50};
선언한 배열 변수는 JVM의 런타임 스택 영역에 생성된다.
그리고 배열은 레퍼런스 타입이기 때문에 값은 가비지 컬렉션 힙 영역에 객체가 생성된다.
이 힙 영역의 주소 값이 런타임 스택 영역에 생성된 변수의 값으로 할당된다.
2차원 배열 선언하는 방법 : 1. int[][] arr;
int arr[][];
선언한 배열 변수에 값을 할당하는 방법 : 1. int[][] arr = new int[2][3];
2. int[][] arr = {{1, 2}, {3, 4, 5}};
3. int[][] arr = new int[][]{{1, 2}, {3, 4, 5}};
8. 타입 추론, var
타입 추론 : 데이터 타입을 소스코드에 명시하지 않아도, 값을 보고 컴파일러가 데이터 타입이 무엇인지 추론한다는 것을 의미한다.
var 변수이름 = 값;
var 키워드는 지역변수이면서 선언과 동시에 초기화가 반드시 되어야 한다.
github.com/whiteship/live-study/issues/2
'develop' 카테고리의 다른 글
BufferedReader, BufferedWriter (0) | 2021.02.26 |
---|---|
3주차 과제: 연산자 (0) | 2021.02.25 |
1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2021.02.21 |
[java] What is 'split' ? (0) | 2021.02.12 |
[java] What is 'substring' ? (0) | 2021.02.11 |