240521
오늘의 학습
● 1. Generic Static Method
오늘 공부를 하면서 의문점이 들었던 부분 자바 api문서를 보면서 의문이든 부분이 있었다.
기본적으로 자바에서 스태틱 메서드를 배울때는 아래의 예제 코드와 같이
접근제어자 static여부 반환타입 메서드명(매개변수) 생김새로 배우게되고 가장 많이 보게 된다.
// 기본적인 메서드 정의
public static void Test(test) { }
하지만 api를 보다가 아래의 예제 코드와 같은 메서드를 보게 되었다. ( 이게 뭐지? )
public static <T> void Test(T test) { }
그래서 오늘은 이 문법에 대해 알아보고 나서의 리뷰를 작성하기로 생각을 했다.
제네릭 정적 메서드(Generic Static Method)
제네릭 정적 메서드를 사용하려면 static뒤에 <T>를 붙혀줘야 한다.
1. 기본적인 static메서드를 호출 할 때
public class Test {
public static void test() {
System.out.println("test");
}
}
public class Main {
public static void main(String[] args) {
Test.test(); // static 메서드 호출
}
}
2. 기본적인 Generic 클래스의 일반 메서드를 호출 할 때
클래스의 <> 제네릭을 통해 데이터 타입을 유연하게 받아올 수 있다.
( 참고로 여기서 Main클래스의 Test<String> 에서 제네릭을 뺄 수 있다. 컴파일러가 유추해서 알아서 넣어주기 때문 )
( 하지만 명확하게 명시를 해줘야 가독이 좋기에 명시를 하는 것이 좋다. )
public class Test<T> { // Test<String>
public void test(T test) {
System.out.println(test);
}
}
public class Main {
public static void main(String[] args) {
Test<String> t = new test(); // String 타입 전달
String msg = "test입니다.";
t.test(msg);
}
}
3. 제네릭 정적 메서드를 정의하고 호출할 때
예제 코드를 살펴보면 제네릭을 클래스에 안붙히고 메서드에 붙혀서 이용하는걸 볼 수 있다.
제네릭 정적 메서드의 타입 매개변수는 해당 메서드 호출 시점에 호출할 때 넣은 데이터의 타입으로 대체가 된다.
즉, static<String> , static<Integer> 이런 형태로 바뀐다는 의미이다.
public class MyClass {
public static <T> void test(T test) {
System.out.println(test); // 두번 호출
}
}
public class Main {
public static void main(String[] args) {
Integer num = 1;
String str = "문자열";
System.out.println("Integer :");
MyClass.test(num); // T가 Integer로 대체됨
System.out.println("String :");
MyClass.test(str); // T가 String으로 대체됨
}
}
이런게 가능한 이유는 static메서드는 클래스의 인스턴스가 아닌 클래스 자체에 속하는 메서드이다. 따라서 인스턴스를
생성하지 않고도 호출이 가능한 것이다. 즉, static메서드는 메모리에 하나만 올라가고 그것을 공유하는 메서드인 셈이다.
static 메서드는 클래스의 인스턴와는 독립적으로 동작하므로 new를 통해 생성을 할 필요가 없는 것이다.
그러므로 제네릭을 따로 사용을 해줘야 하는 것이다.
public class MyClass<T> {
public static void test(T test) { // 컴파일 에러 checked
System.out.println(test);
}
}
public class Main {
public static void main(String[] args) {
Integer num = 1;
MyClass.test(num);
}
}
즉, MyClass의 타입 매개변수를 해당 static메서드의 타입 매개변수에 넣는 것은 불가능한 것이다.
# 오늘의 회고
오늘은 궁금했던 부분이 생겨서 알아보고 공부를 좀 하게되었다. 제네릭 스태틱 메서드를 알아보다가 스테틱에 대해 더욱 이해를 하게 되었고 JVM과 메모리 공부 필요성을 느끼게 되었다.
'내일배움캠프 Spring 5기' 카테고리의 다른 글
내일배움캠프 26일차 TIL - JPA핵심 및 관계, 3계층 분리 (0) | 2024.05.23 |
---|---|
내일배움캠프 25일차 TIL - 외래키 (1) | 2024.05.22 |
내일배움캠프 23일차 TIL - JVM (0) | 2024.05.20 |
내일배움캠프 22일차 TIL - Annotation (0) | 2024.05.19 |
내일배움캠프 21일차 TIL - Spring(IoC, DI) (0) | 2024.05.16 |