organize/자바

Java 28

001cloudid 2024. 5. 16. 17:50
728x90

제네릭(지네릭, Generics)

  • 컴파일 시 타입을 체크해주는 기능(compile-time type)
//Tv객체만 저장할 수 있는 ArrayList를 생성		 
		 ArrayList<Tv> tvList = new ArrayList<Tv>();
		 tvList.add(new Tv());
//		 tvList.add(new Audio()); //컴파일 에러. Tv 외 다른 타입 불가

 

package chapter12;

import java.util.ArrayList;

public class Study01Test1 {

	public static void main(String[] args) {
		
		ArrayList list = new ArrayList();
		list.add(10);
		list.add(20);
		list.add("30"); //String 추가
		
//		Integer integer = (Integer)list.get(2); //컴파일 OK(컴파일러 한계)
		
		System.out.println(list); //형변환 에러(실행시 발생하는 에러)

		//수정
		ArrayList<Integer> list1 = new ArrayList<Integer>();
		list1.add(10);
		list1.add(20);
//		list1.add("30"); //String 추가. 컴파일 에러
		list1.add(30); //타입 체크가 강화됨
		
		Integer integer1 = list1.get(2); //형변환 생략 가능
		
		System.out.println(list); 

		
		
	}

}
  • 객체의 타입 안정성을 높임(ClassCastException)
  • 형변환의 번거로움을 줄여줌 → 코드의 간결화
  • 컴파일 에러 > 런타임에러 => 수정 가능하기 때문
	String str1 = null;
    String str2 = ""; //빈문자열
    
    str1.length(); //NullPointException
    str2.length(); //0

 

타입 변수

  • 클래스를 작성할 때, Object 타입 대신 타입 변수(E)를 선언해서 사용
    ※Type(T), E(Element). 타입 변수는 대문자 한글자로 선언

타입 변수에 대입

  • 객체 생성 시, 타입 변ㅅ누(E) 대신 실제 타입(ex Tv)을 지정(대입)
    ex) ArrayList<Tv> tvList = new ArrayList<Tv>();
  • 참조 변수와 생성자에 작성, 참조 변수와 생성자에 작성하는 타입 변수는 일치해야함
  • 타입 변수 대신 실제 타입이 지정되면, 형 변환 생략 가능
		ArrayList<Tv> tvList = new ArrayList<Tv>();
		tvList.add(new Tv());
		Tv t = tvList.get(index); //형변환 불필요

 

package chapter12;

import java.util.ArrayList;

class TvS2T1{
	
}

class AudioS2T1{
	
}

public class Study02Test1 {
	
	public static void main(String[] args) {

		ArrayList<TvS2T1> list = new ArrayList<TvS2T1>(); //Tv 타입의 객체만 저장 가능
		list.add(new TvS2T1());
//		list.add(new AudioS2T1());
		
		TvS2T1 tvS2T1 = list.get(0);
		
	}

}

 

제네릭 용어

  • Box<T>
    제네릭 클래스. 'T의 Box' 또는 'T Box'라고 읽음
  • T
    타입 변수 또는 타입 매개변수.(T는 타입 문자)
  • Box
    원시 타입(raw type). 일반 클래스 -> 제네릭 클래스
  • 제네릭 클래스 선언
    class Box<T>{}
  • 제네릭 타입 호출
    Box<String> b = new Box<String>();
    String 대입된 타입(매개변수화된 타입, parameterized type). 생성할 때마다 바뀔 수 있음

제네릭 타입과 다형성

  • 참조 변수와 생성자의 대입된 타입은 일치해야함
    Array<Tv> list = new ArrayList<Tv>();
    ArrayList<Product> list = new ArrayList<Tv>(); //에러
  • 제네릭 클래스 간의 다형성은 성립(단, 대입된 타입은 일치해야함)
    List <Tv> list = new ArrayList<Tv>(); //ArrayList가 List를 구현(다형성)
    List<Tv> list = new LinkedList<Tv>(); //LinkedList가 List를 구현(다형성) 
  • 매개변수의 다형성도 성립
    ArrayList<Product> list = new ArrayList<Product>();
    list.add(new Product());
    list.add(new Tv());
    list.add(new Audio());
package chapter12;

import java.util.ArrayList;
import java.util.List;

class ProductS3T1{}
class TvS3T1 extends ProductS3T1{}
class AudioS3T1 extends ProductS3T1{}

public class Study03Test1 {
	
	public static void printAll(ArrayList<ProductS3T1> list) {
		for(ProductS3T1 productS3T1 : list) {
			System.out.print(productS3T1);
		}
	}
	
	public static void main(String[] args) {
		
		ArrayList<ProductS3T1> productList = new ArrayList<ProductS3T1>();
		ArrayList<TvS3T1> tvList = new ArrayList<TvS3T1>();
//		ArrayList<ProductS3T1> tvList = new ArrayList<TvS3T1>(); //에러
//		List<TvS3T1> tvList = new ArrayList<TvS3T1>(); //가능. 다형성

		productList.add(new TvS3T1());
		productList.add(new AudioS3T1());
		
		tvList.add(new TvS3T1());
		tvList.add(new TvS3T1());
		
		printAll(productList);
//		printAll(tvList); //컴파일 오류 발생
		
		
	}

}

 

728x90

'organize > 자바' 카테고리의 다른 글

Java 30  (0) 2024.08.14
Java 29  (0) 2024.08.13
Java 27  (0) 2024.05.14
Java 26  (0) 2024.05.13
Java 25  (0) 2024.05.11