본문 바로가기
Hello World/JAVA

JAVA - Generic 제너릭 [개발스터디 기몬]

by 기몬 2023. 4. 18.
728x90
반응형

제네릭이란  ? 
- 결정되지 않은 타입을 파라미터로 처리하고 실제 사용할 때 
파라미터를 구체적인 타입으로 대체시키는 기능 
- <T>는 T가 타입 파라미터임을 뜻하는 기호. 
타입이 필요한 자리에 T를 사용할 수 있음을 알려줌
 
public class Box<T> {
      public T content;
}

 

package com.example;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Random;

import util.Alpha;

public class GenericExample {
	
	static class BoxString {
		String content;
	}
	
	static class BoxInteger {
		Integer content;
	}
	
	static class BoxDouble {
		Double content;
	}
	
	static class BoxBoolean {
		Boolean content;
	}
	
	static class Box<T> {
		T content;
	}
	
	
	
	public static void main(String[] args) {
		
		Box<String> box1;
		Box<Integer> box2;
		Box<Boolean> box3;
		Box<Random> box4;
		Box<System> box5;
		
		String[] strs = {"java", "python", "html"};
		int[] nums = {10, 30, 15};
		Alpha[] alpha = {new Alpha(), new Alpha(), new Alpha()};
		
		ArrayList<String> li1 = new ArrayList<String>();
		li1.add("jsp");
		li1.add("html");
		
		ArrayList<Integer> li2 = new ArrayList<>();
		li2.add(10);
		li2.add(20);
		li2.add(30);
		
		ArrayList<Alpha> li3 = new ArrayList<>();
		li3.add(new Alpha());
		li3.add(new Alpha());
		
		// comparator 비교기 // 제너릭 인터페이스 
		Comparator<String> c1 = new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				return 0;
			}
		};
		
		Comparator<Integer> c2 = new Comparator<Integer>() {

			@Override
			public int compare(Integer o1, Integer o2) {
				return 0;
			}
		};

		Comparator<Alpha> c3 = new Comparator<Alpha>() {

			@Override
			public int compare(Alpha o1, Alpha o2) {
				return 0;
			}
		};
		
		
	}

}


제네릭 타입 
- 결정되지 않은 타입을 파라키터로 가지는 클래스와 인터페이스 
- 선언부에 '<>'부호가 붙고 그 사이에 타입 파라미터들이 위치 
스터 텍스트 스타일을 편집하려면 클릭
- 외부에서 제네릭 타입을사용하려면 타입 파라미터에구체적인 타입을 지정. 
지정하지않으면 Object 타입이 암묵적으로사용

 

package com.example;

import java.util.Random;

import util.Alpha;

public class ObjectExample {

	static class A /*extends Object*/ { 
		
	}
	
	static class B extends A {
		
	}
	
	static class C extends B {
		
	}
	
	
	public static void main(String[] args) {
		// object 는 모든 타입을 줄수 있음 why? 모든 타입의 조상부모는 object이기 때문
		// 자바에서 모든 객체는 object로 명시 가능. 
		Object o1 = 10;
		Object o2 = 10.5;
		Object o3 = "Hello";
		Object o4 = new Alpha();
		Object o5 = new Random();
		
		A a = new A();
		B b = new B();
		C c = new C();
		
		
		Alpha alpha = new Alpha();
		
		System.out.println(alpha);
		
		
		
		
		
	}

}


제네릭 메소드
- 타입 파라미터를 가지고 있는 메소드. 타입 파라미터가 메소드 선언부에 정의
- 리턴 타입 앞에 <> 기호 추가하고 타입 파라미터 정의 후 
리턴 타입과 매개변수 타입에서 사용. 
- 타입 파라미터 T는 매개값의타입에 따라 컴파일 과정에서 구체적인 타입으로대체

public <A, B,...> 리턴타입 메소드명(매개변수, .... )  {....}
타입 파라미터 정의 

public <T> Box<T> boxing (T t) {  }
Box<Integer> box1 = boxing(100);
Box<String> box2 = boxing("안녕");

 

package com.example;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Random;

import util.Alpha;

public class GenericExample2 {
	
	static class BoxString {
		String content;
	}
	
