[자바의정석]Java - 제네릭,열거형,어노테이션 #013

박정현·2022년 1월 30일
0

Java

목록 보기
13/16
post-thumbnail

제네릭스 (Generics)

Generics

  • 컴파일시 타입을 체크해주는 기능
    타입 안정성을 제공
  • 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여준다
    타입 체크와 형변환을 생략할 수 있으므로 코드가 간결해 진다

타입 변수

  • 클래스를 작성할 때, Object타입 대신 타입변수(E)를 선언해서 사용

타입 변수에 대입하기

  • 객체를 생성시, 타입 변수(E) 대신 실제 타입을 지정(대입)
	ArrayList<Tv> tvList = new ArrayList<Tv>();

지네릭 타입과 다형성

  • 참조변수와 생성자의 대입된 타입은 일치해야 한다.
  • 제네릭 클래스간의 다형성은 성립(대입된 타입은 일치해야함)
  • 매개변수의 다형성도 성립
  • 제네릭 타입은 같아야한다

Iterator,HashMap 과 제네릭스

Iterator<>

  • 클래스를 작성할때, Object타입 대신 T와 같은 타입변수를 사용

HashMap<K,V,...>

  • 여러 개의 타입 변수가 필요한 경우, 콤마(,)를 구분자로 선언

제한된 제네릭 클래스, 제네릭스의 제약

제한된 제네릭 클래스

  • extends로 대입할 수 있는 타입을 제한
  • FruitBox<.I extends Fruit> 이렇게하면 Fruit의 자손만 저장가능
  • 인터페이스 일때도 extends를 사용한다
  • 두가지 이상 사용할때 extends A & B 로 사용가능 (,)가아니다

제네릭스의 제약

  • 타입 변수에 대입은 인스턴스 별로 다르게 가능
  • static 멤버에 타입 변수 사용불가
  • 배열 생성할 때 타입 변수 사용불가. 타입 변수로 배열 선언은 가능

와일드카드, 제네릭메서드

와일드 카드<.?>

  • 하나의 참조 변수로 대입된 타입이 다른 객체를 참조 가능
  • < ? extends T > 와일드 카드의 상한 제한 T와 그 자손들만 가능
  • < ? super T > 와일드 카드의 하한제한 T와 그 조상들만 가능
  • < ? > 제한 x
  • 하나의 참조변수로 다양한 타입을 사용할수 있게해준다

제네릭 메서드

  • 제네릭 타입이 선언된 메서드(타입 변수는 메서드 내에서만 유효)
  • 클래스의 타입 매개변수< T > 와 메서드의 타입 매개변수 < T > 는 별개
  • 클래스랑 메서드 타입<> 은 달라도된다
  • 메서드를 호출할 때마다 타입을 대입한다(대부분 생략 가능)

와일드카드와 제네릭메서드

  • 와일드카드는 하나의 참조변수로 서로 다른 타입이 대입된 여러
    제네릭 객체를 다루기 위한 것
  • 제네릭 메서드는 메서드를 호출할 때마다 다른 제네릭 타입을 대입할 수 있게 한 것

제네릭 형변환

제네릭 타입의 형변환

  • 제니릭 타입과 원시 타입간의 형변환은 바람직 하지 않다(가능은 하다 )
  • 와일드 카드가 사용된 제네릭 타입으로는 형변환 가능하다

제네릭 타입의 제거

  • 컴파일러는 제네릭 타입을 제거하고, 필요한 곳에 형변환을 넣는다

열거형

  • 관련된 상수들을 같이 묶어 놓은 것. Java는 타입에 안전한 열거형을 제공

열거형을 정의하는 방법

enum 열거형이름{상수명1,상수명2,상수명3};
  • 열거형 타입의 변수를 선언하고 사용하는 방법
  • 열거형 상수의 비교에 ==와 compareTo() 사용가능
    < , >사용불가능

열거형의 조상

  • 모든 열거형은 Enum의 자손이며, 아래의 메서드를 상속받는다

