▶ 학습 목표 : 자바의 프리미티브 타입 종류와 값의 범위 그리고 기본 값
▶ 학습할 것
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타임 변환, 캐스팅, 그리고 타입 프로모션
- 1차 및 2차 배열 선언하기
- 타입 추론, var
① 프리미티브 타입 종류와 값의 범위 그리고 기본 값
프리미티브 타입(Primitive Type) 이란?
기본자료형 혹은 원시자료형이라 불리는 프리미티브 타입은 값을 할당할 때 변수의 주소값에 값이 그 자체로 저장되는 타입이다. 해당 데이터 타입에 값이 할당되면 JVM Runtime Data Area 의 Stack 영역에 값이 저장된다.
Java에서 프리미티브 타입의 종류는 8가지가 있다.
실제로 사용하는 타입은 한정적이지만 값의범위가 큰 데이터를 처리해야 할 경우나 데이터 사이즈를 체크해야 하는 작업일 경우에 확인하고 적절한 타입을 사용하는 것이 좋다.
② 프리미티브 타입과 레퍼런스 타입
프리미티브 타입(Primitive Type) 이란?
Primitive Type은 기본형타입으로 값을 넣지 않아도 기본값이 있기 때문에 null(값이 없음)과 같은 키워드가 존재하지 않는다. 그리고 컴파일 시점에 입력값을 담기 때문에 타입에 범위를 벗어나면 컴파일 에러가 발생한다.
레퍼런스 타입(Reference Type)이란?
Reference Type은 참조형타입으로 Primitive Type을 제외한 나머지 전부를 레퍼런스 타입이라 한다.
변수의 값이 저장되어 있는 곳의 메모리 주소값을 저장하는 공간으로 해당 데이터 타입에 값이 할당되면 JVM Runtime Data Area의 heap영역에 값이 저장된다. 컴파일 에러는 없으나 런타임 에러가 발생할 수 있다.
요약 : 프리미티브 타입의 변수는 값 자체를 가지고, 레퍼런스 타입의 변수는 값의 주소를 참조하게 된다.
③ 리터럴(Literal)
리터럴(Literal) 이란?
변수나 상수에 저장되는 값을 의미한다.
-정수 리터럴 : 정수는 기본적으로 int형을 사용한다. 아래 2진법 8진법 10진법 16진법 같이 표현할 수 있다.
int decimal = 26; // 일반적인 형태 10진법
int ocatal = 032; // 제일 앞에 0 이 붙으면 8진법
int heaxaDecimal = 0x1a; // 0x가 붙으면 16진법
int binary = 0b11010; // 0b가 붙으면 2진법
-실수 리터럴 : 실수는 기본적으로 double형을 사용한다. float형을 사용하려면 뒤에 f, F를 붙여야 한다.
double a = 0.1; // 0.1
double b = 1E-1; // 0.1
float c = 0.1f; // 0.1
-문자 리터럴 : 문자는 작은따옴표('이렇게')에 표현할 수 있다.
char A = 'A'; // A
-특수문자 리터럴
-문자열 리터럴 : 문자열은 큰따옴표("이렇게")에 표현할 수 있다.
String A = "ABC" // ABC
-boolean 리터럴 : true 또는 false로 표현할 수 있다.
boolean A = true;
boolean B = false;
④ 변수 선언 및 초기화하는 방법
변수 선언이란?
저장공간을 확보한다는 의미로 해석할 수 있다.
int a;
위 코드를 해석하면 int 타입의 값을 저장할 수 있는 공간을 확보하고 그 저장공간의 이름은 a이다.
변수 초기화란?
저장공간에 원하는 값을 저장한다는 의미로 해석할 수 있다.
변수를 선언하면 초기화 전까진 의미 없는 기본값(쓰레기 값?)이 들어가 있으므로 컴파일 에러가 나온다.
그러므로 변수를 선언하면 초기화를 해야 한다.
int a;
a = 1000;
하지만 이렇게 작성하면 2줄로 작성해야 하고 장문의 코드를 작성하게 되면 헷갈릴 수 있기에 한 줄로도 작성할 수 있다.
int a = 1000;
⑤ 변수의 스코프와 라이프타임
스코프(Scope) 란?
해당 변수를 사용할 수 있는 유효 범위를 뜻한다.
라이프타임(Life time) 이란?
변수가 메모리에서 존재하는 기간을 뜻한다.
public class Main{
int instVar; // 인스턴스 변수
static int classVar; // 클래스 변수
void method(){
int localVar; // 지역 변수
}
}
변수의 종류 | 선언 위치 | 메모리 할당 시기 |
클래스 변수 | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수 | 인스턴스가 생성될 때 | |
지역 변수 | 클래스 이외 영역 (선언한 메소드 내에서만 사용가능) |
변수 선언문이 수행되었을 때 |
- 클래스 변수 : 클래스 내에서 선언되고 어떠한 메소드나 블럭안에서 선언되지 않았으며 static 키워드를 포함한 변수
scope = 클래스 전체
lifetime = 프로그램 종료까지
- 인스턴스 변수 : 클래스 내에서 선언되고 어떠한 메소드나 블럭안에서 선언되지 않은 변수
scope = static method를 제외한 클래스 전체
lifetime = 클래스를 인스턴스화한 객체가 메모리에서 사라질 때까지
- 로컬 변수 : 인스턴스 변수, 클래스 변수가 아닌 모든 변수
scope = 변수가 선언된 block 또는 method 내부
lifetime = 메소드가 실행될 때 메모리를 할당 받고 메소드가 끝나면 소멸
⑥ 타입 변환, 캐스팅 그리고 타입 프로모션
타입 캐스팅(Type Casting)이란?
타입 변환(캐스팅)은 특정 자료형을 다른 자료형으로 변환하는 것을 말한다.
예를 들어 int(정수)형과 double(실수)형을 호환되게 하는 방법을 타입 변환/타입 캐스팅/형 변환이라 한다.
Primitive Type은 타입 캐스팅이 모두 가능하지만 큰 자료형을 작은 자료형으로 변환할 때 데이터 손실이 있을 수 있다.
int a = 300;
byte b = (byte)a;
System.out.println(b); // -> 44(데이터 손실)
타입 프로모션(Type Promotion)이란?
크기가 작은 자료형을 더 큰 자료형에 대입할 때, 자동으로 큰 자료형으로 변환되는 현상이다.
데이터 손실이나 변형이 없음을 확인할 수 있다.
byte a = 127;
int b = a;
System.out.println(b); // -> 127
⑦ 1차 및 2차 배열 선언하기
변수를 선언하면 하나만의 데이터를 저장하지만, 배열은 여러개의 데이터를 index구조에 저장한다.
배열의 길이는 한번 생성하면 줄이거나 늘일수없고 같은 타입으로만 배열의 원소로 사용된다.
- 1차원 배열
int rank[] = {1, 2, 3, 4, 5};
System.out.println(rank[0]); // 1
System.out.println(rank[1]); // 2
System.out.println(rank[2]); // 3
System.out.println(rank[3]); // 4
System.out.println(rank[4]); // 5
(배열의 index는 0부터 시작)
- 2차원 배열
배열안의 배열이라고 생각하자.
int arr[][] = {{1,2},{3,4}};
System.out.println(arr[0][0]); // 1
System.out.println(arr[0][1]); // 2
System.out.println(arr[1][0]); // 3
System.out.println(arr[1][1]); // 4
⑧ 타입 추론, var
타입 추론이란?
정석 타이핑을 지원하는 언어에서, 타입이 정해지지 않은 변수에 대해서 컴파일러가 변수의 타입을 스스로 찾아낼 수 있도록 하는 기능이다. 한마디로 타입 추론이 된다는 말은 타입을 명시하지 않아도 된다라는 말이다.
var이란?
Java 10부터 타입 추론을 지원하는 var 키워드가 추가되었다. 이 키워드는 local variable이면서 선언과 동시에 initializer가 필수적으로 요구된다.
var a = "PAIK JAVA"; // String a = "PAIK JAVA";
var b = 100; // int b = 100;
'백기선 과제' 카테고리의 다른 글
백기선 1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가? (0) | 2021.01.30 |
---|
댓글