티스토리 뷰
포스팅에 앞서 내용이 틀릴 수 있습니다.
해당 부분 지적 감사히 받습니다.
제네릭에 대해 알아보자.
Generic :일반적인
제네릭은 일반적인 이라는 뜻을 가진 단어이다.
우리는 여태 메서드에 변수만을 넘겨줬었다.
하지만 제네릭을 사용하면 타입 또한 넘겨줄 수 있다.
즉, 하나의 메서드로 여러 타입을 넘겨줄 수 있게 된다.
이를 통해 코드 재사용성, 타입 안정성을 챙길 수 있다.
사용법을 알아보자.
Generic Class
public class GenericBox <T> {
private T value;
public GenericBox(T value) {
this.value = value;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
클래스 명 뒤에 <, > (다이아몬드라 칭한다)를 붙이고 변수와 같은 느낌으로 원하는 것을 넣어주면 된다.
위 코드는 간단하게 제네릭 클래스를 정의해 보았다.
아래 예시를 통해 알아보기 전, 관례에 대해 먼저 알아보자
관례
Integer -> I
String -> S
.
.
.
등
관례이기 때문에 지키지 않아도 컴파일 오류는 나지 않는다.
위 코드에서 T는 타입 매개변수라고 한다.
제네릭 클래스를 만들면, 멤버변수가 한 개만 존재해도, 여러 가지 타입을 가진 객체를 넣어줄 수 있다.
아래 메인코드를 통해 확인해 보자.
public class Main1 {
public static void main(String[] args) {
GenericBox<String> gb = new GenericBox<>("안녕");
GenericBox<Integer> gb2 = new GenericBox<>(100);
System.out.println("gb = " + gb.getValue());
System.out.println("gb2 = " + gb2.getValue());
}
}
실행 결과
gb = 안녕
gb2 = 100
하나의 클래스만 생성했지만, String과 Integer모두를 담으며 출력할 수 있다.
이를 제네릭 클래스라 한다.
제네릭 클래스는 타입을 미리 정해두지 않고, 인스턴스가 생성되는 시점에 타입을 정한다.
즉
GenericBox<String> gb = new GenericBox<>("안녕");
GenericBox<Integer> gb2 = new GenericBox<>(100);
이 부분에서 <, > 내부에 String과 Integer를 넣어주어 타입을 정해준 것이다.
(기본형은 제네릭클래스의 타입으로 사용할 수 없다. ex) int )
그리고 앞 <, > 에는 타입이 들어가 있지만, 대입 연산자 뒷부분의 <, > 에는 타입이 들어가 있지 않다.
이는 자바 컴파일러가가 타입을 추론하기 때문에 굳이 넣지 않아도 된다.
또한 아래와 같이 타입 매개변수를 여러 개 줄 수도 있다.
public class GenericBox2<T, Y> {
private T value;
private Y value2;
public GenericBox2(T value, Y value2) {
this.value = value;
this.value2 = value2;
}
public T getValue1() {
return value;
}
public Y getValue2() {
return value2;
}
public void setValue(T value) {
this.value = value;
}
public void setValue2(Y value2) {
this.value2 = value2;
}
}
하지만 우리는 일정 타입만 받게끔 하고 싶을 수도 있다.
위와 같은 방법으로 제네릭 선언 시, 개발자가 의도한 것과 다른 타입이 들어와도 컴파일 오류가 나지 않기에, 추후 런타임 에러의 발생 가능성을 야기할 수 있다.
이를 사전에 방지하기 위해 타입을 사전에 정해둘 수 있다.
코드를 통해 보여주는 것보다 글을 보는 게 더 이해가 쉬울 것 같아 글로 쓰겠다.
부모클래스 Animal를 상속받는 Cat과 Dog 클래스가 있다.
우리는 Animal의 하위 객체만 처리하고 싶은데, 만약 Machine 클래스를 상속받는 Mouse라는 클래스가 있다고 가정해 보자.
위 코드의 Generic Class는 분명 Dog, Cat, Mouse를 컴파일 오류 없이 모두 받을 수 있을 것이다.
하지만 개발자는 Animal, Machine에 구현해 놓은 메서드는 아마 서로 다를 것임을 추측할 수 있다.
그러면 위와 같은 제네릭으로는 한계가 있다.
아래 코드로 우리는 이 문제를 해결할 수 있다.
public class GenericBox <T extends Animal> { }
상속과 같이 T타입 매개변수의 타입을 미리 정해놓을 수 있다.
이렇게 제네릭 클래스를 선언해 주면, Machine을 상속받는 Mouse가 들어오려 할 때 컴파일러가 실행 못하게 에러 내준다.
즉 런타임 에러를 차단해 줄 수 있다.
다음엔 제네릭 메서드에 대해 알아보자.
'기술스택 > 자바(Spring)' 카테고리의 다른 글
자바 와일드카드(Wild Card) + 타입 이레이저 (3) | 2025.02.25 |
---|---|
자바 제네릭 메서드 (Generic Method) (1) | 2025.02.22 |
자바 예외처리(Exception) (2) | 2025.02.20 |
자바 익명 클래스 + 람다식(간단) (1) | 2025.02.18 |
자바 중첩 클래스, 내부 클래스 (2) | 2025.02.17 |
- Total
- Today
- Yesterday
- extends
- ys.k
- lord of sql
- 백준
- 코딩테스트
- java
- static
- spring
- 프로그래머스 상품을 구매한 회원 비율 구하기 파이썬
- zixem
- 코딩테스트 준비
- 김영한 실전 자바 중급
- 기술스택
- 상품을 구매한 회원 비율 구하기 파이썬
- 김영한
- 프로그래머스 상품을 구매한 회원 비율 구하기
- webhacking.kr
- Los
- 스프링
- 김영한 실전 자바 기본
- 자바
- samron3
- 상속
- los 15
- 김영한 실전 자바 기초
- 프로그래머스
- 백준 피보나치
- samron
- los 15단계
- 백준 피보나치 수열
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |