Day 58

ChangWoo·2023년 6월 2일
0

자바의 정석

목록 보기
55/71
post-thumbnail

ch 12-9~11 제한된 지네릭 클래스, 지네릭스의 제약

제한된 지네릭 클래스

  • extends로 대입할 수 있는 타입을 제한
class FruitBox<T extends Fruit> { // Fruit의 자손만 타입으로 지정가능
	ArrayList<T> list = new ArrayList<T>();
    ...
}
FrutiBox<Apple> appleBox = new FruitBox<Apple>(); // OK.
FruitBox<Toy> toyBox = new FrutiBox<Toy>(); // 에러. Toy는 Fruit의 자손이 아님
  • 인터페이스인 경우에도 extends를 사용
interface Eatbale {}
class FruitBox<T extends Eatable> { ... }

지네릭스의 제약

  • 타입 변수에 대입은 인스턴스 별로 다르게 가능
Box<Apple> appleBox = new Box<Apple>(); // OK. Apple객체만 저장가능
Box<Grape> grapeBox = new Box<Grape>(); // Ok. Grape객체만 저장가능
  • static멤버에 타입 변수(T) 사용 불가
class Box<T> {
	static T item; // 에러
    static int compare(T t1, T t2) {...} //에러
    ...
  • 배열 생성할 때 타입 변수 사용불가. 타입 변수로 배열 선언은 가능
class Box<T> {
	T[] itemArr; // OK. T타입의 배열을 위한 참조변수
		...
    T[] toArray() {
    	T[] tmpArr = new T[itemArr.length]; // 에러. 지네릭 배열 생성불가
        ...
}
  • new연산자 뒤에 T를 사용할 수 없다.

ch 12-25~28 표준 애너테이션

@Override

  • 오버라이딩을 올바르게 했는지 컴파일러가 체크하게 한다.
  • 오버라이딩할 때 메서드 이름을 잘못 적는 실수를 하는 경우가 많다.
class Parent {
	void parentMethod() { }
}
class Child extends Parent {
	void parentmethod() { } // 오버라이딩하려 했으나 실수로 이름을 잘못 적음
}
  • 오버라이딩할 때는 메서드 선언부 앞에 @Override를 붙이자.
class Child extends Parent {			class child extends Parent
	void parentMethod() { }		-> 			@Override
}											void parentMethod() { }
										}

@Deprecated

  • 앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙인다.
  • @Deprecated의 사용 예, Date클래스의 getDate()
@Deprecated		// 사용권장 X
public int getDate() {
	return normalize().getDayOfMonth();
}
  • Java는 하위 호환성을 생각해서 구버젼을 사용할 수는 있으나, 권장하지 않도록 한다.
  • @Deprecated가 붙은 대상이 사용된 코드를 컴파일하면 나타나는 메시지
Note : AnnotationEx2.java uses or overrides a deprecatd API.
Note : Recompile with -Xlint:deprecation for details.
  • 옵션을 재정의 해서 컴파일 하게 되면 경고에 대한 상세정보가 나오게 된다.

@FunctionallInterface

  • 함수형 인터페이스에 붙이면, 컴파일러가 올바르게 작성했는지 체크
  • 함수형 인터페이스에는 하나의 추상메서드만 가져야 한다는 제약이 있음
@FunctionallInterface
public interface Runnable {
	public abstract void run(); // 추상 메서드
}

@SupperssWarnings

  • 컴파일러의 경고메시지가 나타나지 않게 억제한다.
  • 괄호()안에 억제하고자 하는 경고의 종류를 문자열로 지정
@SupperessWarnings("unchecked")	   // 지네릭스와 관련된 경고를 억제
ArrayList list  = new ArrayList(); // 지네릭 타입을 지정하지 않았음.
list.add(obj); 					   // 여기서 경고가 발생
  • 둘 이상의 경고를 동시에 억제하려면 다음과 같이 한다.
@SupressWarnings({"deprecation", "unchecked", "varargs"})
  • '-Xlint'옵션으로 컴파일하면, 경고메시지를 확인할 수 있다. 괄호[] 안이 경고의 종류. 아래의 경우 rawtypes
profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글