Generic문법

소정·2023년 2월 1일
0

Java

목록 보기
19/23

Generic

class를 설계할 때 멤버의 자료형을 정하지 않고 객체를 생성(new)할 때 결정하도록 하는 문법
객체를 생성할 때 <>제네릭 문법으로 자료형을 지정

제네릭의 장점

class의 타입을 지정하지 않고 설계해서 코드를 재사용 할 수 있다는 장점이 있다


🧨 주의사항
<> 안에는 참조형 자료형만 올 수 있다
즉, 기본형 자료형(8가지)은 올 수 없다 기본형을 객체형으로 감싸기 위해 존재하는 Wrapper Class를 사용해야됨
Boolean, Byte, Character, Short, Integer, Long, Float, Double


선언 방법

🔨 제네릭 클래스 선언
class 클래스명<타입인자> {
}

🔨 제네릭 클래스의 객체(인스턴스)생성
new 클래스명<타입인자>();

사용예제

//이 Box클래스를 객체로 생성 할 때 <>안에 작성한 자료형으로 설계도가 완성됨
public class Box<T> { //<T>는 인스턴스 생성 시 전달되는 타입 : 타입인자
	
	//멤버 변수의 자료형을 아직 정하지 않고 설계
	T a; //자료형 바이트 예측 불가

	
	//멤버변수의 값을 대입해주는 기능 메소드 - setter
	public T getA() {
		return a;
	}
	
	public void setA(T a) {
		this.a = a;
	}
	

}


import java.util.Random;

public class Main {

	public static void main(String[] args) {
		//Box box;
		//Box is a raw type. References to generic type Box<T> should be parameterized
        //제네릭 클래스의 타입지정이 없으면 경고
		
		Box<String> box = new Box<>();
		box.a = "Hello";
		System.out.println(box.a);
		
		Box<Random> box2 = new Box<>();
		box2.a = new Random();
		System.out.println(box2.a.nextInt(10));

		//제네릭의 문법적 제약사항 - 참조형 자료형만 <>안에 지정할 수 있음
		Box<int> box3 = new Box<>(); //error - 기본형 자료형 int는 <> 안에 사용할 수 없음
		
		//int형 같은 기본형을 사용하고 싶다면, Wrapper Class를 대체사용
		//Wrapper Class : Boolean, Byte, Character, Short, Integer, Long, Float, Double
		int a=10; //기본형
		Integer b = new Integer(10); //참조형
		Integer c = 30; //자동 new Integer(30) : auto boxing
		int d = c; //자동 Integer를 int로 변환 : auto unboxing
		
		//Wrapper Class의 참조변수를 마치 기본형 변수 자료형처럼 사용해도 알아서 변환됨
		//기본형 자료형을 제네릭에 사용하려면 Wrapper Class를 지정해주면 됨
		Box<Integer> box4 = new Box<>(); 
		box4.a = 50;
		System.out.println(box4.a);
		
		Box<Double> box5 = new Box<>();
		
		//만약 Box를 생성하면서 <>을 명시하지 않으면?
		Box box6 = new Box();
		box6.a; //자료형이 지정되지않으면 기본 Object 자료형으로 만들어짐
		
		//2개 이상의 제네릭 타입을 가지는 클래스 객체로 생성
		Box2<String, Integer> obj = new Box2<>();
		obj.a = "aaa";
		obj.b = 13;
	
	}

}

profile
보조기억장치

0개의 댓글