본문 바로가기
Java | spring/Java Basic

JAVA 제네릭 정의와 필요성 (+ArrayList 타입 오류 이유)

by 워니 wony 2019. 5. 7.

제네릭이란?

  • 어떤 값이 하나의 참조 자료형이 아닌 여러 참조 자료형을 사용할 있도록 프로그래밍 하는 것을 '제네릭(Generic) 프로그래밍' 이라고 한다.
  • 제네릭 프로그램은 참조 자료형이 변환될 이에 대한 검증을 컴파일러가 하므로 안정적
  • 여러 참조 자료형이 쓰일 있는 곳에 특정한 자료형을 지정하지 않고 클래스나 메서드를 정의한 사용하는 시점에 어떤 자료형을 사용할 것인지 지정하는 방식

 

제네릭의 필요성

  • 자료형 별로 메소드를 만들면 코드의 효율성이 떨어진다. 그래서 Object 세팅을 하게 되면 변환 Object 되기 때문에 반드시 형변환을 해야 하는 번거로움이 생긴다. 이럴때 사용시점에 자료형을 지정하는 제네릭 방식을 사용한다.
  • 자바의 컬렉션프레임워크에는 어떤 자료형이라도 담을  있다. 하지만 사용하다 보니 반복문으로 동일 자료형의 연산을 하거나, 클래스의 메소드를 호출하는 것이 쉽지 않다.(instanceof 확인 casting 해야 하는 불편함)
  • 그래서 컬렉션 프레임워크(set, List, Map)에는 담을 자료형을 한가지로 한정해서 담는 것이 좋다.

 

 

 

ㅇ 제네릭 클래스 정의하기

  • 다이아몬드 연산자<> : ArrayList 옆에 붙어서 <> 안에 자료형을 명시한다. 자료형 선언 생성 시에는 생략 가능
    • ArrayList<String> list = new ArrayList<>( );
  • 자료형 매개변수 T static : T 자료형이 정해지는 순간 제네릭 클래스의 인스턴스가 생성되는 순간, 따라서 T 자료형이 결정되는 시점보다 빠르기 때문에 static 변수의 자료형이나 static 메서드 내부 변수의 자료형으로 T 사용할 없다.

 

ㅇ 제네릭 메서드 활용하기

  • public <자료형 매개변수> 반환형 메서드이름 (자료형 매개변수 …) { }
  •  

==> 다양한 종류를 담을 있지만, 가져와서 반복문으로 뽑아서 처리하기 힘들다 보니 가급적이면 하나의 형태만 담는 권장한다. 제네릭

 

 

제네릭 에러 발생 예제

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

- 리스트에 담는 타입을 Person(클래스) 담을 있다.

- 이제 다른 형태는 담을 없다.

 

- 만약 다른 형을 담으려고 하면 아래와 같은 오류 메시지가 나온다.

    ListTest04.java:31: error: no suitable method found for add(String)

                list.add("Kate");

                    ^

    method Collection.add(Person) is not applicable

      (argument mismatch; String cannot be converted to Person)

    method List.add(Person) is not applicable

      (argument mismatch; String cannot be converted to Person)

    method AbstractCollection.add(Person) is not applicable

      (argument mismatch; String cannot be converted to Person)

    method AbstractList.add(Person) is not applicable

      (argument mismatch; String cannot be converted to Person)

    method ArrayList.add(Person) is not applicable

      (argument mismatch; String cannot be converted to Person)

Note: Some messages have been simplified; recompile with -Xdiags:verbose to get

full output

1 error

 

 

다양한 형태의 값을 리스트배열에 담으면 아래와 같은 노트가 나온다

Note: ListTest03.java uses unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

 

 

 

  • double 기본 자료형
  • Double 기본자료형 double 객체로 만들어 주는 클래스 Wrapper 클래스
  • Wrapper 클래스는 기본자료형 8 만큼 가진다.
  • 컬렉션프레임 워크는 기본자료형을 상대하지 않고, 객체를 상대한다.
    list.add(5); //
    자동 포장한다. new Integer(5) auto Boxing

반응형

댓글