자바에서 스프링부트의 라이브러리들에서 자주보이는 문법.
일단 한 자 한 자 해석해보자면
<> 는
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;
}
'JAVA' 카테고리의 다른 글
이미지에서 text추출.(Tesseract with JAVA) (0) | 2024.04.16 |
---|---|
java 설치, 환경변수 설정 이유와 방법. (0) | 2024.03.25 |