지네릭 형변환
: 지네릭 타입과 원시타입간 형변환은 바람직하지 않음.(경고 발생)
: 지네릭 타입끼리도 타입이 맞지 않으면 형변환 불가
: 와일드 카드가 사용된 지네릭 타입으로는 형변환 가능
Box<Obejct> objBox = (Box<Obejct>)new Box<String>(); // error. 타입이 안맞아서 형변환 불가
Box<? extends Obeject> wBox = (Box<? extends Object>) new Box<String>(); // ok
// object와 그 자손들이 들어갈수 있는데 String이 Object의 자손이므로!
Box<? extends Object> wBox = new Box<String>(); // 위문장과 동일. 형변환이 생략되어있음
지네릭 타입의 제거
: 컴파일러는 지네릭 타입을 제거하고, 필요한 곳에 형변환을 넣는다.
: 즉 지네릭은 컴파일 파일에만 존재함.
: 우리는 지네릭스 덕분에 형변환을 생략했는데 컴파일 후 형변환이 컴파일러에 의해 추가됨
① 지네릭 타입의 경계(bound)를 제거 (하위호환성 > 안정성 제공)
② 지네릭 제거 후에 타입이 불일치하면 형변환 추가
③ 와일드 카드가 포함된경우 적절한 타입으로 형변환 추가
class Box<T extends Fruit>{
void add(T t){
...}
}
--------------------------컴파일러가 지네릭타입의 경계를 제거. 이전버전과의 호환성을 위함.
class Box{
void add(Fruit t){
...}
}
T get(int i){
return list.get(i);}
--------------------------지네릭 타입 제거 후 형변환 추가
Fruit get(int i){
return (Fruit)list.get(i);} //list.get(i)의 반환타입은 Object
열거형(enum)
: 서로 관련된 상수를 같이 묶어놓음.
: 자바는 타입에 안전한 열거형 제공 ▶ 값과 타입 모두 체크. 그래서 숫자가 같더라도 타입이 불일치하면 비교X
열거형의 정의와 사용
1. 열거형을 정의하는 방법
👉 enum 열거형이름 { 상수명1, 상수명2,...}
2. 열거형 타입의 변수를 선언하고 사용하는 방법
3. 열거형 상수의 비교에 == 와 compareTo() 사용 가능
4. 열거형 상수 하나하나가 객체라서 equals로 서로 비교가능 & 객체라서 비교연산자 불가
enum Direction {EAST, SOUTH, WEST, NORTH} // 0,1,2,3 정수값이 하나씩 부여됨
class Unit{
int x,y; // 유닛의 위치
Direction dir; // 열거형 iv선언. dir에는 위 열거형 4개중 하나가 들어감
void Unit(){
dir = Direction.EAST;} // 유닛의 방향을 EAST로 초기화
}
if(dir==Direction.EAST){ // true반환
x++;
} else if (dir>Direction.WEST) {} // error. 열거형 상수에 비교연산자 사용 불가
// dir은 east라 정수값이 0, west는 2
} else if (dir.compareTo(Direction.WEST)>0 {} // compareTo()는 가능
// compareTo()는 0,양수,음수를 반환하므로 반환값을 비교연산자와 대조함
열거형의 조상 - java.lang.Enum
: 모든 열거형의 조상.
: 모든 열거형은 이 클래스의 메서드를 상속받음
: values(), valueOf()는 컴파일러가 자동으로 추가
static E [ ] values() //열거형 상수가 가지고 있는 값을 배열로 반환
static E valueOf(String name)
Direction [] dArr = Direction.values();
for (Direction d : dArr)// for (Direction d : Direction.values())
System.out.printlnf("%s=%d%n", d.name(), d.ordinal()); //이름과 정의된 순서 반환. 상수가 가진 값과는 무관
Direction d = Direction.valueOf("WEST"); //문자열로 열거형 상수 Direction.WEST를 반환 가능
열거형에 멤버 추가하기
: 불연속적인 열거형 상수의 경우 원하는 값을 (괄호)안에 적는다.
: (괄호)를 사용하려면, 인스턴스 변수와 생성자를 새로 추가해줘야한다.
: 열거형의 생성자는 묵시적으로 private이므로, 외부에서 객체생성 불가
'🔥 Vamos > Java' 카테고리의 다른 글
1110 | 자바의 정석 기초편 :: ch12-29~12-37 (1) | 2022.11.10 |
---|---|
1110 | 자바의 정석 기초편 :: ch12-23~12-28 (1) | 2022.11.10 |
1108 | 자바의 정석 기초편 :: ch12-9~12-14 (1) | 2022.11.08 |
1108 | 자바의 정석 기초편 :: ch12-4~12-8 (1) | 2022.11.08 |
1107 | 자바의 정석 기초편 :: ch11-52~11-56 (0) | 2022.11.07 |