목표
자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
학습할 것
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 1차 및 2차 배열 선언하기
- 타입 추론, var
프리미티브 타입과 레퍼런스 타입
프리미티브 타입(Primitive Type)
- 총 8가지의 기본형 타입(Primitive Type)을 미리 정의하여 제공한다.
- 기본값이 있기 때문에 Null이 존재하지 않는다.
- 실제 값을 저장하는 공간으로 스택(Stack) 메모리에 저장된다.
- 만약 컴파일 시점에 담을 수 있는 크기를 벗어나면 에러를 발생시키는 컴파일 에러가 발생한다.
타입 | 할당되는 메모리 크기 | 기본값 | 데이터의 표현 범위 | ||
논리형 | boolean | 1 byte | false | true, false | |
정수형 | 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 1038) 의 근삿값 | |
double(기본) | 8 byte | 0.0 | (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값 | ||
문자형 | char | 2 byte (유니코드) | '\u0000' | 0 ~ 65,535 |
레퍼런스 타입(Reference Type)
- 기본형 타입을 제외한 타입들이 모두 참조형 타입(Reference Type)이다.
- 빈 객체를 의미하는 Null이 존재한다.
- 값이 저장되어 있는 곳의 주소 값을 저장하는 공간으로 힙(Heap) 메모리에 저장된다.
- 문법상으로는 에러가 없지만 실행시켰을 때 에러가 나는 런타임 에러가 발생한다.
타입 | 기본값 | 할당되는 메모리 크기 |
배열(Array) | Null | 4 byte (객체의 주소값) |
열거(Enumeration) | Null | |
클래스(Class) | Null | |
인터페이스(Interface) | Null |
리터럴
리터럴은 실제로 저장되는 값 그 자체로 메모리에 저장되어있는 변하지 않는 값 그 자체를 뜻한다.
또는 컴파일 타임에 프로그램 안에 정의되어 그 자체로 해석되어야 하는 값을 뜻한다.
오른쪽에 있는 값들을 리터럴이라고 부른다 예) 0b10, 010, 10 ...
변수 선언 및 초기화하는 방법
변수 선언은 타입을 적고 사용하고자 하는 이름을 작성하면 된다.
초기화는 해당 변수에 넣고자 하는 값을 작성하면 된다. (알기로는 선언과 동시에 초기화하듯이 한 줄로 작성하는 게 보다 효율적이라고 알고 있다.)
변수의 스코프와 라이프타임
자바는 블록 스코프를 사용한다.
y 값은 같은 메소드 내에 선언되어 있지만 Inner 블록으로 밖에서 y 변수가 접근할 수가 없다.
스코프 라이프타임 비교표
Variable Type | Scope | Lifetime |
Instance Variable | static method를 제외한 클래스 전체 | 클래스를 인스턴스화한 객체가 메모리에서 사라질 때 까지 |
Class Variable | 클래스 전체 | 프로그램 종료시 까지 |
Local Variable | 변수가 선언된 block 내부 | control 이 변수가 선언된 block 내부에 있는 동안 |
num1, num2는 인스턴스 변수이기 때문에 static 메소드인 main 메소드에서는 접근이 불가능하다.
result는 클래스 변수이기 때문에 main 메소드 내에서도 접근 가능한 걸 볼 수 있다.
타입 변환, 캐스팅 그리고 타입 프로모션
- 자신의 표현 범위를 모두 포함한 데이터 타입으로의 변환. (타입 프로모션)
- 자신의 표현 범위를 모두 포함하지 못한 데이터 타입으로 변환 (타입 캐스팅)
long 값의 표현 범위가 int에 비해서 넓기 때문에 형 변환 없이 int 값을 할당받을 수 있다. 이런 경우를 타입 프로모션이라고 부른다. 데이터 손실이 발생하지 않기 때문이다.
하지만 반대로 int가 long 값을 할당받기 위해선 형 변환이 필요하다. 이때를 타입 캐스팅이라고 부르는데, 타입 캐스팅은 데이터 손실이 발생할 수 있기 때문에 조심해서 사용해야 한다.
위와 같이 타입 캐스팅이 필요해서 에러 나는 부분을 아래와 같이 형 변환을 통해서 수정해보았다.
위에서 데이터 손실에 대해서 언급했던 이유가 아래 long_v2를 보면 알 수 있다.
1차 및 2차 배열 선언하기
1차 배열 선언와 값 할당은 아래와 같다.
값 할당 시 직접 new 키워드를 사용해서 배열 객체를 생성 후 값을 할당한다.
선언과 동시에 값 초기화도 가능하다.
2차원 배열은 1차원 배열에서 대괄호( [] )가 하나 더 붙는다. 행열을 생각하면 쉬울 것 같다.
타입 추론, var
타입 추론이란 데이터 타입을 소스코드에 명시하지 않아도, 컴파일 단계에서 컴파일러가 타입을 유추해 정해주는 것을 뜻한다. 1.5버전 부터 추가된 Generic 이나 자바 8 버전에서 추가된 lamda 에서 타입추론이 사용된다. 그리고 자바 10 에서는 이러한 타입추론을 사용하는 var 이라는 Local Variable Type-Inference 가 추가되었다.
참조
www.learningjournal.guru/article/programming-in-java/scope-and-lifetime-of-a-variable/
blog.naver.com/hsm622/222144931396
'JAVA > Study' 카테고리의 다른 글
백기선님 자바 스터디 14주차_Generic (0) | 2021.03.13 |
---|---|
백기선님 자바 스터디 13주차 (0) | 2021.03.04 |
백기선님 자바 스터디 12주차 (0) | 2021.02.06 |
백기선님 자바 스터디 11주차 - Enum (0) | 2021.01.31 |
백기선님 자바 스터디 9주차 (0) | 2021.01.18 |