: 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법
클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것
=> 특정한 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반 타입.
- 장점
- 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지 가능
- 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다=> 관리하기 편함 ㅎ
- 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.
- 사용방법
보통 사용하는 타입명.
암묵적인 규칙일 뿐 다른 걸로 써줘도 무방
- 클래스 및 인터페이스 선언
public class ClassName <T> {
...
}
public Interface InterfaceName <T> {
...
}
제네릭 타입의 클래스나 인터페이스의 경우 위와같이 선언한다.T 타입은 해당 블럭 { ... } 안에서까지 유효
- 제네릭 타입이 2개인 경우
public class ClassName <T, K> { ... }
public Interface InterfaceName <T, K> { ... }
// HashMap의 경우 아래와 같이 선언되어있을 것이다.
public class HashMap <K, V> { ... }
public class ClassName <T, K> { ... }
public class Main {
public static void main(String[] args) {
ClassName<String, Integer> a = new ClassName<String, Integer>();
}
}
T는 String이 되고, K는 Integer가 된다.
❗주의❗
타입 파라미터로 명시할 수 있는 것은 참조 타입(Reference Type)밖에 올 수 없다.
즉, int, double, char 같은 primitive type은 올 수 없다는 것.
그래서 int형 double형 등 primitive Type의 경우 Integer, Double 같은 Wrapper Type으로 쓰는 이유가 바로 위와같은 이유
나머지 세부내용은 나중에 수정하기!
<?> (와일드 카드 : Wild Card)
마지막으로 와일드 카드다.
이 와일드 카드 <?> 은 <? extends Object> 와 마찬가지라고 했다. Object는 자바에서의 모든 API 및 사용자 클래스의 최상위 타입이다. 한마디로 다음과 같은 의미나 마찬가지다.
|
public class ClassName { ... } |
|
public class ClassName extends Object { ... } |
우리가 public class ClassName extends Object {} 를 묵시적으로 상속받는 것이나 다름이 없다.
한마디로 <?>은 무엇이냐. 어떤 타입이든 상관 없다는 의미다. 당신이 String을 받던 어떤 타입을 리턴 받던 알빠 아니라는 조금 과격한 얘기..
이는 보통 데이터가 아닌 '기능'의 사용에만 관심이 있는 경우에 <?>로 사용할 수 있다.
'☕JAVA > 🔎 공부 [JAVA]' 카테고리의 다른 글
[JAVA] BigDecimal 과 사칙연산 (0) | 2022.09.14 |
---|---|
[JAVA] List 중복 제거 (0) | 2022.09.01 |
[JAVA] Map, HashMap (0) | 2022.08.24 |
[JAVA] 기초 - 다시 정리하는 기본 개념 (0) | 2022.08.18 |
[JAVA] objects.equals() 정리 (0) | 2022.08.17 |