- 오늘의 키워드
Generic, 타입
- 오늘 배운 내용 정리
Generic 제너릭이란 단어는 사전적 의미로는 포괄적인 , 총칭의 , 일반적으로 라는 의미가 있다.
자바에서의 Generic이란 중복되거나 필요없는 코드를 줄여주는 것, 데이터 형식에 의존하지 않고, 값이 여러 다른 타입들을 가질 수 있도록 하는 방법으로
타입을 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것이다.
보통 자바스크립트나 파이썬과 같은 약타입 언어에서는 타입을 지정해 줄 필요가 없기에 하나의 함수만 구현하면 끝이다.
function plusReturnFunction(a, b) {
return a + b;
}
const a = 1;
const b = 2;
const c = 1.1;
const d = "hello";
plusReturnFunction(a + b); // 3
plusReturnFunction(a + c); // 2.1
plusReturnFunction(a + d); // 1hello
자바스크립트 에서의 함수 구현
하지만 타입을 지정해 주는 타입언어인 자바 같은 경우는 타입을 지정해주어야 한다.
그래서 똑같은 로직을 수행하는 함수를 타입을 지정해야 한다는 이유로 여러 번 구현해야 한다.
public class Generic {
public String plusReturnFunction(int a, int b) { ... }
public String plusReturnFunction(int a, long b) { ... }
public String plusReturnFunction(int a, String b) { ... }
}
객체를 이용하여 우회를 할 수도 있겠지만,
public class Generic {
public Object plusReturnFunction(Object a,Object b) { ... }
}
이러한 경우 타입의 안전성이 침해를 받게 된다.
메서드 구현 부분인 {...}의 블록 안에는 타입의 지배를 받고 있는 중이기 때문이다.
ex) 두타입이 다르다면 연산자를 사용하기 위해 같은 타입으로 맞춰줘야 하는데 , 어떠한 타입으로 맞추어야 하는가? int? long?
int와 long인 순서로 형변환하는 코드를 작성하였는데 long과 int로 들어오면 어떻게 해야 하는가?
이렇듯 타입의 안정성이 침해가 되어 부수적인 코드가 늘어나게 된다.
제너릭 문법
// 1.
public class Generic<T> {
// 2.
private T t;
// 3.
public T get() {
return this.t;
}
public void set(T t) {
this.t = t;
}
public static void main(String[] args) {
// 4.
Generic<String> stringGeneric = new Generic<>();
// 5.
stringGeneric.set("Hello World");
String tValueTurnOutWithString = stringGeneric.get();
System.out.println(tValueTurnOutWithString);
}
}
1. 제너릭은 클래스 또는 메서드에 사용할 수 있다. 클래스 이름 뒤에 <> 문법 안에 들어가야 할 타입변수를 지정
타입 변수를 보통 T로드는 것은 일정의 컨벤션으로 딱히 다른 이유가 없다면 T를 사용하는 것이 좋다.
자주 사용되는 변수명으로는 T, U, V, E 등이 있다.
타입 | 설명 |
<T> | Type |
<S>,<U>,<V> | 2번째,3번째,4번째 타입 |
<V> | Value |
<E> | Element |
<K> | Key |
<N> | Number |
- 2. 선언 해둔 타입 변수는 해당 클래스 내에서 특정한 타입이 들어갈 자리를 대신 들어갈 수 있다. 2번에서는 private의 프로퍼티인 t의 타입이 들어가야할 자리에 들어갔다.
- 3. 메서드의 리턴타입에 들어가는 것 역시 마찬가지
- 4. 제너릭을 통해 구현한 클래스를 사용하는 부분으로 클래스에 선언 했기 때문에 인스턴스를 만들기 위해서 타입변수에 들어가 실제 변수의 값을 넣어주어야한다. 여기서는 String이 들어가게 되었다.
- 5. 타입변수로 대체 해뒀던 곳에 String이 들어가있기 때문에, 이와 같이 사용 할 수 있다.
- 오늘의 회고
오늘은 집중이 안되고 머릿속에 내용이 들어오지 않아서 진전이 나지 않았다. 내일부터 다시금 마음먹고 집중해서 마지막 주차 강의와 후에 2차 제출까지 해내야겠다.
'내일배움캠프' 카테고리의 다른 글
내일배움캠프 TIL - Gradle에 관해서 (0) | 2024.01.17 |
---|---|
내일배움캠프 12일차 TIL - Java stream 간략하게 알아보기 (1) | 2024.01.09 |
내일배움 캠프 10일차 TIL - 개인과제 (자바 키오스크 구현) 진행중 (1) | 2024.01.05 |
내일배움캠프 9일차 TIL - Java 상속에 대해 알아보자 (1) | 2024.01.04 |
내일배움 캠프 8일차 TIL - 객체 지향 언어 Java 클래스에 대해 알아보자 (1) | 2024.01.03 |