티스토리 뷰
프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 논리형
- boolean
- 1 byte
- 기본값(field) : false
- boolean
- 문자형
- char
- 2 bytes
- 0 ~ 2^16-1 (0~63335)
- 기본값(field): ‘\u0000’
- char
- 정수형
- byte
- 1 byte
- -2^7 ~ 2^7-1
- 기본값(field): 0
- short
- 2 bytes
- -2^15 ~ 2^15-1
- 기본값(field): 0
- int
- 4 bytes
- -2^31 - 2^31-1 -> 약 20억
- 기본값(field): 0
- long
- 8 bytes
- -2^63 ~ 2^63-1
- 기본값(field): 0L
- byte
- 실수형
- float
- 4 bytes
- 기본값(field): 0.0f
- double
- 8 bytes
- 기본값(field): 0.0d
- float
프리미티브 타입과 레퍼런스 타입
- primitive type : 실제 값을 저장.
- reference type : 객체의 주소(memory)를 저장. 8개의 primitive type을 제외한 나머지 타입
reference type은 null 혹은 객체의 주소(32bit JVM 일 경우 4byte, 64bit JVM일 경우 8 byte) 를 값으로 갖는다.
리터럴
구체적인 값.
e.g. 12
, 3.14
, 'A'
구체적인 값을 ‘상수’라고 명명하면 되지만 이미 상수를 ‘값을 한 번 저장하면 바꿀 수 없는 저장공간’ 으로 정의했기 때문에, 구체적인 값을 리터럴이라고 부르기로 했다.
접미사
- long : l 혹은 L 을 뒤에 붙인다.
- float : f 혹은 F 를 뒤에 붙인다.
- double: d 혹은 D를 뒤에 붙인다. (기본 자료형이라서 접미사 생략 가능)리터럴 값이 변수 타입 값의 범위를 넘어서거나, 리터럴의 타입이 변수의 타입보다 저장 범위가 넓으면 컴파일 에러가 발생한다.
- 정수형과 실수형에는 여러 타입이 존재하므로 리터럴 뒤에 접미사를 붙여서 타입을 구분한다. 참고로, byte 와 short는 int 타입의 리터럴을 동일하게 사용한다. (아무 접미사도 붙이지 않는다.)
int i = 0x123456789; // 에러 (리터럴이 int 타입 범위를 벗어남)
float f = 3.14; // 에러 (리터럴의 타입 double > 변수 타입 float)
변수 선언 및 초기화하는 방법
- 변수 선언
{변수타입} {변수이름}
- 초기화 방법
- 명시적 초기화
- 초기화 블록
- 클래스 초기화 블록
static { }
block 내부에 초기화하는 코드를 적는다.- static 변수의 복잡한 초기화에 사용된다.
e.g. static array 의 element를 for-loop으로 초기화
- 인스턴스 초기화 블록
- 클래스 내부에서,
{ }
block 내부에 초기화하는 코드를 적는다. - instance 변수의 복잡한 초기화, instance 생성자 코드 마다 반복되는 초기화에 사용된다.
- 클래스 내부에서,
- 클래스 초기화 블록
- 생성자초기화 순서
static 변수 : 기본값 -> 명시적 초기화 -> 클래스 초기화 블록
instance 변수 : 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블록 -> 생성자
변수의 스코프와 라이프타임
Scope : 해당 변수를 접근할 수 있는 코드 범위
Lifetime : 해당 변수가 메모리에 남아 있는 시간.
- Class variable
- scope : class 내 모든 코드에서 접근 가능
- lifetime : class가 메모리에 load 된 시점(프로그램이 loading되는 시점) ~ 프로그램이 종료되는 시점
- Instance variable
- scope : static method를 제외한, class 내 모든 코드
- lifetime : object가 메모리에 load되는 시점 ~ object가 메모리에서 내려오는 시점
- local variable
- scope : local variable이 선언된 block 내 코드
- lifetime : program control이 block 내부에 있는 시기.
타입 변환과 타입 프로모션
타입 변환(Casting)
- 변수나 리터럴의 타입을 다른 타입으로 변환하는 것.
- 기본형에서 boolean을 제외한 나머지 타입은 서로 형변환이 가능
- 기본형 - 참조형 간 형변환은 불가능
- 형변환 연산자 ‘()’를 이용함.
(타입)피연산자
정수형 간 형변환
큰 타입 -> 작은 타입
: 값 손실 발생 가능작은 타입 -> 큰 타입
: 값 손실 X.- 음수 : 빈 자리를 1로 채운다
- 양수 : 빈 자리를 0으로 채운다
실수형 간 형변환
float -> double
- exponent는 127을 빼고 1023을 더한다.
- fraction은 23자리를 그대로 옮기고 나머지는 0으로 채운다.
double -> float
- exponent는 1023을 빼고 127을 더한다.
- fraction은 23자리만 저장되고 나머지는 버려진다.
- 이때, 24번째 자리 값이 1이면 23번째 자리 값이 1 증가(반올림)
- 만약 float 범위를 넘는 값을 double -> float 변환하면
Infinity
혹은0
값을 얻게 된다.
- 만약 float 범위를 넘는 값을 double -> float 변환하면
정수형 - 실수형 간 형변환
정수형 -> 실수형
: 정수 -> 2진수 -> 정규화 -> 실수로 저장.- float는 10진수로 약 7자리 정밀도를 제공하므로, 8자리 이상의 정수는 변환시 오차 발생 가능.
double d3 = 91234567; float f3 = 91234567f; int f_int = (int) f3; //91234568 int d_int = (int) d3; //91234567
- float는 10진수로 약 7자리 정밀도를 제공하므로, 8자리 이상의 정수는 변환시 오차 발생 가능.
실수형 -> 정수형
: 소수점 이하 값이 버려진다.- 만약 소수점을 버리고 남은 정수가 정수형 저장범위를 넘어서면, 정수의 오버플로우가 발생한 것과 동일한 결과 (?)
double d4 = 1.5e13; int overflow_int = (int) d4; //2147483647 System.out.println("overflow_int = " + overflow_int);
타입 프로모션(자동 형변환, Promotion)
서로 다른 타입 간의 대입이나 연산을 할 때 형변환을 생략하면, 컴파일러가 자동으로 형변환하는 코드를 추가해주는 것
- 컴파일러는 기존 값을 최대한 보존할 수 있는 타입으로 자동 형변환한다.
- 자동 형변환 가능한 방향 (반대 방향은 형변환 연산자를 반드시 사용해야 함)
byte -> short -> int -> long -> float -> double
1차 및 2차 배열 선언하기
1차원 배열
- 선언
타입[] 변수이름;
or타입 변수이름[];
- 생성
변수이름 = new 타입[원소개수]
int[] score = new int[5];
2차원 배열
- 선언
타입[][] 변수이름;
- 생성
변수이름 = new 타입[][]
int[][] score = new int[4][3];
타입 추론, var
- Java10 에 처음 도입
- 사용 가능한 곳
- local variable (선언과 동시에 초기화해야 함)
- for loop
- 주의사항
- null 로 초기화 불가능
- 배열에 사용 불가
//for each
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
for (var i : integers){
System.out.println(i);
}
//가독성
/*
URL url = new URL("http://www.oracle.com/");
URLConnection conn = url.openConnection();
Reader reader = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
*/
var url = new URL("http://www.oracle.com/");
var conn = url.openConnection();
var reader = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
Java Platform, Standard Edition Java Language Updates, Release 10
(추가학습) String
(추가학습) 참조 변수의 형변환
백기선님 리뷰 영상
- 값의 표현 범위가 어떻게 산출되는지
- 리터럴에서 다양한 진수 표현 방법
- float(부동소수점) 는 정확하지 않음. 돈 계산이 필요할 때는 BigDecimal이 필요하다.
- var 하트 받으신 분 과제 확인하기
'JAVA' 카테고리의 다른 글
[자바 스터디] 6주차 : 상속 (0) | 2022.01.30 |
---|---|
[자바 스터디] 5주차 : 클래스, 패키지 (0) | 2022.01.21 |
[자바 스터디] 4주차 : 제어문 (0) | 2022.01.15 |
[자바 스터디] 3주차 : 연산자 (0) | 2022.01.07 |
[자바 스터디] 1주차 : JVM이란 무엇이며 JAVA 코드는 어떻게 실행되는가 (0) | 2021.12.26 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 템플릿콜백
- 예외처리
- 카카오
- 서비스추상화
- 백기선
- 코딩테스트
- 디자인패턴
- gracefulshutdown
- 데코레이터패턴
- AOP
- 코테
- 프록시
- 토비의봄TV
- ec2
- 객체지향
- java
- BOJ
- SOLID
- 프로그래머스
- 자바스터디
- 자바
- 토비의스프링
- c++
- OOP
- 스프링
- 토비
- 프록시패턴
- 김영한
- 메서드레퍼런스
- provider
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함