https://github.com/whiteship/live-study/issues?q=is%3Aissue+is%3Aclosed
목차
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 1차 및 2차 배열 선언하기
- 타입 추론, var
1. 프리미티브 타입 종류와 값의 범위, 기본값
- 기본형 (primitive type) : 실제 값을 저장하는 자료형
- 논리형 : boolean
- 문자형 : char
- 정수형 : byte, short, int, long
- 실수형 : float, double
기본형의 종류와 크기
1 byte | 2 byte | 4 byte | 8 byte | |
논리형 | boolean | |||
문자형 | char | |||
정수형 | byte | short | int | long |
실수형 | float | double |
기본형의 범위 및 기본 값
범위 | 기본값 | |
boolean | false, true | false |
char | 0 ~ 2^16-1 (0 ~ 65535) | 0 |
byte | -2^7 ~ 2^7-1 (-128 ~ 127) | 0 |
short | -2^15 ~ 2^15-1 (-32768 ~ 32767) | 0 |
int | -2^31 ~ 2^31-1 ( 약 20억) | 0 |
long | -2^63 ~ 2^63-1 | 0L |
float | 1.4E-45 ~ 3.4E38 | 0.0F |
double | 1.4E-45 ~ 3.4E38 | 0.0 |
예를 들어, int의 경우 크기가 8바이트기 때문에 $2^{8}$개의 수를 표현할 수 있고 양수 범위는 0이 포함됐기 때문에 int의 범위는 $-2^{7}$ ~ $2^{7}-1$이다.
char의 경우 short와 크기가 4바이트로 같지만 범위가 다르다. char는 문자 자체를 저장하는 것이 아닌 문자의 유니코드를 저장하므로 음수가 없고, 범위는 $0$ ~ $2^{16} -1$이다.
2. 프리미티브 타입과 레퍼런스 타입
기본형
- 8개 (boolean, char, byte, short, int, long, float, double)
- 정수는 int, 실수는 double이 default
- 실제 값을 저장한다
- 저장 위치는 프리미티브 스택
참조형
- 기본형을 제외한 나머지 모든 클래스 (String, System 등등)
- 객체가 저장된 메모리의 주소를 저장
- ex) Date today;
- 객체는 heap에 저장된다.
3. 리터럴
리터럴 : 그 자체로 값을 의미
int year = 2022;
//year : 변수, 2022 : 리터럴
정수형의 접미사
2진수 : 0b
8진수 : 0
16진수 : 0x
byte, short : 접미사가 없다. int 타입의 리터럴을 사용한다.
int : 접미사가 없다.
long : L 사용 ex) 1000000L
20억이 넘는 숫자를 저장할 때 접미사 L을 붙이지 않으면 에러가 발생한다.
정수형 리터럴로 취급돼어 오버플로우가 일어나기 때문
실수형의 접미사
float : f
double : d 생략이 가능하다.
float pi = 3.14;
// 접미사가 없기 때문에 3.14는 double형 리터럴이다.
// double형 리터럴을 float에 저장할 수 없다.
double pi = 3.14;
// double은 접미사를 생략할 수 있다.
문자형의 접미사
- 문자형의 경우 개행문자는 한 글자의 문자형이다.
- 자바는 유니코드를 지원한다.
- 큰따움표는 문자열, 작은따움표는 문자이다.
- 예시
- boolean power = true;
- char ch = 'A';
- String str = "ABC";
변수와 리터럴의 타입이 불일치할 경우
- 1. 범위 : 변수 > 리터럴일 때 할당이 가능하다.
- int i = 'A';
- long l = 123;
- double d = 3.14f;
- 2. 범위 : 변수 < 리터럴일 때 할당이 불가능하다.
- 값의 손실이 일어날 수 있기 때문이다.
- float f = 3.14;
- int i = 0x123456789;
- 3. 예외
- byte, short에 int리터럴을 저장할 수 있다.
- byte b = 127 : byte의 범위 내에 있으므로 가능하다.
- byte b = 128 : byte의 범위 외에 있으므로 불가능하다.
문자와 문자열
문자형은 작은따옴표, 문자열은 큰따옴표를 사용한다.
- char ch = 'A';
- char ch = 'AB'; // dpfj
- String s = "ABC"; 문자열
- String 클래스는 기본형 변수에 값을 저장하는 것을 허용한다.
- 빈 문자열은 가능하지만 빈 문자는 허용되지 않는다.
- String s = "";
- char = ''; //오류
- 자동형변환에서 순서에 따라 결과가 달라진다.
- “” + 7 → “7” 기본형과 문자열과의 변환을 알아두자. 숫자형이 문자열로 변환됨
- “”+7+7 → “7”+7 → “7” + “7” → “77”
- 7+7+”” → 14 + “” → “14”
4. 변수 선언 및 초기화하는 방법
- 변수 선언
- 변수타입과 변수이름을 정한다.
- ex) int age;
- 변수 타입 : 변수에 저장될 값의 타입
- 변수 타입에 따라 메모리의 저장공간이 정해지고 변수이름으로 접근한다.
- 변수명 사용 규칙
- 숫자로 시작할 수 없다.
- _와 $ 의외의 특수문자는 사용할 수 없다.
- 자바의 키워드를 변수명으로 사용할 수 없다.
- 변수 초기화
- 처음으로 변수에 값을 할당
- ex) int age = 25;
- 지역변수는 읽기전에 반드시 초기화해야한다.
- 클래스 변수와 인스턴스 변수는 생략 가능
- 선언과 초기화를 따로 해도 되지만 동시에 하는게 더 좋음
5. 변수의 스코프와 라이프타임
선언 위치에 따른 변수의 종류
class Variables
{
int iv; //인스턴스변수
static cv; //클래스변수
void method ()
{
int lv; //지역변수
}
}
인스턴스 변수
인스턴스를 생성할 때 만들어지는 변수
scope : static method를 제외한 클래스 전체에서 사용할 수 있다.
lifetime : 인스턴스가 heap에서 사라질 때까지
클래스 변수
클래스가 메모리에 올라갈 때 생성되는 변수, static 키워드가 포함돼 선언된 변수
scope : 클래스 전체
lifetime - 프로그램 종료시까지
지역 변수
메서드 내부만 사용할 수 있고, 메서드가 종료되면 소멸된다.
6. 타입 변환, 캐스팅, 타입 프로모션
1. 형변환 (casting)
변수 또는 상수의 타입을 다른 타입으로 변환하는 것
double d = 85.4;
int score = (int)d;
기본형과 참조형간의 형변환은 불가능하고, boolean을 제외하고 기본형끼리 형변환이 가능하다.
- 정수형 간의 형변환
- 4바이트의 int형 자료형을 1바이트의 byte형으로 변환할 때, 값이 손실된다.
- int형의 300을 byte형으로 변환하는 경우
- 300은 2진수로 100101100으로 9자리
- byte형으로 변환시 1바이트기 때문에 8자리를 제외하고 제거
- 00101100 → 44로 값이 변경됨
- 실수형도 마찬가지로 float 타입을 double 타입으로 변화시킬 때 손실이 일어날 수 있다.
- 정수형이든 실수형이든 저장 공간이 작은 타입에서 큰 타입으로 변화할 때는 손실이 일어나지 않는다.
- 정수형을 실수형으로 변화할 때 정수를 2진수로 변환후 정규화를 거쳐 실수의 저장 형식으로 바꾼다.
- 실수형을 정수형으로 바꿀 때 소수점 이하 값은 버려진다.
2. 자동 형변환
편의상의 이유로 형변환 연산자를 사용하지 않아도 자동 형변환이 가능 하다.
큰 용량의 타입에서 작은 용량의 타입(ex int → byte)은 값 손실의 이유로 자동 형변환이 불가능지만
표현 범위가 넓은 타입으로의 방향으로 자동 형변환이 일어날 수 있다. (화살표 방향으로 가능)
실수형은 정수형보다 큰 표현 범위를 가지므로 long에서 float로 자동 형변환이 일어날 수 있다.
float f = 1234;//에러가 일어나지 않는다. int에서 float으로 자동형변환
float f = 0.1234;// 형변환 연산자 없이 double type을 float에 저장할 수 없다.
int i = 3;
double d = 1.0 + i; // 4.0이 출력된다. i가 double로 변환되어 계산된다.
char과 short 모두 2byte이지만 범위가 다르기 때문에, char과 short간 자동형변환은 불가능하다.
8. 타입 추론, var
'자바 > 백기선 자바스터디' 카테고리의 다른 글
[백기선 자바스터디] 인터페이스 (0) | 2022.08.10 |
---|---|
[백기선 자바스터디] 패키지 (0) | 2022.07.25 |
[백기선 자바스터디] 상속 (0) | 2022.07.14 |
[백기선 자바스터디] 클래스 (0) | 2022.07.06 |
[백기선 자바스터디] 연산자 : instanceof, shift 연산자 (0) | 2022.07.02 |