
선장님이 알려주신 bundle에서 java in a nutshell 책을 참고해서 정리했습니다. 책이 정말 좋습니다. 만세~~
| Type | Contains | Default | Size | Range |
|---|---|---|---|---|
| boolean | true / false | false | 1 bit | NA |
| char | Unicode character | \u0000 (null) | 16 bits | \u0000 to \uFFFF (non-character) |
| byte | Signed integer | 0 | 8 bits | -128 to 127 |
| short | Signed integer | 0 | 16 bits | -32768 to 32767 |
| int | Signed integer | 0 | 32 bits | -2147483648 to 2147483647 |
| long | Signed integer | 0 | 64 bits | -9223372036854775808 to 922372036854775807 |
| float | IEEE 754 floating point | 0.0 | 32 bits | 1.4E-45 to 3.4028235E+38 |
| double | IEEE 754 floating point | 0.0 | 64bits | 4.9E-324 to 1.7976931348623157E+308 |
char 는 Unicode 이다. Unicode 는 전세계 모든 언어를 컴퓨터로 표현하기 위해 디자인되었다.
자바는 char 접근법이 특이하다고 하다. javac에서 identifier와 literal을 UTF-8 (가변 길이 인코딩) 로 받고 자바는 내부적으로 char를 고정 길이 인코딩으로 제공한다고 한다.
위와 같은 내부 사정은 개발자하고는 상관이 없다고 한다.(일반적으로..)
문법은 아래와 같다. 파이썬, 자바스크립트처럼 '' 로 쓰나 "" 로 쓰나 모두 문자열로 받아들여주지 않는다.
char test = '1'
char uni = '\000'
학교에서 자주 배웠다. 컴퓨터에서 소수점을 정확히 표현해내는 것은 아주 어려운 일이라고.. 당연히 자바에서도 부동소수점을 사용해 소수를 표현한다.
부동소수점을 계산하는 방법은 까먹었지만 알고 있으니 넘어가자.
float 는 32 비트 부동소수점을 사용하고 double은 64비트 부동소수점을 사용한다.
부동 소수점 literal은 16진법, 8진법, 2진법으로 표현이 불가능하다.
아래와 같이 여러가지 형태로 선언할 수 있다.
123.45
0.0
.01
1.2345E02
1e-6
6.02e23
double d = 6.02E23; // double이 default
float f = 6.2e23f; // float를 사용할 때는 f라고 명시해줘야함
float 타입은 양의 방향에서 내려오는 0과 음의 방향에서 내려오는 0을 발생시킬 수 있다. 방향은 underflow가 발생한 방향이 결정한다.
그리고 또 NaN 이라는 값을 발생시킨다. Not-a-Number 의 약자인데 잘못된 연산을 시도했을 때 발생한다.
아래와 같이 위의 값들을 발생 시킬 수 있다.
double inf = 1.0/0.0; // Infinity
double neginf = -1.0/0.0 // Negative infinity
double negzero = -1.0/inf // Negative zero
double Nan = 0.0/0.0; // Not-a-Number
위에서 자꾸 Literals 라는 녀석이 나오는데 처음 들어봤다. Literals 란 자바 소스 코드에 정의된 상수 값들을 말하는 것 같다. integer, floating-point numbers, single characters within single quotes, strings of characters within double quotes, ture, false, null을 말한다.
아래 예시를 보자
1
1.0
'1'
1L
"one"
true
false
null
| Type | define by | allow define more | Size | store where | garbage collect automatically | Call by |
|---|---|---|---|---|---|---|
| primitive | java | not allowed | 1 ~ 8 Bytes | memory | no | reference |
| reference | user | allowed | substantially more than primitive | heap | yes | value |
primitive 는 java language로 정의되어 있다.primitive 타입을 정의할 수 없다.primitive types는 1~8바이트의 메모리를 사용한다. primitive types를 변수에 저장하거나 메소드에 넘겨줄 때 컴퓨터는 메모리 자체를 복사해간다.Reference types은 유저에 의해 정의되었다. 그래서 얼마든지 유저에 의해 더 정의될 수 있다. Dto 같은 녀석도 Reference data type이라고 부를 수 있겠다.primitive value or objects 를 포함할 수 있다.primitive 보다 더 많은 메모리를 필요로 한다. 자바는 statically typed 언어이기 때문에 기본적으로 변수에 타입을 지정해줘야한다.
int counter;
String s;
자바에서는 초기화하지 않은 변수를 사용하는 것을 허락하지 않는다. 그래서 대부분의 경우 변수를 선언하는 동시에 초기화한다.
int counter = 0;
String s = readLine();
int[] data = {x+1, x+2, x+3};
변수 여러개를 한번에 초기화, 할당할 수도 있다. 단, 변수들은 같은 타입이어야 한다. (그러면 당연히 안되더라.var 타입은 여러개 한번에 선언가능?)
int i, j, k;
float x
값을 상수로 사용하고 싶으면 final을 사용하자. 딱 한번만 값을 할당할 수 있다.
final String greeting = getLocalLanguageGreeting();
오 자바에서 var를 사용하면 컴파일러에게 자동으로 타입을 추론하도록 요청할 수 있다.
신기하구먼
var i = 0 // type of i infereed as int
var s = readLine(); type of s inferred as String
foreach 문이랑 같이 쓰면 엄청 편하더라
TooLongNameDto tooLongNameDto = new TooLongNameDto();
for (var dto : tooLongNameDto) {
// TODO
}
자바의 변수는 블록 스코프를 가진다 { } 안에서 선언된 변수는 그 블록 안에서만 사용가능하다. 메소드, 클래스 같은 녀석안에서만 사용 가능하다는 말이다.
괄호안에 데이터 타입이나 변수를 넣음으로써 변환, 캐스팅이 가능하다. 그런데 이 연산이 엄청 비싼 연산이라고 들었다. 어디서 주워들음..
(byte) 28 // integer -> byte 캐스팅
(int) (x + 3.14f) // float 연산 -> integer 캐스팅
프로모션은 서로 포함관계가 있는 것을 나타낸다고 이해하면 좋을 것 같다.
byte, short, char -> int 로 프로모션 가능하다.
long은 연산을 거치면 결과값을 long으로 만들어버린다.
float는 연산을 거치면 결과값을 float로 만들어버린다.
double도 연산을 거치면 결과값을 double로 만든다.
primitive 타입변환 테이블을 참고해서 프로모션, 캐스트가 어떻게 일어나는지 파악하자.
N은 타입 변환이 불가능하다는 뜻이다.
Y는 확장 변환이 가능하다는 뜻이고 자바에 의해 자동으로 암시적 형변환이 발생한다. 그래서 연산을 하면 자연스럽게 형변환이 발생한다. 언어를 처음 배울 때 이 녀석 때문에 버그를 많이 발생시키기도 했다 ㅠㅠ
C는 축소 변환이 가능하다는 뜻이고 프로그래머에 의해 명시적 형변환을 해줘야한다. 명시적 형변환은 위와 같이 괄호 안에 타입을 넣어 지정하는 것을 말한다.
| Type | boolean | byte | short | char | int | long | float | double |
|---|---|---|---|---|---|---|---|---|
| boolean | - | N | N | N | N | N | N | N |
| byte | N | - | Y | C | Y | Y | Y | Y |
| short | N | C | - | C | Y | Y | Y | Y |
| char | N | C | C | - | Y | Y | Y | Y |
| int | N | C | C | C | - | Y | Y* | Y |
| long | N | C | C | C | C | - | Y* | Y* |
| float | N | C | C | C | C | C | - | Y |
| double | N | C | C | C | C | c | C | - |
배열은 너무 쉬우니까.. 1차는 []하나만 2차는 [][] 2개를 쓰자
코딩 테스트 때 2차 배열을 활용해서 2차원 좌표 문제를 해결하기도 한다.
var과 foreach문 메모.. 하겠습니다