열거형에 멤버 추가하기

  • 불연속적인 열거형 상수의 경우 원하는 값을 괄호() 안에 적는다
  • 괄호를 사용하려면, 인스턴스 변수와 생성자를 새로 추가해 줘야 한다
  • 열거형 생성자는 항상 private 이다 , 외부에서 객체 생성불가
    Driection d = new Direction(1)//불가능.


어노테이션

  • 주석처럼 프로그래밍 언어에 영향을 미치지 않으며 , 유용한 정보를 제공함
  • 예전엔 프로그램에대한 설정을 xml에 작성했다면
    요즘은 어노테이션으로 프로그램에 심는 방법으로 작성한다

어노테이션의 사용예

@Test{ //이 메서드가 테스트 대상임을 프로그램에 알린다
	public void method(){
    ...
    }
}

표준 어노테이션

  • Java에서 제공하는 어노테이션

  • @Override :
    컴파일러에게 오버라이딩하는 메서드라는 것을 알린다
    오버라이딩할 때 메서드이름을 잘못적는 실수 하는 경우가 많다
    오버라이딩 할때 는 메서드 선언부 앞에 @Override 작성하자

  • @Deprecated :
    앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙인다
    @Deprecated의 사용 예 Date클래스 getDate()
    하위호환성 언어이기 때문에
    에러는 아니지만 경고를 보낸다

  • @FunctionalInterface :
    함수형 인터페이스에 붙이면 , 컴파일러가 올바르게 작성했는지 체크해줌
    함수형 인터페이스에는 하나의 추상메서드만 가져야 한다는 제약이 있다

  • @SuppressWarnings :
    컴파일러의 경고메시지가 나타나지 않게 억제한다
    괄호() 안에 억제하고자 하는 경고의 종류를 문자열로 지정
    @SuppressWarnings("deprecation")

메타 어노테이션

  • 어노테이션을 만들기 위해서 사용함

  • 어노테이션을 위한 어노테이션

  • @Target :
    어노테이션을 정의할 때 , 적용대상 지정에 사용
    @Target({적용대상1,적용대상2,적용대상3})

  • @Retention :
    어노테이션의 유지되는 기간을 지정하는데 사용한다
    1.SOURCE 소스파일에만 존재 클래스파일에 존재 x (Ex)@Override
    2.CLASS 클래스파일에 존재 실행시 사용 X, 기본값
    3.RUNTIME 클래스 파일에 존재, 실행시에 사용가능 (Ex)@FunctionalInterface

  • @Documented, @Inherited :
    javadoc으로 작성한 문서에 포함 시키려면 사용한다
    어노테이션을 자손 클래스에 상속하고자 할 때 @Inherited를 붙인다

  • @Repeatable :
    반복해서 붙일 수 있는 어노테이션을 정의할 때 사용
    어노테이션을 여러번 붙일수있음
    @Reapeatable인 @ToDo를 하나로 묶을 컨터에니도 적용해야한다

어노테이션 타입 정의하기

  • 어노테이션을 직접 만들어 사용할 수 있다
	@interface 어노테이션이름{
    	타입 요소이름();
        	...
    }
  • 어노테이션의 메서드는 추상 메서드이며, 어노테이션을 적용할 때 지정
  • 사용할때 요소를 이름과 타입에맞게 작성해서 사용한다

어노테이션의 요소

  • 적용시 값을 지정하지 않으면, 사용될 수 있는 기본값 지정 가능
  • 요소가 하나이고 이름이 value일 때는 요소의 이름 생략가능
  • 요소의 타입이 배열인 경우, 괄호{}를 사용해야 한다

모든 어노테이션의 조상

  • Annotation은 모든 어노테이션의 조상이지만 상속은 불가
  • Annotation은 인터페이스이다

마커 어노테이션 Marker Annotaion

  • 요소가 하나도 정의되지 않은 어노테이션

어노테이션 요소의 규칙

  • 어노테시연의 요소를 선언할 때 아래의 규칙을 반드시 지켜야 한다
  • 요소의 타입은 기본형,String,enum,어노테이션,Class만 허용됨
  • 괄호()안에 매개변수 선언x
  • 예뢰를 선언할 수 없다
  • 요소를 타입 매개변수로 정의할 수 없다
profile
빠샤

0개의 댓글

관련 채용 정보