코딩이란 무엇일까

[Java/자바]제네릭(Generic) 본문

Java

[Java/자바]제네릭(Generic)

둥구는 지굴다 2022. 10. 12. 18:38

안녕하세요 오늘은 제네릭에 대해 간단하게 알아볼게요!

제네릭(Generic)이란?

우선 제네릭은 몇 번 들어본 분도 계시고 처음 들어보시는 분도 계실 거예요

제네릭은 직역하면 '일반적인'이라는 뜻입니다. 도대체 뭘 일반적으로 만드는 걸까요?!

부연 설명을 하자면 제네릭은 클래스 내부에서 타입을 지정해주는 게 아닌 사용자가 호출한 곳에서 타입을 지정해주는 것입니다!!

제네릭의 사용방법

클래스 명 뒤에 <E>, <K>, <V>와 같은 형식으로 사용합니다.

단, < > 안에 구현 시는 알파벳, 사용 시는 클래스만 들어갈 수 있다.

 

제네릭 사용 구간

1) 제네릭 클래스 : 클래스 뒤에 제네릭 기법 사용

class A<T> //클래스명 뒤에 < > 제네릭 타입 명시

2) 제네릭 메서드 : 메서드의 반환 타입 전에 제네릭 기법 사용

public <T> void typeSearch(T x) //반환타입 즉, void 전에 제네릭 타입 명시

 

제네릭 타입 매개변수

제네릭 타입의 매개변수는 관례적으로는 알파벳 하나를 사용해서 표기합니다.

살짝 암묵적인 룰입니다. <T>가 굳이 아닌 < TYPE >로 작성해도 문제는 없습니다.

타입 분류 타입인자
<T> 참조 타입을 지정
<E> 배열이나 여러 요소들의 타입을 지정합니다.
<K> 키 타입 지정 시 사용합니다.
<V> 값 타입 지정 시 사용합니다.

제네릭 메서드 사용 예시

클래스 안의 메서드에 제네릭 메서드 사용하기

class Value{
	//제네릭 메서드 생성
	public <T> void typeSearch(T x) { //제네릭 메서드 사용 부분
		if(x instanceof Integer) {
			System.out.println(x+"는 정수입니다.");
		}
		else if(x instanceof Double || x instanceof Float) {
			System.out.println(x+"는 실수입니다.");
		}
		else if(x instanceof Character) {
			System.out.println(x+"는 문자형입니다.");
		}
		else if(x instanceof String) {
			System.out.println(x+"는 문자열 입니다.");
		}
		else if(x instanceof Boolean) {
			System.out.println(x+"는 논리형 입니다.");
		}
	}
}
```

Value라는 클래스 안에 typeSearch라는 제네릭 메서드를 만들어줬습니다.

여기서 보시면 반환 타입인 void전에 <T>가 있는 것을 볼 수 있고 메서드의 매개변수를 넣는 괄호 안에

T x가 있는 것을 볼 수 있습니다. 자 따라서 이 메서드는 타입은 지정되어 있지 않고 사용자가 메서드를 호출할 때 이 메서드의 매개변수의 타입을 지정해 주어 여러 가지 타입의 매개변수를 사용할 수 있는 것입니다.

밑에 메서드의 내용은 여러 가지 매개변수가 들어갔을 때 instanceOf를 사용해서 객체의 타입을 구분하여 타입별로 출력문을 출력해주네요.

메인 메서드

public class Generic1 {

	public static void main(String[] args) {
		Value v = new Value();
		v.<Integer>typeSearch(3); //< >를 열어 타입을 명시 해줌
		v.typeSearch(3.14); // < > 타입을 명시 안해도 오류 X
		v.typeSearch('a');
		v.typeSearch("Hello");
		v.typeSearch(true);
	}
	

}
```

이제 Value클래스의 객체를 만든 뒤 클래스의 메서드를 호출하여 여러 타입의 값을 넣어주었습니다.

주석에도 설명되어있지만 v. <타입>을 넣어주어 타입을 명시해 주어도 되지만 매개변수의 값에 따라 알아서 타입을 정해주기 때문에 타입을 명시해 주지 않아도 오류는 나지 않습니다.

여기서 타입을 명시할 때 주의하셔야 할 점은 참조 타입밖에 오지 못합니다.
      즉, int , float, double과 같이 원시 타입은 오지 못하는 것입니다.

출력 결과

타입별로 실행문이 잘 실행된 것을 볼 수 있네요.

이렇듯 제네릭을 사용하면 다양한 타입의 변수를 메서드에서 사용할 수 있습니다.!

제네릭 클래스 사용해 보기

제네릭 클래스

//제네릭 클래스 생성
class A<T>{ 
	T x; //T 로 변수 생성
	T y;
}

메인 메서드

public class GenericClass {

	public static void main(String[] args) {
		A<Integer> a1= new A();
		a1.x=20; //a1은 Integer
		a1.y=20;
		System.out.println(a1.x+a1.y);
		
		A<String> a2= new A(); //문자형 객체 생성
		a2.x="20";
		a2.y="20";
		System.out.println(a2.x+a2.y);
		
	}

}

객체를 생성할 때 <Integer>로 객체의 타입을 명시해 주었습니다.

그럼 클래스의 필드 값인 T x와 T y는 정수형 타입이 들어갈 수 있겠죠

그리고 덧셈을 해주었습니다.

그 밑으로 <String>을 사용하여 String타입인 객체를 생성해 주었습니다.

a2객체 또한 값을 넣은 뒤 덧셈을 해주어봤습니다. 

결과를 보시죠

출력 결과

첫번 째 40이라는 값은 정수형 타입이기 때문에 20+20은 40이 나오지만

두 번째 객체 즉, a2객체는 String타입이기 때문에 문자열을 이어줍니다.

따라서 2020이라는 값이 나오는 것이지요


자 이상으로 오늘은 제네릭에 대해 알아보았는데요.

이상으로 글 마치겠습니다.

글 읽어주셔서 감사합니다.

Comments