
int i = 1;| 이름 | 설명 | 범위 |
|---|---|---|
| byte | 8비트 부호있는 2의 보수 정수 | -128 <= byte <=127 |
| short | 16비트 부호있는 2의 보수 정수 | -32,728 <= short <= 32767 |
| int | 32비트 부호있는 2의 보수 정수 | -2^31 <= int <= 2^31 -1 |
| long | 62비트 2의 보수 정수 | -2^63 <= long <= 2^63 -1 |
| float | 단정밀도 32비트 IEEE 754 부동 소수점 | 논의의 범위를 벗어남 |
| double | 배정밀도 64비트 IEEE 754 부동 소수점 | 논의의 범위를 벗어남 |
| boolean | true/ false 단순 플래그에 사용 | |
| char | 16비트 유니코드 문자 | \u0000 <= char <= \uffff |
원시형과 참조형이 있는데, 이 둘은 상호보완적이며 변수로써 저장할 수 있고, 인자를 전달할 수 있고, 메서드를 통하여 반환될 수 있다.
원시형은 자바 언어에 의해 미리 정의되어있고, 사전에 예정된 키워드로 이름이 정해져있다.
참조형에는 클래스 타입, 인터페이스 타입, 타입 변수, 배열 타입이 있다.
클래스나 인터페이스 타입은 식별자 또는 점으로 구분된 식별자 시퀀스로 구성된다
각 식별자 뒤에는 선택적으로 타입 인자가 오고 만약 타입인자가 나오면 이는 매개변수화된 타입이라고 볼 수 있다.
클래스 또는 인터페이스 타입의 식별자는 패키지 이름 또는 타입으로 분류된다.
출처 : https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-PrimitiveType
boolean res = true;
char capC = 'C';
byte b = 100;
short s = 100;
int i = 10000;
//26
int decVal = 26;
int hexVal = 0x1a;
int binval = 0b11010;
double d1 = 123.4;
double d2 = 1.234e2;
// 위 둘은 같다.
float f1 = 123.4f;
char a = \u0108;
String s = "S\u00ED Se\u00F1or";
자바 언어가 지원하는 몇가지 excape sequences 는 다음과 같다
null은 모든 참조유형에 대한 값으로 사용할수 있는 특수 리터럴이다.
기본 유형의 변수를 제외한 모든 변수에 할당할 수 있다.
출처 : https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
java 는 항상 scope 안에 있다.| 변수 종류 | 선언위치 | 스코프 | 라이프타임 |
|---|---|---|---|
| 클래스 변수 | 클래스 영역 | 클래스 전체 | 클래스가 메모리에 올라간 뒤 프로그램이 마칠 때 까지 |
| 인스턴스 변수 | 클래스 영역 | static 블록과 static 메서드를 제외한 클래스 전체 | 인스턴스가 생성 후 메모리에 살아있을 떄 까지 |
| 로컬 변수 | 메소드, 생성자, 초기화 블록 내부 | 변수가 선언된 블록 내부 | 변수 선언 후 블록을 벗어날 때 까지 |
대상 유형보다 작은 원시형 타입에서의 변환에는 특별한 표기법을 사용할 필요 없음
더 작은 값이 더 큰 컨테이너에 배치되고 빈 공간은 0으로 채워진다.
더 넓은 컨테이너로 가는 것이기 때문에 정보 손실을 걱정하지 않아도 된다.
하지만 더 좁은 컨테이너로 변환은 정보가 손실될 수 있다. 때문에 캐스트를 사용하여 상황을 알고 있음을 명시적으로 표현해야 한다.
int exInt = (int) exDouble;
Integer exReference = exInt;
int exOtherInt = exReference;
모든 원시형은 Wrapper class를 활용하여 스트링으로 변환할 수 있다. toString() 메서드를 오버라이딩한다.
String exString = "바보"
int exNewInt = Integer.parseInt(exString);
원시타입의 변환과 비슷해보이지만 완전히 다른 개념이다.
double d = 1.1;
int i = (int)d;
assertNotEquals(d, i);
위의 예에서 i는 1이고, 이전의 1.1값을 복원할 수 없다.
참조 변수는 개체만 참조하지 객체 자체를 포함하지는 않기 때문이다.
참조 변수를 캐스팅하는 것은 참조하는 개체를 건드리지 않고, 이 개체에 다른 방식으로 레이블을 지정하여 작업의 기회를 늘리거나 줄인다. 줄이면 업캐스팅, 다운캐스팅은 늘린다.
참조는 객체의 리모콘 같다. 리모컨은 종류에 따라 더 많거나 적은 수의 버튼을 가지고 개체 자체는 힙에 저장된다. 캐스팅을 할 때 리모콘의 종류는 바꾸지만 객체 자체는 바뀌지 않는다고 생각하자
public class Dog {
public void eat(){
}
}
// 확장해보자
public class WelshCorgi extends Dog{
public void eat(){
}
public void bark(){
}
}
WelshCorgi welshCorgi = new WelshCorgi();
// 암시적 업캐스팅 발생
Dog dog = welshCorgi;
//명시적으로 하기
dog = (Dog)welshCorgi;
Dog dog = new WelshCorgi;
((WelshCorgi)dog).bark();
연관관계가 없는 다운캐스팅은 컴파일 오류를 발생시키며 모두 동일한 상속 트리에 있어야 컴파일이 가능해진다.
배열은 여러개의 변수들을 한가지의 변수에 담기 위해 사용한다. 각각의 분리된 변수를 선언하는 것 대신에
square brackets을 사용하여 선언할 수 있다.
String [] rappers;
String [] rappers = {"esens", "nas", "kimximya"}
String [][]
ArrayLiteral을 사용하여 문자열들을 ','로 구분하여 선언할 수 있다.
2차원 배열도 마찬가지로 square brackets을 사용하여 선언하며, 1차원 더 들어가서 1차원 배열을 두번 선언하고 그 값을 저장한다.
String [][] rappsers = {{"bana", "esens"}, {"hilight", "paloalto"}, {"YngRch Records", "homies"}}
자바 컴파일러가 타입을 추론하는 것을 type inference라고 한다. 컴파일러는 추론을 위해 method invocation과 그에 상응하는 declaration을 살핀다.
추론 알고리즘이 인자의 타입을 결정하고, 가능한 경우에 결과가 할당되는 타입 또는 리턴 타입까지 결정한다. 추론 알고리즘은 모든 인자와 어울리는 선에서 가장 구체적인 타입을 찾는다.
타입 추론 덕분에 generic 메소드를 사용할 때 보통의 메소드와 마찬가지로 특정 타입을 명시하지 않은 채로 호출할 수 있다.
generic 메소드를 호출할 때 type witness와 함께 type parameter를 명시할 수 있지만, Java Compiler가 메소드의 인자로부터 자동으로 type 매개변수가 추론해주기 때문에 type witness를 생략할 수 있다.
generic 클래스 객체를 생성할 때엔 type inferene의 이점을 이용하고 싶다면 다이아몬드 <>를 반드시 이용해야 한다.
출처 : https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html