ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 제네릭
    Java 2023. 2. 19. 13:12
    학습목표

    제네릭 프로그래밍 개념
    type paramater 개념

     

     

    제네릭 프로그래밍이란?

    다양한 자료형이 적용될 수 있는 클래스와 메소드를 작성하는 기법이다.

     

    제네릭 자료형

    클래스에서 사용하는 변수의 자료형이 여러개 일수 있고, 그 기능(메서드)은 동일한 경우 클래스의 자료형을 특정하지 않고 추후 해당 클래스를 사용할 때 지정 할 수 있도록 선언하는 것

    실제 사용되는 자료형의 변환은 컴파일러에 의해 검증되므로 안정적인 프로그래밍 방식

    컬렉션 프레임워크에서 많이 사용되고 있다.

     

    제네릭 프로그래밍을 사용하는 이유

    우리가 변수를 사용한다고 하면 변수에 항상 자료형을 지정하게 되어있다.

    하지만 같은 변수 이름이고 데이터 타입만 달라지는 경우를 만난다면 제네릭을 사용하면 좋다.

     

    제네릭을 이용한 방법

    자료형을 표시하는 자리에 Object 대신에 <T>가 들어가고 문자열을 저장하는 클래스의 객체는 <String>,

    정수를 저장하는 클래스의 객체를 생성하려면 T 대신에 <Integer>을 넣어 사용하면 된다.

     

    package ch03;
    //문법 - how	어떻게 쓰는가
    //이유 - why 사용한 이유
    
    public class GenericPriner<T> {
    
    	// T 라는 대체 문자를 사용한다. E - element, K - key, V - value (아무 문자열 다 가능)
    	
    	// 제네릭 자료형 이라고 부른다.
    	private T material;	// T 자료형으로 선언한 변수 - ㅡmaterial
    	
    	// 제네릭 메서드 - T 자료형을 반환하는 제네릭 메서드
    	public T getMaterial() {
    		return material;
    	}
    	
    	public void setMaterial(T material) {
    		this.material = material;
    	}
    	
    }
    package ch03;
    
    public class Plastic {
    
    	@Override
    	public String toString() {
    		return "재료는 플라스틱 입니다.";
    	}
    }
    package ch03;
    
    public class Podwer {
    	
    	@Override
    	public String toString() {
    		//toString object 최상위 클래스에 있는놈
    		return "재료는 파우더 입니다";
    	}
    }
    package ch03;
    
    import ch02.Plastic;
    import ch02.Power;
    
    public class GenericPrinerMainTest {
    
    	public static void main(String[] args) {
    
    		Podwer podwer = new Podwer();
    		Plastic plastic = new Plastic();
    		
    		//사용 방법
    		//	GenericPriner<Power> genericPriner = new GenericPriner<Power>();
    		GenericPriner<Podwer> genericPriner = new GenericPriner<>();
    		//Power 로 지정해줬기 때문에 Power만 된다.
    		//뒤에 뭐 들어올지 컴파일러가 예측을 해준다.
    		//이때 컴퓨터가 이해할수있는 언어로 바뀐다.(실행했을때) 
    		
    		// 재료 넣기
    		// 최상위 클래스인 Object를 활용하는 것보다 보다 안정적인 코드를 만들 수 있다.
    		//또한 가독성도 높아 진다.
    		//genericPriner.setMaterial(plastic); 	//plastic을 넣으면 컴파일 시점에 오류
    		genericPriner.setMaterial(podwer); 	
    		
    		//재료 꺼내기
    		//다운 캐스팅을 할 필요가 없다.
    		Podwer usePower = genericPriner.getMaterial();
    		//Plastic usePower = genericPriner.getMaterial();
    		//잘못된 데이터 타입으로 대입하면 컴파일 시점에 오류를 잡아준다.
    		
    		//결론 : 보다 가독성 높고 안정적인 프로그래밍을 만들 수 있다.
    		//같은 변수이름 같은 기능이라면 제네릭 프로그래밍을 설계하면 된다.
    		
    		//자료구조
    		//자료구조를 배워야 하는 이유
    		//예로들면 청소를 할때 물건들을 마구잡이로 넣어두면 찾는데 시간이 오래 걸린다.
    		//물건들을 빨리 찾게 선반에 정리하는것을 말한다.
    		
    		
    	}	//end of main
    
    }

     

     

     

    T extends (상속받은 자식으로 제한 할 수 있다)

    package ch04;
    
    
    // T는 Meterial 를 상속받은 녀석으로 제한
    // 자바를 쓸때 유용한 클래스
    //그중에 하나가 제네릭 프로그램
    //똑같은 클래스 파일을 많이 안만들려고 씀
    public class GenericPriner<T extends Material> {
    
    	private T material;
    	// double,int 들어오는걸 하나로 쓸수 있게 고안한것이 제네릭 프로그램
    	
    	public T getMaterial() {
    		return material;
    	}
    	
    	public void setMaterial(T material) {
    		this.material = material;
    	}
    	public String toString() {
    		return material.toString();
    	}
    	public void printing() {
    		material.doPrinting();
    	}
    }
    package ch04;
    // T Extend만 쓸거기 때문에 
    public abstract class Material {
    
    	public abstract void doPrinting();
    }
    package ch04;
    
    
    public class Podwer extends Material {
    	
    	@Override
    	public String toString() {
    		//toString object 최상위 클래스에 있는놈
    		return "재료는 파우더 입니다";
    	}
    
    	@Override
    	public void doPrinting() {
    		System.out.println("파우더로 출력합니다.");
    	}
    }
    package ch04;
    
    
    public class Plastic extends Material{
    
    	@Override
    	public String toString() {
    		return "재료는 플라스틱 입니다.";
    	}
    
    	@Override
    	public void doPrinting() {
    		System.out.println("plastic 재료로 출력합니다");
    	}
    }
    package ch04;
    
    public class MainTest {
    
    	public static void main(String[] args) {
    
    		GenericPriner<Podwer> genericPriner1 = new GenericPriner<>();
    		GenericPriner<Plastic> genericPriner2 = new GenericPriner<>();
    
    		// 재료넣기
    		genericPriner1.setMaterial(new Podwer());
    		genericPriner2.setMaterial(new Plastic());
    
    	}
    
    }

     

     

     

     

    제네릭 활용 예제

    package ex02;
    
    public class Box<T> {
    
    	private T contents;
    	
    	public Box() {
    		this.contents = null;
    	}
    	//넣다
    	public void put(T item) {
    		this.contents = item;
    	}
    	//꺼내다
    	public T take() {
    		T item = this.contents;
    		this.contents = null;
    		return item;
    	}
    	
    	public boolean isEmpty() {
    		return this.contents == null;
    	}
    }
    package ex02;
    
    import ex01.GenericPriner;
    
    public class BoxMainTest {
    
    	public static void main(String[] args) {
    		Box<String> box1 = new Box<>();
    		box1.put("안녕 반가워");
    		System.out.println(box1.isEmpty());
    		System.out.println("-------------------");
    		
    		String msg = box1.take();
    		System.out.println("msg : " + msg);
    		System.out.println(box1.isEmpty());
    	
    	}
    
    }
    출력값
    
    false
    -------------------
    msg : 안녕 반가워
    true

     

     

     

     

     

    'Java' 카테고리의 다른 글

    자료구조  (0) 2023.02.21
    쓰레드(Thread)  (0) 2023.02.19
    예외처리  (0) 2023.02.19
    Object  (0) 2023.02.18
    인터페이스 활용 예제  (0) 2023.02.18
Designed by Tistory.