	static class BoxInteger {
		Integer content;
	}
	
	static class BoxDouble {
		Double content;
	}
	
	static class BoxBoolean {
		Boolean content;
	}
	
	
	
	//  제네릭.. 생성자 
	static class Box<T> {
		T content;
		
		Box () { // 기본생성자
			
		}
		
		Box (T content) {
			this.content = content;
		}
	}
	// 제네릭 메소드의 구분을 위해 <T> /./ 매개변수가 있는 제너릭 메소드 
	static <T> Box<T> boxing(T v) {
		
		return new Box<T>(v);
	}
	
	static <T> Box<T> boxing() { // 매개변수가 없는 제너릭 메소드 
		
		return new Box<T>();
	}
	
	
	
	public static void main(String[] args) {

		Box<Integer> b1 = boxing(100);	// 타입 추론 
		Box<Integer> b2 = GenericExample2.boxing(100);	// 타입 추론 
		Box<Integer> b3 = GenericExample2.<Integer>boxing(100);
		
		GenericExample2.boxing();	// 추론이 되지 않고. object type으로 명시적 구분됨. 
		GenericExample2.<String>boxing(); // 타입추론이 되지 않은 object type에 명시적 타입을 명시해준다. 
		
	}

}



제한된타입파라미터
- 모든 타입으로 대체할 수 없고, 특정 타입과 자식 또는 구현 관계에있는 타입만 
대체할 수 있는 타입 파라미터
- 상위 타입은 클래스뿐만아니라 인터페이스도가능

public <T extends 상위타입 > 리턴타입 메소드(매개변수, ...) {...}

public <T extends Number> boolean compare(T t1, T t2) {
double v1 = t1.doubleValue();
double v1 = t1.doubleValue();
return (v1 == v2); 
}

 

package com.example;

public class ContraintTypeParameterExample {

	static class A {
		
	}
	
	static class B extends A {
		
	}
	
	static class C {
		
	}
	
	 // 제한된 타입 파라미터 /
	static class Box<T extends A> {// A와 A를 상속받은 B만 올수 있음 .
		T contenet;
	}
	
	public static void main(String[] args) {
//		Box<String> b1 = new Box<>(); // X error
		Box<A> b2 = new Box<>();
		Box<B> b3 = new Box<>();
//		Box<C> b4 = new Box<>();	// X error : 상속받지 않았기 때문, 제한에 속하지 않음. 
		
	}

}



와일드카드타입 파라미터
- 제네릭 타입을 매개값이나리턴 타입으로 사용할 때 범위에 있는 모든 타입으로 대체할 수 있는 타
입 파라미터. ?로 표시



java 제네릭 

java의 절차적 프로그램과 oop에서 부족한 부분을 보안하기 위해 제네릭을 사용. 
자바에서 제네릭이란 데이터의 타입 data type을 일반화(generalize)한다는 것을 의미 
제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법. 

컬렉션라이브러리는 제너릭으로 지정되고, 
어떤 타입을 정렬하던 비교 하는 비교비의 결과는 일정하다. / asc , desc
알고리즘은 변화하지 않고 그안의  데이터 타입만 변경. // 이때 제너릭을 사용.
제너릭이 아니면 데이터 타입만 변경이 불가. 

제너릭 타입 - 제너릭 클래스 / 제너릭 인터페이스 

비교대상이 되는 데이터 타입을 변경해준다 //
but 계속 생성되어 중복되는 인터페이스의 중복을 해결하기 위해 
제네릭을 사용해서 중복을 최소화 한다. 
절차적 프로그래밍의 효율성 -> OOP
객체지향 프로그래밍의 효율성 -> Generic


// object 는 모든 타입을 줄수 있음 why? 모든 타입의 조상부모는 object이기 때문
// 자바에서 모든 객체는 object로 명시 가능. 
모든 클래스의 최초 조상은 Object //
Object 
- toString - 객체를 문자열로 바꿔줌. 
어떤객체든 스트링으로 변환이 가능함. // 

모든 객체가 문자열로 변환 되려면 toString으로 
override 되어야 한다. (from Object // 조상부모.)

728x90
반응형

댓글