상세 컨텐츠

본문 제목

[java]자바_제네릭(Generic)쉽게 정리/메서드/ 인터페이스/상속 /반복문/파라미터/Arraylist이해하기

java_자바

by 쫑메이 2020. 7. 27. 00:13

본문

 

 

 

 


 

 

 

 

 

 

 

 

 


[자바] 제네릭_ 정의


 

 

 

 

 

 

 

 

 

 

 

 

 


[자바] 제네릭_특징

 

 

- 미리 사용할 타입을 결정한 뒤, 컴파일 시점에 사용될 데이터 타입을 체크하는 것

 

- 지정된 타입은 클래스 내에서 임시 데이터 타입으로 사용되며

인스턴스 생성 시점에서 특정 데이터 타입을 지정하여 해당 타입으로 교체

- 코드의 안정성이 향상되며 형 변환 연산자 등을 생략할 수 있으므로 코드가 절감된다

 

 

 

 

 

★ 클래스 정의 시 클래스 명 뒤에 <>기호 사이에 가상의 임시 자료형을 지정

(보통 영문 대문자 1글자를 지정)

 

 

public class Array<E>{}

→ <>이 부분이 바로 파라미터 선언

→ 일반적으로 파라미터는 상징성을 나타내는 알파벳 하나를 사용

· <T>_참조 타입

· <E>_요소

· <V>_값

· <K>_키

 

 

 

 

 


 

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

 

제네릭 타입 지정이 클래스 타입만 가능, 기본 타입형은 안된다!!!!!

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


[자바]  제네릭의 필요성


 

 

Object 타입으로 변수를 선언하면 모든 데이터 타입을 전달받을 수 있어 저장 시 편리함

하지만 데이터를 사용할 때 문제가 발생할 수 있다

 

 

 

 

 

 

 

오류가 발생하지 않지만.. 코드를 실행할 때 오류가 뜬다

 

 

 

 

 

 

그래서 제네릭을 사용하면

컴파일 시점에서 사용할 수 있는 객체의 타입을 체크하기 때문에

프로그램의 안전성이 획기적으로 향상되고 코드도 줄어든다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


[자바] 제네릭을 적용한 GenericBox

클래스 정의


 

 

클래스 명 뒤에 <>를 쓰고 사이에 영문 대문자 1글자를 지정한다

이때 지정한 영문 대문자는 클래스 내에서 임시 데이터 타입으로 사용 가능

(클래스 내에서만 유효한 가상의 임시 데이터 타입)

클래스 정의 시점에서는 어떤 데이터 타입이 될지 알 수 없으며,

인스턴스 생성 시점에 데이터 타입을 명시하게 됨(해당 데이터 타입으로 교체됨)

 

 

 

 

 

 

 

 

 

 

 


 

 

 


제네릭으로 정의된 클래스 사용


 

 

GenericBox 인스턴스 생성 시 제네릭 타입을 Toy 타입으로 고정

클래스 내의 가상의 자료형 T -> Toy로 모두 변경됨

GenericBox<Toy> gb1 = new GenericBox<Toy>();

gb1.setSome(new Toy());

gb1.setSome(new Grocery()); ==>컴파일 에러 발생! Toy 타입 외의 객체 전달 불가

 

 

 

 

 

 

 

 

제네릭을 적용하면 오류를 발견하는 시점이 컴파일(번역) 시점이 된다

Getter 메서드 리턴 타입이 Toy로 바뀌었으므로

타입 체크(instanceof)나 형변환 연산자가 필요 없음! (코드 절감)

Toy toy = gb1.getSome();

 

 

 

 

 

Getter 메서드 리턴 타입이 Toy로 바뀌었으므로

타입 체크(instanceof)나 형변환연산자가 필요 없음!

(코드 절감)

Toy toy = gb1.getSome();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


제네릭을 적용한 자바의 API


 

 

컬렉션 프레임워크 등에서 기본적으로 제네릭을 적용하여 클래스를 정의

=> ArrayList, HashSet, HashMap 등에 제네릭 사용 가능

 

 

DB 작업에 사용되는 DTO 클래스(자바빈 객체)도 제네릭 타입으로 지정 가능

ArrayList<BoardDTO> boardList = new ArrayList<BoardDTO>();

 

 

BoardDTO dto = new BoardDTO(1, "게시물 제목", "게시물 내용");

boardList.add(dto);

 

 

BoardDTO dto3 = new BoardDTO(2, "게시물 제목 2", "게시물 내용 2");

boardList.add(dto3);

 

 

 

 

 

 

 

 

 

 

 

 

 


[자바_제네릭]

ArrayList 객체에 저장된 BoardDTO


 

ArrayList 객체에 저장된 BoardDTO 객체 꺼내서 메서드 호출

BoardDTO 타입으로 꺼내올 때 타입 판별이나 형변환 등 필요 없음

 

 

(1) 일반 for 문

for(int i = 0; i < boardList.size(); i++) {

 

 

BoardDTO board = boardList.get(i);

System.out.println(board.getTitle() + ", " + board.getContent());

}

 

 

 

 

 

 

 

 

 

 

 

(2) 향상된 for 문

for(BoardDTO board : boardList) {

System.out.println(board.getTitle() + ", " + board.getContent());

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


[자바]제네릭 :

<타입> 파라미터 사용 시 주의할 점


 

 

 

 

★ static이 붙은 멤버에는 타입 파라미터를 적용할 수 없다

타입 파라미터를 이용해서 객체를 생성할 수 없다

(new 연산자는 컴파일 타입에 정확한 타입을 알아야 하는데

클래스 내부에서 파라미터만 보아서는 타입을 알 길이 없기 때문)

 

★ instanceof의 피연산자로 타입 파라미터가 사용될 수 없다

 

 

 

 

 

 

 


 

♬사용 가능한 파라미터 타입의 제한

class Number<T extends Number>{}

 

 

 

 

T는 자식, Number는 부모

그래서 T는 Number 클래스 이하여야 한다

- Number 안에는 Interger, Double,,,,, 등

- Object도 안된다. String은 Number의 하위 클래스가 아니다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

ㅣ읽느라 수고 많으셨어요~ㅣ


 

 

 

 

 

 

 

 

 

 

 


 

 

부족한 글을 읽어주셔서 감사드립니다

아직 부족한 게 많으니

틀린 곳이 있다면

조언의 말씀 꼭 부탁드립니다!!!!

 

 

반응형

관련글 더보기