Java/객체지향

[객체지향][제네릭스] - 24. 제니릭스란?

얄루몬 2022. 2. 14. 18:28

https://youtu.be/QcXLiwZPnJQ?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp 

📖본 포스팅은 '자바의 정석 - 남궁성 저자' 님의 책과 유튜브 강의를 보고 작성되었습니다.


[제네릭스란?]

  • 컴파일시 타입을 체크해주는 기능이다..
  • 형변환 에러가 컴파일 에러로 나타날 수 있게 끌어온 것이 제네릭스다. 
  • 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여준다.(동일 타입만 넣어두기 때문에 형변환이 불필요한 것이다.)

 

[형변환 에러 - 실행 시 발생에러의 경우]

package javajungsuk;

import java.util.ArrayList;

public class GenericTest {

	public static void main(String[] args) {
		
		ArrayList list = new ArrayList<>();
		list.add(10);
		list.add(20);
		list.add("30")
		
		Integer i = (Integer)list.get(2);
		
		System.out.println(list);
		
	}

}
  • 기본적으로 컴파일러에서 형변환 오류를 잡아낼 수 없기 때문에 이는 더 큰 문제를 만들게 된다.
  • 컴파일 오류가 실행 후 오류보다 훨씬 낫기 때문에 이를 해결하기 위해서 제네릭스를 사용하여 형변환 오류를 막는다.

 

[제네릭스를 사용해서 잘못된 부분을 컴파일 오류로 찾아내는 코드]

package javajungsuk;

import java.util.ArrayList;

public class GenericTest {

	public static void main(String[] args) {
		
		ArrayList<Integer> list = new ArrayList<Integer>();
		list.add(10);
		list.add(20);
		list.add("30");
		
		Integer i = (Integer)list.get(2);
		
		System.out.println(list);
		
	}

}
Exception in thread "main" java.lang.Error: 분석되지 않는 컴파일 문제점: ArrayList<Integer> 유형의 메소드 add(Integer)에 인수(String)를 적용할 수 없습니다. at javajungsuk.GenericTest.main(GenericTest.java:12)

이때 컴파일 오류로 어디가 틀렸는지를 알려주기 때문에 훨씬 수월하게 됐다.

 

[형변환 생략 가능한 코드]

package javajungsuk;

import java.util.ArrayList;

public class GenericTest {

	public static void main(String[] args) {
		
		ArrayList<Integer> list = new ArrayList<Integer>();
		list.add(10);
		list.add(20);
		list.add(30);
		
		Integer i = list.get(2);
		
		System.out.println(list);
		
	}

}

이때 제네릭스 형타입에 Object를 넣어주게 되면 모든 타입을 넣어줄 수 있다.

 

 

Array<Object> list = new ArrayList<Object>();//JDK1.5 이후로 이렇게 써줘야 됨

Array list = new ArrayList();  지네릭스 도입 이전엔 이렇게도 씀

 

 

 

 

[제네릭스의 장점]

  1. 타입 안정성을 제공한다.
  2. 타입체크와 형변환을 생략할 수 있어 코드가 간결해진다.