[자바] 제너릭과 열거형

박지운·2023년 8월 13일
0

자바 꽉 자바

목록 보기
8/12

제너릭이란

컴파일 시 타입을 체크해준다.

제너릭을 사용함으로써 잘못된 타입이 사용되는 문제를 컴파일 단에서 막을 수 있다. 실행 시 에러가 나는 것보다 컴파일 시에 미리 타입을 체크하는 것이 좋다.
또한 제너릭은 타입 변환이 필요없어 프로그램 성능이 향상된다.

ArrayList list = new ArrayList(); //제너릭 사용x
list.add("test");
String temp = (String)list.get(0); //타입변환 필요

ArrayList<String> list2 = new ArrayList(); //제너릭 사용
list2.add("test2");
temp = list2.get(0); //타입 변환 불필요

제너릭 클래스

class ExClassGeneric<T> {
	private T t;
    
    public void setT(T t) {
    	this.t = t;
    }
    public T getT() {
    	return t;
    }
}

클래스 설계시 구체적 타입을 명시하지 않고 타입 파라미터로 넣어두면 ExClassGeneric exGeneric = new ExClassGeneric<>(); 이런 식으로 타입 변환을 최소화 시킬 수 있다.
인터페이스 또한 마찬가지이다.
멀티 타입으로 <K, V> 두 개 이상의 파라미터도 가능하다.


제너릭 메소드

제너릭 메소드는 컴파일러에게 제너릭이라는 것을 알려야한다. 따라서 제너릭 타입에 대한 정의가 반드시 필요하다.

 public class ExClassGenericMethod {
   public <T> void showGenericInfo(T info) {
       System.out.println(info.getClass().getName() + ": " + info.toString());
   }
}

이렇게 제너릭 클래스가 아니더라도 메서드에 제너릭 타입을 사용할 수 있다.

public static void main(String[] args) {
  ExClassGenericMethod exGM = new ExClassGenericMethod();
  exGM.showGenericInfo("Hello");
  exGM.showGenericInfo(10);
  exGM.showGenericInfo(10.5);
}

와일드 카드

와일드 카드<.?>
이번 프로젝트에서 처음 본 녀석이다. 상속에서 유용하게 사용했다

  • 하나의 참조 변수로 대입된 타입이 다른 객체를 참조 가능하다.
  • 와일드 카드의 상한 제한 T, 그 자손들만 가능하다.
  • 와일드 카드의 하한 제한 T, 그 조상들만 가능하다.
  • < ? > 제한이 없다.
  • 하나의 참조변수로 다양한 타입을 사용할 수 있다.와일드 카드는 이번 프로젝트에서 사용했다. 아직 수정해야할 것이 남아있어서 수정 후 예시 코드로 포스팅할 예정이다.

Enum

열거형 enum은 상수를 의밉별로 묶어 사용할 때 쓴다. 요일별로 일, 월, 화, 수...를 묶던지 mbti를 ENTJ, ENFF 등 으로 묶을 수 있다.
데이터 값의 의미를 명확히 하는 장점이 있다.

클래스처럼 변수와 메소드는 가질 수 있지만, 상속이나 인스턴스는 생성이 불가하다. 그리고 enum값은 상수로 public, static, final 속성을 갖고 있어 변경될 수 없다.

열거형은 보통 첫 글자를 대문자로 하여 시작한다.

	enum Week{SUN, MON, TUE ... }

사실 enum은,,,,

자바에서 enum은 단순히 클래스이다. enum에서의 상수는 자신의 public static final 인스턴스를 갖는 것이다.

메소드

  • valueOf(String str) : 문자열 str과 일치하는 열거값을 반환한다.
  • values() : 열거값 전부를 배열로 반환한다.
  • ordinal() : 열거값의 순서를 반환한다.(0부터 시작)
  • name() : enum타입의 값이 가지고 있는 문자열를 리턴한다.

❗ ordinal() 사용을 자제하자.(그냥 없는 것으로 생각하라는 글도 있다.)

ordinal()메소드 enum상수의 위치를 나타낸다. 이는 enum이 변경되지만 않으면 상관없다. 하지만 유지보수 관점에서는 끔찍한 결과를 불러올 수 있다.정 위치값이 필요하다면 enum {SUN(0), MON(1) ...} 이런식으로 객체 필드에 별도로 정의하자!


출처: TCPschool

profile
앞길막막 전과생

0개의 댓글