제네릭
Generic
- Java는 강타입 언어로 모든 변수와 메서드의 리턴값은 타입을 가짐
- 제네릭(generic): 클래스에서 사용할 타입을 바꿀 수 있게 하는 기능. 처음부터 타입을 지정하지 않고 클래스의 인스턴스를 생성하거나 인스턴스를 구현할 때 메서드에서 사용할 매개변수의 타입과 리턴 타입을 지정
- 제네릭은 하나의 값이 여러 다른 타입을 가질 수 있게 함
- 타입 매개변수<T>는 제네릭을 이용하는 클래스나 인터페이스를 인스턴스할 때 개발자가 지정하는 타입을 받는 특수한 매개변수. 타입 매개변수를 통해 전달받은 타입을 인터페이스나 클래스 메서드에서 사용. 주로 <T>와 같은 형태로 사용
- 내장 인터페이스와 클래스에서 제네릭 사용: List와 Map
+) 컬렉션 인터페이스는 Java에서 묶음을 다룰 때 사용하는 인터페이스 중 기본이 되는 것
- 일반적으로 사용하는 타입 매개 변수
일반적으로 사용하는 타입 매개 변수
타입 매개변수 | 설명 |
<T> | 타입 매개변수의 일반적인 표현. Type의 약자로 어떤 타입이든 사용 |
<E> | Element의 약자로 컬렉션 클래스에서 요소 타입을 나타내는데 사용 |
<K,V> | Key와 Value의 약자로 Map과 관련된 타입을 나타내는데 사용. K는 맵의 key, V는 value의 타입을 나타냄 |
<N> |
Number의 약자로 숫자 타입을 나타내는데 사용 |
<R> | Result의 약자로 메서드의 반환 타입을 나타냄 |
<A> | Array의 약자로 배열 타입을 나타냄 |
제네릭 선언
접근제어자 class GenericClassName<type> {
}
접근제어자 interface GenericInterfaceName<type> {
}
접근제어자 class GenericClassName<type1, type2, ...> {
}
접근제어자 interface GenericInterfaceName<type1, type2, ...> {
}
인터페이스에 제네릭 적용
public interface GenericInterface<T> { // 제네릭 인터페이스 선언
T method(T param1, ...);
}
public class ClassName implements GenericInterface<type> { // 제네릭 인터페이스 구현
@Override
public type method(type param1, ...) {
return value;
}
}
public interface GenericInterface<T,S> { // 제네릭 인터페이스 선언
T method(T param1, S param2, ...);
}
public class ClassName implements GenericInterface<type1, type2> { // 제네릭 인터페이스 구현
@Override
public type1 method(type1 param1, type2 param1 ...) {
return value;
}
}
클래스에 제네릭 적용
public class ClassName<T> {
type T memVar;
public type method(T param1, ...) {
this.memVar = param1;
}
}
ClassName<type> className = new ClassName<>();
className.method(arg1, ...);
제네릭 인터페이스 예시
public interface Calculator<T> {
T calculate(T x, T y);
}
public class FloatCalculator implements Calculator<Float> {
@Override
public Float calculate(Float x, Float y) {
return (float) x + y;
}
}
public class IntegerCalculator implements Calculator<Integer> {
@Override
public Integer calculate(Integer x, Integer y) {
return (int) x + y;
}
}
public class CalculatorTest {
public static void main(String[] args) {
Calculator<Float> cf = new FloatCalculator();
float fResult = cf.calculate(5.0f, 3.0f);
System.out.println(fResult);
Calculator<Integer> if = new IntegerCalculator();
int fResult = if.calculate(5, 3);
System.out.println(iResult);
}
}
제네릭 클래스 예시
public class
Enum
Enum
- enum은 열거 타입(enumeration type)을 나타내는 특별한 유형의 클래스. 가독성 있게 작성하는데 사용
- enum은 상수의 집합을 표현
- enum은 클래스 선언시 맨 앞글자를 대문자로 표기하고 타입을 지정하지 않고 각 타입의 값을 대문자로 작성
- 열거 타입은 선언 후 인스턴스화시키지 않고 바로 사용 가능. 주로 역할을 지정할 때 사용
enum 선언 및 접근
접근제어자 enum EnumName {
CONSTVARNAME1, ...
}
EnumName.CONSTVARNAME1;
enum의 상수에 값 지정
접근제어자 enum EnumName {
CONSTVARNAME1(value1), ...; // 세미콜론(;) 필수
private final type var;
EnumName(type param1) {
this.var = param1;
}
public type getValue() {
return var;
}
}
switch 표현식에 enum 사용
EnumName e = EnumName.A;
type varName = switch (e) {
case A -> 1;
case B -> 2;
case C -> 3;
};
enum 예시
public enum Days {
MON, TUE, WED, THU, FRI, SAT, SUN
}
public static DaysTest {
public static void main(String[] args) {
System.out.println(Days.MON);
}
}
enum 상수값 예시
public enum Levels {
ONE(1), TWO(2), THREE(3), FOUR(4);
private final int value;
Levels(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
public class LevelsTest {
public static void main(String[] args) {
System.out.println(Levels.THREE.getValue());
}
}
'Java(17+) 문법 > Java 기본' 카테고리의 다른 글
[Java] 람다표현식 (0) | 2025.01.22 |
---|---|
[Java] 예외처리 (0) | 2025.01.22 |
[Java] 클래스 - 생성자/상속/추상클래스 (0) | 2025.01.21 |
[Java] 클래스 - 메서드 (0) | 2025.01.21 |
[Java] 제어문 (0) | 2025.01.21 |