JAVA

<? extends 클래스>

emilyyoo 2022. 5. 17. 14:39
728x90

 

자바에서 스프링부트의 라이브러리들에서 자주보이는 문법. 

 

일단 한 자 한 자 해석해보자면 

 

<> 는

collection(ex : 리스트, 맵, 큐, 스택 같은 형태의 클래스) 에

어떤 레퍼런스 타입(ex: class, interface, enum, Array)을 담을 것인지 명시한 것이다. 

 

? 는 아무거나 올 수 있다는 것이고.

 

즉,

collection<?> 는 class에 ? 아무거나 담을 수 있다는 뜻이다. 

 

 

여기에 아래와 같이 

 

<? extends 클래스> 처럼 하는 이유는 아무거나는 들어가지만 타입을 부모클래스로 묶어준것 같은 것이다.

보통 이럴 때 부모클래스를 추상클래스로 하고 속성과 메소드를 ? 의 타입이 물려받게 해서

타입을 어거지로 맞춰주는 것이다. 

 

물론 ? 여기에 올 타입은 당연히 부모클래스를 상속받고 있거나 부모클래스 그 자체여야 한다. 

 

그렇게 하지않으면 아무거나 담을 때 아래처럼 타입이 맞지 않는 오류가 난다.

 

예제1)  ResponsDto<T> 클래스가 있다고 할 때. 그 클래스에 다른 레퍼런스 타입을 담고

 

각 객체의 데이터를 꺼낼 때 아래 처럼 오류가 난다.  

 

 

그럴때 타입을 맞춰줄 추상 클래스를 만들어 상속해준다. 

타입을 맞춰출 부모클래스

 

 

 

위 이미지 처럼 UserCreateReq 클래스에서도 UserMapping 추상클래스를 상속해주고 매서드를 만들어 주면 된다. (물론 실제개발할 때는 매서드 안에 로직을 채워  유효한  값이 return 되도록 한다. 지금은 논외이므로 생략.)

 

 

 

 

예제2 ) 아래와 같은 생성자를 호출하려면.

public static UsernamePasswordAuthenticationToken authenticated(Object principal, Object credentials,
       Collection<? extends GrantedAuthority> authorities) {
    return new UsernamePasswordAuthenticationToken(principal, credentials, authorities);
}

 

 

Authentication authentication = new UsernamePasswordAuthenticationToken(loginUser, null,
        loginUser.getAuthorities()); 
public Collection<? extends GrantedAuthority> getAuthorities() {
    Collection<GrantedAuthority> authorities = new ArrayList<>();
    authorities.add(() -> "ROLE_" + user.getRole());
    return authorities;
}

 

728x90

'JAVA' 카테고리의 다른 글

이미지에서 text추출.(Tesseract with JAVA)  (0) 2024.04.16
java 설치, 환경변수 설정 이유와 방법.  (0) 2024.03.25