제네릭에 대하여

2025. 1. 17. 09:10·Back End/JAVA

⭐️ 제네릭이란?

Java의 다형성을 공부한 뒤로 다운 캐스팅을 해줘야하는 경우와 , 

instanceof를 사용하지 않았을때 classCastException이 발생하는 경우와,

위의 두 이유때문에도 런타임 오류가 종종 발생한다.

그리고 무엇보다도 귀찮은게 제일 크다.

 

타입을 정해주면 다운캐스팅 , instanceof를 사용하지 않아도 되고 , 개발자가

실수로 타입을 잘못 입력하여 발생하는 런타임 오류도 컴파일 오류로 바뀔 수 있다.

 

그렇기때문에 제네릭을 사용하여 사용자가 입력한 타입으로 타입을 정할 수 있게 된다‼️


 

[ 제네릭이 없는경우 - 타입 안전성이 떨어지고 , 형변환이 필요함 ]

package n.generic;

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        // Object 타입의 리스트이므로, 다양한 타입의 데이터를 넣을 수 있음
        List list = new ArrayList();
        list.add("Hello");
        list.add(123);  // 정수 추가

        // 데이터를 사용할 때는 항상 형변환 해야 함
        String s = (String) list.get(0);

        // 아래처럼 123을 String으로 형변환하면 런타임 에러 발생
        // String num = (String) list.get(1);

        int i = (int)list.get(1);

        System.out.println("첫번째 요소: " + s);
        System.out.println("두번째 요소: " + i);
    }
}

 

제네릭을 사용하지 않은 코드의 결과

 

위와같이 제네릭을 사용하지 않는 경우에 List의 들어가는 요소들은 모두

Object로 받아지기 때문에  직접 다운 캐스팅을 해줘야하고 한다.

 

또한 각각의 타입에 맞게 다운 캐스팅을 해줘야하는 번거로움이 있다.

 

이러한 불편함과 개발자의 실수로 없는 메모리로 다운 캐스팅을 할경우 ,

에러가 나기떄문에 이를 방지하게 위해 타입을 정해주는 제네릭을 사용하자 ‼️

 


 

 

[ 제네릭이 있는 경우 - 타입 안전성을 확보하고 , 형변환 불필요 ]

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        // 제네릭을 사용하면 List<String>에 오직 문자열만 저장할 수 있음
        List<String> list = new ArrayList<>();
        list.add("Hello");
        // list.add(123); // 컴파일 에러 발생: 정수는 String이 아님

        // 데이터를 꺼낼 때 형변환 없이 바로 String으로 사용 가능
        String s = list.get(0);
        System.out.println("첫번째 요소: " + s);
    }
}

 

 

[ 표현법 ]

public class 클래스명<T> {...}
public interface 인터페이스명<T> {...}

 

 

제네릭 타입은 클래스 또는 인터페이스 이름 뒤에 <> 부호가 붙고 사이에 타입 파라미터가 위치한다.

 

예시와 같이 컬렉션 , 클래스 등에 붙을 수 있고 , 

List<String> list = new ArrayList<>(); 라고 하면 .

list에는 무조건 String 타입만 올 수 있게 된다.‼️

그렇기에 int형을 추가할려고하면 에러가 발생한다.

 


제네릭을 사용하여 클래스나 메서드 선언시 데이터 타입을 파라미터로
저장할 수 있게 해주어 이를 통해 타입 안전성을 확보하고 ,
형변환의 번거러움을 줄여주는 역할을 한다 ‼️

'Back End > JAVA' 카테고리의 다른 글

쓰레드에 대하여  (0) 2025.01.20
exception에 대하여  (1) 2025.01.15
instanceof에 대하여  (0) 2025.01.13
상속에 대하여  (3) 2025.01.11
접근 제한자에 대하여  (1) 2025.01.09
'Back End/JAVA' 카테고리의 다른 글
  • 쓰레드에 대하여
  • exception에 대하여
  • instanceof에 대하여
  • 상속에 대하여
KoesJin
KoesJin
hEELo
  • KoesJin
    Seok DevLog
    KoesJin
  • 전체
    오늘
    어제
    • 분류 전체보기 (109)
      • Back End (31)
        • DataBase (15)
        • JAVA (12)
        • JDBC (4)
      • Front End (9)
        • HTML5 & CSS (3)
        • Java Script (6)
        • REACT (0)
      • Server (9)
        • JSP - TomCat - Servlet (7)
        • Spring Boot (2)
      • GitHub (1)
      • IT 지식 (기술면접 대비) (20)
      • Weekly TIL (39)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DAO
    View
    MVC 패턴
    weekly til - day 40
    commit
    DDL
    weekly til - day 38
    from
    INNER JOIN
    weekly til - day 39
    order by
    weekly til - day 43
    exception
    순서에 대하여
    css
    weekly til - day 41
    GC
    select
    dml
    where
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
KoesJin
제네릭에 대하여
상단으로

티스토리툴바