Java

Java_제네릭(Generics)

ssmm95 2024. 10. 16. 17:32

제네릭(Generics) 

: 다양한 타입의 객체를 다룰 때 코드의 재사용성과 안전성을 높여주는 기능이다

제네릭을 사용하면 여러가지 자료형에 대해 동일한 로직을 작성할 수 있다 

타입 안전성을 보장하고, 잘못된 자료형을 사용하는 실수를 줄일 수 있고 코드의 재사용성을 높일 수 있다 

package ch13;
public class Box {
	public Object content;
} // Box에 넣을 내용물로 content 필드를 선언한다 

// Object 타입은 모든 클래스의 최상위 부모클래스이다 
// 따라서 모든 객체는 부모타입인 Object로 자동 타입 변환이 되므로 
// content 필드에는 어떤 객체든 대입이 가능하다

Box box = new Box();
box.content = 모든 객체;

// Box안의 내용물을 얻을 때 대입된 내용물의 타입을 안다면 강제타입 변화을 거쳐 얻기가능하다
String content = (String) box.content;

//Box를 생성할 떄 저장할 내용의 타입을 미리 알려주면 Box는 content에 무엇이 대입되고
//읽을 때 어떤 타입으로 제공될지 알게된다 이것이 제네릭이다

제네릭(Generic) 이란 결정되지 않은 타입을 파라미터로 처리하고,
실제 사용 할 때 파라미터를 구체적인 타입으로 대체시키는 기능이다

 

// 제네릭 클래스를 정의합니다. T는 타입 매개변수입니다.
public class Box<T> {
    private T item;

    // 상자에 물건을 넣습니다.
    public void set(T item) {
        this.item = item;
    }

    // 상자에서 물건을 꺼냅니다.
    public T get() {
        return item;
    }
}


//지피티가 알려주는 예시

<T>: 타입 매개변수를 나타내며, 임의의 타입을 의미합니다. 나중에 이 클래스를 사용할 때 타입을 지정하게 됩니다.
T item: 클래스 안에서 이 타입을 사용하여 변수를 선언합니다.
이렇게 제네릭 클래스를 만들면, 어떤 타입의 물건이든 넣을 수 있는 상자를 만들 수 있습니다.

 

◆ 제네릭 타입

: 제네릭 타입은 결정되지 않은 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다

제네릭 타입은 선언부에 <> 부호가 붙고 그 사이에 타입 파라미터들이 위치한다

 

타입 파라미터는 변수명과 동일한 규칙에 따라 작성할 수 있지만 일반적으로 대문자 알파벳 한 글자로 표현한다

외부에서 제네릭 타입을 사용하려면 타입 파라미터에 구체적인 타입을 지정해야 한다 

만약 지정하지 않으면 암묵적으로 Object 타입이 사용된다 

 

◆ 제네릭 메소드 

: 제네릭 메소드는 타입 파라미터를 가지고 있는 메소드를 말한다

타입 파라미터가 메소드 선언부에서 정의된다는 점에서 제네릭 타입과 차이가 있다

제네릭 메소드는 리턴 타입 앞에 <>기호를 추가하고 타입 파라미터를 정의한 뒤 리턴 타입과 매개변수 타입에서 사용한다

 

하나의 메소드로 여러종류의 데이터를 다룰 수 있게 해주는 메소드 

예를들어 숫자,문자열 같은 다양한 데이터 타입을 하나의 메소드로 처리할 수 있다는 뜻

 

◆ 제한된 타입 파라미터

: 제네릭 에서 타입 파라미터에 제한을 두어서 특정 타입 또는 그 하위 타입만사용할 수 있도록 설정하는 기능 

 

와일드카드 타입 파라미터

:  제네릭 타입을 매가값이나 리턴 타입으로 사용할 때 타입 파라미터로 ?(와일드카드)사용할 수 있다

? 는 범위에 있는 모든 종류의 데이터를 받아들일 수 있다

> 어떤 종류의 데이터 타입이 들어오더라도 문제없이 처리할 수 있다 

 

 

 

 

'Java' 카테고리의 다른 글

Java_메인 스레드  (1) 2024.10.17
Java_멀티 스레드와 멀티 프로세스의 차이  (0) 2024.10.17
Java_어노테이션(Annotation)  (0) 2024.10.16
Java_리플렉션  (0) 2024.10.16
Java_날짜와 시간 클래스  (0) 2024.10.16