hyeonga_code

Java의 신2_Chapter 3_Generic 본문

Java

Java의 신2_Chapter 3_Generic

hyeonga 2024. 4. 2. 06:59
반응형

2024.04.01

 

-- 메소드 개발과 함께 JUnit 과 같은 테스트 코드를 작성하는 것이 좋다.

 

- JUnit

-- 메소드나 클래스 같은 작은 단위를 쉽게 테스트 할 수 있도록 도와주는 프레임워크

 

- 제네릭_Generic

-- 타입 형변환에서 발생할 수 있는 문제점을 사전_컴파일 시 에 없애기 위해 사용된다.

-- 명시적으로 타입을 지정할 때 사용

더보기
package base.generic;

import java.io.Serializable;

public class CastingGenericDTO<T> implements Serializable {
    private T object;
    
    public void setObject(T obj) {
        this.object = obj;
    }
    
    public T getObject() {
        return object;
    }
}

---- T가 아닌 다른 이름을 지정해도 컴파일 시 문제되지 않는다.

---- <> 내에는 현재 존재하는 클래스를 사용해도 되고, 존재하지 않는 것을 사용해도 무관하다.(가상의 타입 이름)

------ 클래스 이름의 명명 규칙과 동일하게 지정하는 것이 좋다.

------ 지정한 이름은 클래스 내에서 하나의 타입 이름처럼 사용할 수 있다.

 

package base.generic;

public class GenericSample {

    public static void main(String[] args) {
    	GenericSample sample = new GenericSample();
        sample.checkGenericDTO();
    }
    
    public void checkGenericDTO() {
        CastingGenericDTO<String> dto1 = new CastingGenericDTO<String>();
        dto1.setObject(new String());
        
        CastingGenericDTO<StringBuffer> dto2 = new CastingGenericDTO<StringBuffer>();
        dto2.setObject(new StringBuffer());
        
        CastingGenericDTO<StringBuilder> dto3 = new CastingGenericDTO<StringBuilder>();
        dto3.setObject(new StringBuilder());
        
        String str = dto1.getObject();
        StringBuffer bf = dto2.getObject();
        StringBuilder sb = dto3.getObject();
    }
}

---- 제네릭을 사용하면 형변환을 하지 않아도 된다.

 

---- 제네릭을 사용하지 않은 경우

public class GenericDTO implements Serializable {
    private Object object;
    
    public void setObject(Object obj) {
        this.object = obj;
    }
    
    public Object getObject() {
        return object;
    }
}

/*
	>>>
        String str = (String)dto1.getObject();
        StringBuffer bf = (StringBuffer)dto2.getObject();
        StringBuilder sb = (StringBuilder)dto3.getObject();
*/

 

-- 제네릭 타입 이름

E	// 요소

K	// 키

N	// 숫자

T	// 타입

V	// 값

S, U, V	// 두 번째, 세 번째, 네 번째 선언된 타입

 

 

-- 제네릭 <?>_wildcard 타입

---- 어떤 타입이 되어도 상관없이 호환된다.

---- 메소드 내부에서는 해당 타입을 모르기에 Object로 처리해야 한다.

---- 넘어오는 타입이 정해져 있는 경우 메소드 내에서 instanceof 예약어를 사용하여 해당 타입을 확인하면 된다.

더보기
public void wildcartStringMethod(WildcarGeneric<?> c) {
    Object value = c.getWildcard();
    
    if(value instanceof String){
        // ?가 String인 경우 실행
    }
}

---- wildcard는 메소드의 매개변수로만 사용하는 것이 좋다.

---- 와일드 카드로 객체를 선언하는 경우 특정 타입으로 값을 지정하는 것은 불가능하다.

 

-- < ? extends 클래스이름 >_Bounded Wildcards

---- 클래스를 상속 받은 모든 클래스만 사용이 가능하다.

 

-- 매개 변수로 사용된 객체에 값을 추가할 수 없으나, 메소드의 반환 타입에 사용하는 경우 값을 할당할 수 있다.

public <T> void genericMethod(WildcardGeneric<T> c. T addValue){
    c.setWildcard(addValue);
    T value = c.getWildcard();
}
더보기

---- 리턴 타입 앞에 제네릭 타입을 선언하고 매개변수에서 사용하는 경우 컴파일 시 문제되지 않는다.

---- 값을 할당할 수 있다.

 

반응형