[JAVA] Generic, Optional, Enum

하이초·2023년 11월 30일

JAVA

목록 보기
3/7
post-thumbnail

1️⃣ Generic

클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미한다

ArrayList<String> list = new ArrayList<>();

이와 같이 자바의 컬렉션 프레임워크에서 많이 사용한다. ArrayList 클래스 자체에서는 어떤 데이터 타입을 받을 지 지정해놓지 않고, 외부에서 이를 사용할 때 나 String list 만들거야! 하는 식이다.

특징

  • 참조 자료형만 사용이 가능하다
  • 아무 참조 자료형이나 넣을 수 있다보니, 프로그래머가 제한해야 하는 부분이 생길 수 있다
public class GenericPrinterTest {
  public static void main(String[] args) {
		GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();
    	powderPrinter.setMaterial(new Powder());
		Powder powder = powderPrinter.getMaterial();
    	System.out.println(powderPrinter);
        
		GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>();
    	plasticPrinter.setMaterial(new Plastic());
		Plastic plastic = plasticPrinter.getMaterial();
    	System.out.println(plasticPrinter);
	}
}

이런 코드가 있다고 칠 때 여기서 GenericPrinter는 Generic 클래스 일 것이다. 그런데 같은 material이긴 하지만 Water라는 또 다른 Material class가 있을 때, 이 Water는 Printer에 들어갈 수 없다고 하자. 이를 어떻게 막을 수 있을까?

이럴 때는 플라스틱과 파우더에 대한 상위클래스인 Material을 만들고 하위클래스들이 이를 상속받게 한 후 public class GenericPrinter<T extends Material> 이런식으로 사용하면 Material 클래스를 상속받은 애들만 사용 가능하도록 할 수 있다. 상위클래스를 추상 클래스로 구현 시 공통 구현 부분을 안내하는 장점은 덤

  • <> 다이아몬드 연산자

    1. static은 인스턴스 생성과 상관없이 메모리를 잡기 때문에 static과 함께 할 수 없다
    2. 다이아몬드 연산자 생략할 수 있으나 값을 꺼내 사용할 때 Object로 반환되기 때문에 강제 형변환을 해서 사용해야 한다. 가급적 명시적으로 타입을 선언하는 것이 좋다.
  • 컴파일 타임시에만 타입 체크가 가능하며 런타임에는 타입 체크가 불가능하다. Type erasure 절차를 통해 타입이 제거 되어 모두 Object로 변환되기 때문에 타입 안전성을 지키기 위한 주의가 필요하다.

2️⃣ Optional

Optional은 Null Point Exception 문제를 해결할 수 있는 방법을 제공한다.

Optional Class

모든 타입의 객체를 담을 수 있는 Wapper Class로, Optional 객체를 생성하려면 of() 또는 ofNullable() 메소들르 사용한다. Null 값이 올 수 있다면 of Nullable()을 사용한다.

isPresent()

Optional 객체의 값 null 여부를 판단하여 값이 있을 경우 true, null일 경우 false를 반환한다.

empty()

Optional 타입의 참조 변수를 기본값으로 초기화 할 때 사용한다

get()

Optional 객체에 저장된 값을 가져올 때 사용한다

이외 메소드 체이닝 방식으로도 활용할 수 있는데

[Java] Optional 올바르게 사용하기 이 포스트에 정리가 아주 잘 되어있어서, 보면서 노마드 코드 리팩토링을 해야겠다는 생각을 많이 했다..!

3️⃣ ENUM

제한된 값 목록을 갖는 타입

장점

1. Type Safety

컴파일 타임에 타입 안정성을 보장

2. Readability

명시적으로 값이 정의되어있어 가독성이 높음

3. Maintainability

값 변경 시 한 곳에서만 변경하면 되기 때문에 유지보수에 용이

4. Performance

컴파일 시 정적인 값으로 변환되어 상수 검색의 오버헤드를 줄임
일반적인 상수를 정의하는 방식인 public static final 상수들의 집합보다 효율적으로 동작함

5. 직렬화, 싱글톤 보장

직렬화가 가능하며, 싱글톤으로 만들어져 메모리 공유가 가능하다

profile
개발국대가 되는 그 날까지. 지금은 개발 응애.

0개의 댓글