728x90
반응형
SMALL
제네릭을 사용하지 않았을 경우 발생하는 문제점
- 프로그래머의 실수가 컴파일 과정에서 발견되지 않음
- 프로그래머의 실수가 실행 과정에서 조차 발견되지 않을 수 있음
제네릭이란?
- 클래스에서 사용하는 변수의 자료형이 여러 개일 수 있고, 그 기능(메서드)은 동일한 경우 클래스의 자료형을 특정하지 않고 추후 해당 클래스를 사용할 때 지정할 수 있도록 선언함
- 실제 사용되는 자료형의 변환은 컴파일러에 의해 검증되므로 안정적인 프로그래밍 방식이다
- 클래스 또는 메소드에서 사용되는 다양한 데이터타입을 일반화 시켜서 정의하는 방법
제네릭 프로그래밍이란?
어떤 값이 하나의 참조 자료형이 아닌 여러 자료형을 사용할 수 있도록 프로그래밍 하는 것
특징
- 코드 재사용성이 높아짐
- 타입 안정성 제공 ( 의도하지 않은 타입 사용 방지 )
- 불필요한 형변환 줄임
제네릭 클래스
표현법
접근제한자 class 클래스명<타입매개변수> {}
특징
- 제네릭 클래스 객체 생성 시 타입(파라미터,전달값)를 결정해주는 것이 좋음
=> 명시되지 않으면 [Object]로 처리됨 - 제네릭 클래스의 참조 변수 선언 시 타입(파라미터,전달값)을 명시하고,
생성 부분(new) 에서는 <>만 사용 가능.
=> 객체 생성 시 [기본 자료형]은 사용할 수 없음 - 적용 범위 : 필드의 데이터 타입 및 메서드 반환, 매개변수타입, 지역변수
제네릭 메소드 (제네릭이 적용된 메소드)
표현법
접근제한자 <타입매개변수> 반환형 메서드명(매개변수정보) {}
특징
- 메소드 내에서 사용하는 데이터타입을 일반화시켜 정의
- 제네릭 메소드의 타입 파라미터를 결정하는 방법
- 호출 시 직접 명시하기
- 호출 시 전달되는 값의 타입에 따라 자동으로 결정되게 하기
=> 매개변수의 타입이 제네릭 타입이어야 함! - 호출 시 반환 값을 받는 변수의 타입에 따라 자동으로 결정되게 하기
=> 반환타입이 제네릭 타입이어야 함!
=> 매개변수가 제네릭을 사용하지 않아야 함!
제네릭 클래스 사용하기
Powder.java
public class Powder {
public String toString() {
return "재료는 Powder 입니다.";
}
}
Plastic.java
public class Plastic {
public String toString() {
return "재료는 Plastic 입니다.";
}
}
GenericPrinter.java
public class GenericPrinter<T> { // T자리에 실제적으로 사용할 자료형을 쓴다. 나중에 쓸 때
private T material;
public void setMeterial(T material) {
this.material = material;
}
public T getMaterial() {
return material;
}
public String toString() {
return material.toString();
}
}
=> <> 다이아몬드 연산자 안에 T는 자료형 매개변수이다. 타입 매개변수에 extends 키워드를 사용할 때 확장이 가능한 클래스를 사용해야한다.
GenericPrinterTest.java
public class GenericPrinterTest {
public static void main(String[] args) {
Powder powder = new Powder();
GenericPrinter<Powder> powderPrinter = new GenericPrinter<>(); // <> : 다이아몬드 연산자
powderPrinter.setMeterial(powder);
Powder p = powderPrinter.getMaterial(); // 형변환을 하지 않는다.
// 형변환을 하지 않는 이유 : GenericPrinter<Powder>이렇게 작성하면 컴파일될 때 GenericPrinter 클래스에 있는 모든 T가 Powder로 바뀜.
System.out.println(powderPrinter.toString());
}
}
출력 결과
재료는 Powder 입니다.
=> 아래 내용 참고
[JAVA] 자바 - 제네릭의 기본 문법
다중 매개변수 기반 제네릭 클래스의 정의하기class DBox { private L left; // 왼쪽 수납 공간 private R right; // 오른쪽 수납 공간 public void set(L o, R r) { left = o; right = r; } @Override public String toString() { return le
seong-jun.tistory.com
728x90
반응형
LIST
'Java' 카테고리의 다른 글
[JAVA] 자바 - 제네릭 메서드 활용하기 (1) | 2025.02.20 |
---|---|
[JAVA] The type parameter T should not be bounded by the final type Integer. Final types cannot be further extended (0) | 2025.02.20 |
[JAVA] 자바 - 제네릭의 기본 문법 (0) | 2025.02.20 |
[JAVA] File클래스 (0) | 2025.02.18 |
[JAVA] 자바 OutputStream(바이트 단위 스트림) (0) | 2025.02.17 |