본문 바로가기
JAVA/JAVA의 정석

Ch.12 제네릭스

by leek94 2023. 1. 31.

7~8 Iterator<E>, HashMap<K,V>

 

 

이터레이터 지네릭스로 사용하여 형변환 안해도됨

 

형변환이 필요 없어서 줄여서 쓸수 있음

 

해쉬맵의 경우 ,(콤마)를 사용해서 타입을 적어줌

K와 V의 타입이 달라도 상관없음 양쪽만 맞춰 주면 됨

 

<String,Student>를 넣으면 밑에 처럼 넣어짐 형변환 불필요

 

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

 

 

어떤 타입의 자손만 지네릭스로 대입이 가능하게 하려면 extends로 조상을 적어주면된다

인터페이스도 마찬가지로 extends 조상을 적어주면 된다.(주의 - implements 아님)

 

여러개의 조상을 참조할때는 &로 하면됨 ,(콤마)는 안됨

 

Box에서는 제한 조건없어서 Toy 사용 가능, But fruitBox에서는 제한조건 때문에 Toy 사용 불가

 

지네릭스는 인스턴스 별로 다르게 선언이 가능하다.그러나 static의 경우 인스턴스의 공통된 것을 static으로 선언하기 때문에 지네릭스 사용 불가

또한, 배열 생성과 객체 생성에서 (new T 와 같이) 사용 불가

 

12~14 와일드카드, 지네릭 메서드와 예제

 

 

와일드 카드 지네릭스

<? extends T> 는 자기 자신과 그 자손들

<? super T> 는 자기 자신과 그 조상들

<?>는 제한 없음 자기 자신과 조상과 자손들 < ? extends Object> 모두 가능

 

매개변수로 와일드 카드를 사용하면 Fruit apple 다들어 올수 있음

그러나 와일드 카드를 사용하지 않으면 Fruit만 가능

-> 왜냐면 생성자 타입과 매개 변수 타입을 맞춰야 하기때문에

 

와일드 카드로 Fruit Grape Apple 다 가능

 

와일드 카드 예

 

메서드 타입도 지네릭으로 선언가능하다

 

 

지네릭 메서드 는 호출할때마다 타입 대입 <-> 와일드카드는 하나의 참조변수로 서로 다른 타입을 대입할 수 있는 것

 

 

15,16 지네릭 타입의 형변환, 지네릭 타입의 제거

 

 

 

원시 타입과 지네릭 타입의 서로 형변환이 가능은 하지만 경고가 뜸

애초에 매개변수 타입과 생성자 타입을 맞춰서 지네릭을 만드는게 좋다

 

오브젝트 타입의 매개변수, 생성자 타입으로의 형변환은 불가

 

와일드 카드로의 형변환은 가능하다. 실제로는 와일드 카드가 자신과 자손이 가능해서 형변환 하지 않아도 가능한 것인데 앞에 와일드 카드가 생략 되어 있는 것이다.

그러하므로 와일드 카드로의 형변환은 가능하다

 

생략 예시

 

생략 가능하다는 예시

 

컴파일러 지네릭 타입을 Object로 변경한다. 한마디로 제거 함

이는 자바에서 하위 호환성을 위해서 사용되는 것이고 C# 에서는 컴파일때 지네릭 타입을 유지한다 이는 성능을 향상을 위해서 그러함.

자바와 C#이 중요시 하는 게 하위 호환성, 성능 둘로 나뉘어서 그러한 것뿐임 상황에 맞게 사용하면된다

지네릭 타입 제거 후에 타입이 불일치하면 형변환을 직접 해줘야 한다

와일드 카드가 포함된 경우에도 형변환을 직접 해줘야함

 

17~20 열거형

 

 

열거형으로 하나 하나 일일히 상수를 만드는 거보다 enum을 이용해서 한번에 열거 가능

C언어에도 열거형이 있으나 값 체크만 가능함

자바에서는 값과 타입까지 체크가 가능해서 더 안전하게 사용 가능

if(Card.CLOVER==Card.TWO) 는 값이 서로 0으로 같아서 True를 반환함 그러나

값은 같지만 타입이 달라서 True를 반환하면 안되는 경우에 문제가 됨

