지네릭 형변환

: 지네릭 타입과 원시타입간 형변환은 바람직하지 않음.(경고 발생)

: 지네릭 타입끼리도 타입이 맞지 않으면 형변환 불가

 

: 와일드 카드가 사용된 지네릭 타입으로는 형변환 가능

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 

모두 숫자를 부여할 수 없으므로 kind라는 열거형, value라는 열거형 두개를 선언. 내부값은 모두 상수

 

 

열거형의 정의와 사용

 

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 

: 모든 열거형의 조상.

: 모든 열거형은 이 클래스의 메서드를 상속받음

첫번째 class반환은 잘 안씀

: 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이므로, 외부에서 객체생성 불가

열거형의 생성자는 항상 private이라 생략됨

 

 

 

 

+ Recent posts