선장님이 알려주신 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문 메모.. 하겠습니다