자바에서는 타입까지 체크 가능하여 아래처럼 사용 가능

if(Card.Kind.CLOVER == Card.Value.TWO) 컴파일 에러가 발생

 

열거형은 == compareTo() 사용 가능

비교연산자는 사용 불가 예) <, >와 같은

 

열거형의 조상 으로 네임과 오디널을 사용할 수 있다 각각 이름과 순서를 반환함

values valueOf를 컴파일러가 자동으로 추가해 준다

values()는 열거형 상수의 모든 상수를 배열로 반환해줌 (이름과 순서로)

valueOf는 열거형 상수 이름을 넣으면 열거형 상수로 반환해줌 Direction.WEST 처럼

 

열거형 상수의 세가지 선언 방법

객체일때는 equal() compareTo()를 사용해서 비교해야함 위에 EAST, SOUTH, WEST, NORTH가 객체 이므로 사용해야함

 

switch case 문에서

case EAST로 적어야함 그냥 문법임 왜그런지 따지지 말자

case direction.EAST 로 적으면 안된다는 말

 

Direction[] dArr = Direction.values(); // 열거형의 모든 상수를 배열로 반환

이름과 순서를로 배열이 만들어짐 (ordinal은 상수의 순서지 상수의 값과는 무관함)

 

 

21,22 열거형에 멤버 추가하기

 

 

열거형에 값을 주려면 EAST(1) 처럼 () 안에 숫자를 주면됨 하지만 ,(콤마)를 이용해 여러개도 가능함

그리고 숫자를 넣어 주려면 IV 인스턴스 변수와 생성자를 꼭 만들어 줘야함

생서자는 앞에 Private가 생략되어 있는 거라 밖에서 부르는게 안됨

 

아까 ordinal은 순서, 현재 getValue는 들어가 있는 값

 

 

23,24 애너테이션

 

 

예전에는 소스코드에 대한 문서로 변수, 메서드 등을 설명했었다. 그런데 업데이트 된 내용을 바빠서 문서로 업데이트 못하는 일이 많아져서 (저장불일치) 자바 독에서 추출하여 문서를 작성하게 되었다.

설정에 대한 정보도 애너테이션을 붙이면서 프로그램에 대한 정보를 얻을 수 있게 되었음

 

25~28표준애너테이션

 

@Override 오버라이딩 애너테이션

오버라이딩 하는 곳에 써주면 소문자나 글자 실수를 확인 있다.

 

 

 

@Deprecated 디프리케이티드 애너테이션

사용 권장 안함 애너테이션 하위 호환성을 위해서 남겨는 두지만 사용하지말라는

에러는 안나지만 경고 메시지 나옴

 

 

 

 

디프리케이티드 예제

 

 

 

@Functuionllnterface 하나의 추상메서드만 가져야하는 곳에 쓰면 컴파일러가 확인해줌

안써도 상관없는 애너테이션임

 

 

 

@SuppressWarings 애너테이션 발생하는 경고를 발생하지 않게 하는 애너테이션

발생하는 경고가 무엇인지 알고 있다고 체크하는 것임

 

 

29~33 메타애너테이션

 

 

 

 

 

자바독에 포함 시키는 애너테이션

애너테이션도 상속가능 안씀

 

 

 

 

34~37애너테이션 타입 정의,요소

 

애너테이션은 추상메서드로 정의하며 순서는 상관없다

값을 넣어서 호출도 가능 anno.count() --> 3

 

 

 

디폴트 값있으면 생략가능

요소가 하나이고 이름이 value이면 이름 생략가능

배열일 경우 괄호{}를 써야한다 하나일때는 생략 가능

 

 

 

 

Annotation 애너테이션의 최고 조상이고 추상메서드 구현하지않고도 사용 가능

 

 

마커 애너테이션은 요소가 하나도 정의되지 않은 애너테이션

정의된 요소가 없음

 

 

애너테이션 요소의 규칙

 

 

 

애너테이션 예제

 

 

 

'JAVA > JAVA의 정석' 카테고리의 다른 글

스트림 1  (0) 2023.02.17
Ch.14 람다식  (0) 2023.02.08