728x90
1️⃣지네릭스(Generics)
1.1 지네릭스란?
- 컴파일 시 타입체크를 해주는 기능 => 타입의 안정성을 제공하고 코드가 간결해짐(형 변환 오류 방지)
1.2 지네릭 클래스 선언
class Box<T>{ //T는 타입변수
T item;
void setItem(T item){this.item=item;}
T getItem(){return Item;}
}
- static멤버에 타입변수 T는 사용할 수 X => T를 인스턴스 변수로 간주하기 때문
1.3 지네릭 클래스의 객체 생성과 사용
- 참조변수와 생성자에 대입된 타입이 일치 해야함
Box<Apple> appleBox =new Box<Apple>(); // OK
Box<Apple> appleBox =new Box<Grape>(); // 에러
- 두 지네릭 클래스의 타입이 상속관계 일시는 가능
Box<Apple> appleBox =new FruitBox<Apple>(); //FruitBox는 Box의 자손일때 OK
예시)
더보기
import java.util.*;
class Fruit{ public String toString(){return "fruit";}}
class Apple extends Fruit{ public String toString(){return "apple";}} //Fruit자손
class Grape extends Fruit{ public String toString(){return "grape";}} //Fruit자손
class Toy{ public String toString(){return "toy";}}
public class Main {
public static void main(String[] args) {
Box<Fruit> fruitBox =new Box<>();
Box<Apple> appleBox =new Box<>();
Box<Grape> grapeBox =new Box<>();
Box<Toy> toyBox =new Box<>();
fruitBox.add(new Fruit());
fruitBox.add(new Apple()); // Apple은 Fruit의 자손이기 때문에 메서드의 매개변수가 될 수 있다.
appleBox.add(new Apple());
toyBox.add(new Toy());
System.out.println(fruitBox);
System.out.println(appleBox);
System.out.println(toyBox);
}
}
class Box<T>{
ArrayList<T> list =new ArrayList<>();
void add(T item){
list.add(item);
}
public String toSTring(){
return list.toString();
}
}
1.4 제한된 지네릭 클래스
- extends를 사용하여 특정 타입의 자속들만 대입 가능
- 인터페이스 구현 제약이 있을 시에도 extends를 사용해야함
- 2개이상 구현 시 '&' 사용
예시)
더보기
import java.util.*;
class Fruit implements Eatable{ public String toString(){return "fruit";}}
class Apple extends Fruit{ public String toString(){return "apple";}} //Fruit자손
class Grape extends Fruit{ public String toString(){return "grape";}} //Fruit자손
class Toy{ public String toString(){return "toy";}}
interface Eatable{}
public class Main {
public static void main(String[] args) {
FruitBox<Fruit> fruitBox =new FruitBox<>();
FruitBox<Apple> appleBox =new FruitBox<>();
FruitBox<Grape> grapeBox =new FruitBox<>();
fruitBox.add(new Fruit());
fruitBox.add(new Apple());
fruitBox.add(new Grape());
appleBox.add(new Apple());
System.out.println(fruitBox);
System.out.println(appleBox);
System.out.println(grapeBox);
}
}
class FruitBox<T extends Fruit & Eatable> extends Box<T>{} //Fruit자손과 Eatable인터페이스만 대입 가능
class Box<T>{
ArrayList<T> list =new ArrayList<>();
void add(T item){
list.add(item);
}
public String toSTring(){
return list.toString();
}
}
1.6 지네릭 메서드
1.7 지네릭 타입의 형변환
1.8 지네릭 타입의 제거
2️⃣열거형(enums)
2.1 열거형이란?
- 서로 관련된 상수를 편리하게 선언 => 값뿐만이 아닌 타입까지 관리 하기때문에 '타입에 안전한 열거형'
class Card{
enum Kind{CLOVER, HEART, SPADE};
enum Value{TWO, THREE, FOUR};
final Kind kind;
final Value value;
}
2.2 열거형의 정의와 사용
- 열거형 이름.상수명
- 비교시 '==' , compareTo() 을 사용 ('>', '<' 는 사용 불가능)
- compareTo() : 같으면 0, 왼쪽이 더 크면 양수, 오른쪽이 더 크면 음수를 반환
2.3 열거형에 멤버 추가하기
2.4 열거형의 이해
3️⃣애너테이션(annotation)
3.1 애너테이션이란?
- 주석처럼 언어에 영향을 미치지 않고 다른 프로그램에 유용한 정보를 제공
- '@', '/**/' 과 같은 주석 사용하여 설명 추가
3.2 표준 애너테이션
- @Override : 조상의 메서드를 오버라이딩하는 것
- @Deprecated : 더 이상 사용되지 않는 메서드나 필드
- @Functionallinterface : 함수형 인터페이스 선언 시 확인
3.3 메타 애너테이션
- 애너테이션의 적용대상이나 유지기간을 지정할 때 사용
- @Target : 적용가능한 대상을 지정
- @REtention : 유지기간 지정
- @Documented : 애너테이션 정보 javadoc에 저장
- @Inherited : 자손 클래스에 상속
- @Native : 참조되는 상수 필드
728x90
'자바' 카테고리의 다른 글
[자바의 정석] - 15. 입출력 I/O (0) | 2023.05.30 |
---|---|
[자바의 정석] - 11. 컬렉션 프레임 (0) | 2023.05.15 |
[자바의 정석] - 8. 예외처리 (1) | 2023.05.08 |
[자바의 정석 ] - 7장. 객체지향 프로그래밍Ⅱ (0) | 2023.04.25 |
[자바의 정석] - 5. 배열 / 6. 객체지향 (0) | 2023.04.19 |