목표
자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
학습할 것
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 1차 및 2차 배열 선언하기
- 타입 추론, var
이번 시간은 자바의 데이터 타입에 대해 다룰 예정이다.
데이터 타입이란? 해당 데이터가 메모리에 어떻게 저장되고, 프로그램에 어떻게 처리돼야하는지 명시적으로 알려주는 것이다. 자바에서는 타입이 크게 기본형(Primitive)타입, 참조형(레퍼런스)타입이 존재한다. 이 두 개의 차이는 크게 어디에 저장되냐 라고 생각하는게 편하다.
1. 프리미티브 타입 종류와 값의 범위 그리고 기본 값
정의
기본형 타입을 의미한다. JAVA 는 총 8가지의 기본형 타입을 제공하고, 기본 값을 가진다. 따라서, 각각의 타입은 NULL 을 가질 수 없다.( NullPointerException: null 을 가지고 싶으면, Wrapper 클래스로 감싸야함.) 기본형 타입은 실제 값을 저장하는 공간, 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,808 |
float | 4 byte | 0.0F | (3.4*10 ^-38) ~(3.4*10 ^38) |
double | 8 byte | 0.0 | (1,7 * 10 ^ -308) ~(1.7 * 10^308) |
char | unsigned 2 byte | `\u0000` | '\u0000'(0) to '\uffff'(65535) |
프리미티브 타입과 레퍼런스 타입
NULL 존재여부 | 저장공간 | |
프리미티브 타입 (기본형 타입) |
기본 값을 가진다. 따라서, 각각의 타입은 NULL 을 가질 수 없다. ( null 을 가지고 싶으면, Wrapper 클래스로 감싸야함.) |
실제 값을 STACK 메모리에 저장한다. |
레퍼런스 타입 (참조형 타입) |
빈 객체라는 NULL 이 가능. | 실제 값의 주소를 Heap 메모리에 저장한다. |
[ 참고 jvm 메모리 영역 ]
레퍼런스 타입 종류와 값의 범위 그리고 기본 값
타입 | 기본 값 | 기본 값의 메모리 크기 |
배열(Array) | null | 4 byte ( 객체 주소를 저장) |
열거(Enumeration) | ||
클래스(Class) | ||
인터페이스(Interface) |
.
리터럴(= literal = immediate value = 즉시값)
리터럴은 데이터 그 자체를 의미한다. 고정된 값
상수는 값을 한 번 저장하면 변경할 수 없는 저장공간이라는 의미를 프로그래밍 쪽에서 가지고 있어서 리터럴 이라는 용어로 사용한다.
(catsbi.oopy.io/6541026f-1e19-4117-8fef-aea145e4fc1b)
( 심화 : 선언된 변수에 값을 넣어 초기화할 때, 사용하는 값.
인스턴스와 같은 클래스 데이터들은 값이 변할 수 있기 때문에 리터럴이 될 수 없다.
하지만, 불변 클래스( immutable class) 와 같이 클래스 속 데이터가 변하지 않도록 설계한 경우 ( java 의 String 등) 인스턴스의 리터럴이라 표현할 수 있다. )
long num;
num = 0L; // 0 이 literal
변수 선언 및 초기화하는 방법
long tmp;
int i;
double j;
string companyName;
// 변수 선언과 초기화
int i = 100;
double j = 23.12;
string aa="effect";
* 질문 : Long 과 long 의 차이 ?
Long과 long의 차이
Long은 Wrapper Class이다. 크기는 8byte (sizeof 함수가 없어서 인터넷에서 찾아봄)
long은 순수한 자바 자료형이다. 크기는 8byte
Long.SIZE 에 대한 설명 The number of bits used to represent a long value in two’s complement binary form.
Wrapper Class는 클래스로써 변환해야할 때, 인자값으로 Class를 받을 때 등.. 의 상황에서 사용한다.
예를들어 클라로부터 a라는 인자를 받을 때도 있고, 받지 않을 때도 있다. 이 때 a의 값이 없을 때는 null이 대입되므로 Wrapper Class를 사용해야한다.
parkwonhui.github.io/java/2019/05/15/java-wrapper-class.html
변수의 스코프와 라이프타임
변수의 스코프
본인이 속한 중괄호 내라고 생각하면 편하다.
> 참고한 블로그에서 static 을 배움.
public class VariableScopeExam {
int globalScope = 10;
public void scopeTest(int value){
int localScope = 20;
System.out.println(globalScope);
System.out.println(localScope);
System.out.println(value);
}
public static void main(String[] args) {
System.out.println(globalScope); //오류
System.out.println(localScope); //오류
System.out.println(value); //오류
}
}
//https://velog.io/@ggob_2/java-study-2
오류가 난 이유: static 함수 (main) 내에서 사용하는 변수 또한 static 이여야함.
-
static
- 정적, 고정된이라는 뜻. 객체( 인스턴스)에 소속된 멤버가 아닌, 클래스에 고정된 멤버를 선언하는 키워드이다.
- 클래스에 고정된 멤버기 때문에, 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때, 클래스 별로 관리한다. static 키워드를 통해 생성된 정적 멤버들은 heap 영역이 아닌 static 영역에 할당된다.
- static 영역에 저장된다는 뜻
- 재활용 할 수 있단 장점을 가졌다.
- 모든 객체가 공유해서 하나의 멤버를 어디든 참조 할 수 있다.
- 단점: 프로그램 종료시 까지 메모리가 할당 된채로 존재함.( 시스템 성능에 악영향 가능성)
- garbage collector 의 관리 영역 밖에 존재함.
- static 영역에 저장된다는 뜻
- static 한 필드나 static 한 메소드는 클래스가 인스턴스화 되지 않아도 사용할 수 있다.
static [타입][변수명];
[접근권한] static class [클래스명]{}
라이프타임
자바의 라이프 사이클은 객체가 생성된 후부터 폐기될 때까지를 뜻한다.
< 객체의 라이플 사이클 7상태 >
상태 | 설명 |
1. created ( 생성 ) | 객체를 위한 메모리 공간을 heap 에 할당한다. 이후 , super class 의 생성자를 호출하면서, initializer 및 instance variable 의 초기화를 구행한후, 객체의 생성자를 수행한다. |
2. in use or reachable ( 사용 중 ) | 객체가 생성되어 다른 객체에 의해 참조되거나 사용중 상태, strongly referenced 라고 도 부름. |
3. invisible ( 사용중, 접근 불가 ) | 모든 객체가 이 상태가 되는 것은 아니다. 2 의 상태지만, 직접 접근할 수 없어 gc 의 대상이 아니다. |
4. unreachable ( 사용되지 않음 ) | 2가 존재하지 않는 경우. gc 의 후보. gc 대상 큐에 들어간다. 다시 말하자면, 이러한 객체들은 gc 의 루트가 가지는 체인에 참조되는 형태로 ㅎgc 수행시, 이 루트의 체인을 따라가며 메모리를 해제 |
5. collected ( GC 대상이 되는 상태 ) | 메모리 해제단계 도입부. gc 는 객체에 finalize() 정의 여부에 따라 , 있다면 finalizer 큐에 넣고, 없으면 바로 다음 finalized 로 전환시킨다. |
6. finalized ( finalize 를 거친 상태) | finalizer 를 통해 finalize rㅏ 실행 후 상태이다. jvm 에 따라 수행 시간도 다르고, 5에서 finalize() 의 정의 여부에 따라 다르게 동작했으므로, finalize 가 호출되는 시간및 finalize 용 객체 메모리 크기는 보장되지 않는다. |
7. deallocated (메모리 해제된 상태) | 메모리 반환 끝난 상태. gc 의 동작이 마무리 됐다. |
< 변수 타입별 라이프 사이클 >
변수 타입 | 라이프 사이클 |
로컬 변수 | 처리 블록 내에서만 생존. 변수 선언부 ~ 블록 종료 시 까지 |
인스턴스 변수 | 개체가 메모리에 남아있을 때까지 |
클래스 변수 | 클래스 메모리에 올라갈 시 ~ 클래스 언로드 시 까지 |
타입 변환, 캐스팅 그리고 타입 프로모션
타입 변환의 종류는 2가지가 있다.
- 묵시적 타입 변환 (자동 타입 변환) - 타입 프로모션
- 컴파일러가 자동으로 수행하는 타입 변환
- 데이터 손실을 최소화하게 노력
- 작은 데이터 타입에서 큰 데이터 타입으로의 변환을 의미한다.
- 명시적 타입 변환 (강제 타입 변환) - 타입 캐스팅
- 사용자가 타입캐스트 연산자 () 를 사용해 강제적으로 수행하는 타입변환.
하위 클래스로 형변환, 다운 캐스팅
묵시적으로 상위 클래스 형변환된 인스턴스가 원래 자료형( 하위 클래스)로 변환되어야할때 다운 캐스팅이라고 함.
하위 클래스로의 형변환은 명시적으로 돼야함.( kils-log-of-develop.tistory.com/107)
Customer vc = new VIPCustomer(); // 묵시적
VIPCustomer vCustomer = (VIPCustomer) vc; // 명시적
1차 및 2차 배열 선언하기
// 1차 배열 선언
int[] arrayName;
int []arrayName;
int arrayName[];
// 1차 배열 초기화
int[] arr1Ex;
arr1Ex = new int[3];
int[] arr1Ex = new int[4];
int[] arr1Ex= {1,2,3,4,5} // 배열 크기 5
// 2차 배열 선언
int[][] arrayName;
int []arrayName [];
int arrayName[][];
// 2차 배열 초기화
int[][] arr1;
arr1 = new int[3][2];
int[][] arr2 = new int[4][3];
int[][] arr3 = {{0,1,2},{3,4}} // 배열 크기 5
// 2차원 배열 생성시, 열의 길이를 명시 안하면, 행마다 길이 다르게 가변배열 생성 가능
타입 추론, var
타입이 정해지지 않은 변수에 대해서 컴파일러가 변수의 타입을 스스로 찾아낼수 있도록 한다.
지역 변수 내에서만 사용해야하고, 선언시 바로 초기화를 해야한다.
var a = 1; // 'int' 로 타입 추론
참고문헌
catsbi.oopy.io/6541026f-1e19-4117-8fef-aea145e4fc1b
백기선님 자바스터디 2주차
'스프링, 자바' 카테고리의 다른 글
mocMvc Controller Test (0) | 2020.11.18 |
---|---|
타임리프 찾아본 로그 (0) | 2020.11.16 |
자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기 (0) | 2020.11.15 |
클린 코드 리팩터링 공부하고 싶을때 (0) | 2020.11.06 |
spring security (0) | 2020.11.05 |