☕JAVA/🔎 공부 [JAVA]

[JAVA] 제네릭 Generic

디카페인라떼 2022. 8. 26. 15:46

참고 블로그

 

: 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법

클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것

=> 특정한 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반 타입.

 

 

  • 장점

 -  잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지 가능

 -  클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다=> 관리하기 편함 ㅎ

 -  비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.

 

  • 사용방법

 

보통 사용하는 타입명. 

암묵적인 규칙일 뿐 다른 걸로 써줘도 무방

 

 

 

 

 

 

 

 

 

  • 클래스 및 인터페이스 선언
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