25.제네릭

Jan 03, 2024
25.제네릭
💡
다양한 종류의 데이터를 처리할 수 있는 클레스와 메서드를 작성하는 기법이다. 제네릭 프로그래밍 제네릭을 사용하는 이유는 클레스에 자료형을 정하지 않아 클레스에 객체들을 호출 할때 타입을 정할 수 있어 클레스 자료형이 object일 때 처럼 get을 호출 할때 형변환을 사용하지 않아도 된다.
  • 제네릭 : 일반적인 뜻!
  • 여러가지 데이터 타입을 관리 한다.
  • 클래스를 정의할 때, 클래스 안에서 사용되는 자료형(타입)을 구체적으로 명시하지 않고 T와 같이 기호로 적어놓는 것이다. 이것을 타입 매개변수라고 한다.
  • 제네릭 문법 ArrayList<T>
  • @제네릭에는 static 사용이 불가능 하다. → static으로 쓰고 싶으면 Object를 사용하면 된다.
  • @제네릭은 타입을 결정하지 못할때 사용한다 (타이밍은 new 할 때 이다)
    • 왜냐하면 생성 할 때 <T>자리에 어떤 타입으로든 입력하여 객체를 만들 수 있기 때문이다.
    • 하지만int 타입은 기 자로형이기 때문에 사용불가
예제
package ex13; class Box<T>{ private T data; public void set(T data) { this.data = data } public T get(){ return data; } } public class Generic { public static void main(String[] args) { Box<String> b = new Box<String>(); b.set("Hello world"); String s = b.get(); //서로 다른 타입을 입력시 컴파일러가 컴파일 단계에서 오류를 잡아줘 안전하게 프로그래밍 가능 Box<String> stringBox = new Box<String>(); stringBox.set(new Integer(10)); } }
 

제네릭 메서드

💡
일반 클래스의 메소드에서도 타입 매개벼수를 사용하여서 제네릭 메소드를 정의 가능 이 경우에는 타입 매개변수의 범위가 메소드 내부로 제한된다. 제네릭 메서드 문법
  • 타입 매개변수는 반듣시 메소드의 수식자와 반환형 사이에 위치 되어야한다.
  • 메서드 호출시에 실제타입을 꺽쇠 안에 적어주어도 되지만 일반 메서드처럼 호출도 가능
예제
package ex13; class MyArrayAlg{ public static <T> T getLast(T[] a){ return a[a.length -1]; } } public class Gegeric02 { public static void main(String[] args) { String[] lANGUAGE = {"C++", "C#", "Java"}; //둘다 가능 String last= MyArrayAlg.getLast(lANGUAGE);//일반 메서드 호출 방법 // String last= MyArrayAlg.<String>getLast(lANGUAGE);//제네릭 메서드 호출 방법 } }

오브젝트 클레스

💡
만일 클레스에 자료타입이 적혀져있지 않는다면 그 클레스에 자료타입은 object이다. 제네릭 대신 오브젝트를 사용하는 이유는 new를 사용 하지 못 할때 제네릭 대신 오브젝트를 사용한다.
오브젝트의 단점
  • 오브젝트를 사용하여 클래스 호출시 다운캐스팅을 해야한다.
  • 만약 다운캐스팅 하는 오브젝트가 상속보다 별로인데 쓴다면 이유가 있다. → 어쩔수 없을때 사용하는데 static을 사용하는데 타입을 결정하지 못할 때 사용한다. → static으로 만들 수 뿐이 없는 데이터가 있다. ex) 싱글톤 → 이럴 거면 차라리 추상화해서 사용하는것이 좋다.
 
 
Share article
RSSPowered by inblog