목록분류 전체보기 (45)
일상기록

열거형이란 열거형은 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용하다. 원제 자바는 C언어와 달리 열거형이라는 것이 존재하지 않았으나 JDK1.5부터 새로 추가되었다. 자바의 열거형은 C언어의 열거형보다 더 향상된 것으로 열거형이 갖는 값뿐만 아니라 타입도 관리하기 때문에 논리적인 오류를 줄일 수 있다. // 기존 클래스 class Card { // 카드 무늬 static final int CLOVER = 0; static final int HEART = 0; static final int DIAMOND = 0; static final int SPADE = 0; // 카드 숫자 static final int TWO = 0; static final int THREE..
제네릭 타입의 제거 컴파일러는 제네릭 타입을 이용해서 소스파일을 체크하고, 필요한 곳에 형변환을 넣어준다. 그후 제네릭 타입을 제거한다. 즉, 컴파일된 파일(*.class)에는 제네릭 타입에 대한 정보가 없다. 이렇게 하는 주된 이유는 제네릭이 도입되기 이전의 소스 코드와의 호환성을 유지하기 위해서이다. JDK1.5부터 제네릭이 도입되었지만, 아직도 원시 타입을 사용해서 코드를 작성하는 것을 허용한다. 하지만 앞으로 가능하면 원시 타입을 사용하지 않도록 하자. 언젠가는 분명히 새로운 기능을 위해 하위 호환성을 포기하게 될 때가 올 것이다. 제네릭 타입의 제거 과정은 꽤 복잡하기 때문에 자세히 설명하기는 어렵다 기본적인 제거과정에 대해 알아보자. 1. 제네릭 타입의 경계(bound)를 제거한다. 제네릭 타..
제네릭 타입의 형변환 제네릭 타입과 원시 타입(raw type)간의 형변환이 가능할까? 아래 코드를 보면 Box box = null; Box objBox = null; box = (Box)objBox; // OK 제네릭 타입 → 원시 타입(안쓰는게 바람직) 경고발생 objBox = (Box)box; // OK 원시 타입(안쓰는게 바람직) → 제네릭 타입 경고발생 코드를 보면 알 수 있듯이, 제네릭 탕비과 논제네릭(non-generic) 타입간의 형변환은 항상 가능하다. 다만 경고가 발생할 뿐이다. 그렇다면 대입된 타입이 다른 제네릭 타입 간에 형변환은 가능할까? Box srtBox = null; Box objBox = null; srtBox = (Box)objBox; // 에러 Box → Box objB..
제네릭 메소드 메소드의 선언부에 제네릭 타입이 선언된 메소드를 제네릭 메소드라 한다. static void sort(List list, Comparator
와일드 카드 하나의 참조 변수로 대입된 타입이 다른 객체 참조가능하다. 매개변수에 과일박스를 대입하면 주스를 만들어서 반환하는 Juicer라는 클래스가 있고, 이 클래스에는 과일을 주스로 만들어서 반환하는 makeJuice()라는 메소드가 다음과 같이 정의 되어 있다고 가정하자. class Juicer{ static Juicer makeJuice(FruitBox box){ // 으로 지정 String tmp = ""; for(Fruit f : box.getList()){ tmp += f + " "; } return new Juice(tmp); } } Juicer클래스는 제네릭 클래스가 아닌데다, 제네릭 클래스라고 해도 static메소드에는 타입 매개변수 T를 매개변수에 사용할 수 없으므로 아예 제네릭을 ..

제네릭(Generic)이란 컴파일시 타입을 체크해주는 기능(Compile-time type check) - JDK1.5 객체타입의 안정성을 높이고(타입 체크를 정확히 할 수 있다.)형변환의 번거로움을 줄여준다. ArrayList list = new ArrayList(); list.add(new Tv()); // OK list.add(new Audio()); // 에러 Tv타입 이외 다른 타입 저장 불가 런타임 에러를 컴파일 타임으로 가져오는 역활도 한다. 제네릭의 장점 1. 타입의 안정성을 제공한다. (classcastException 방지) 2. 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해진다. 클래스 작성시 Object(일반클래스)타입 대신 타입 변수E(제네릭클래스)를 선언해서 사용 JDK1..