매개변수화 타입(Parameterized Types)
-특정 종류의 공간에 넣을 내용을 정의할 수 있게 한다
자료구조에서는 컨테이너를 분리해야 한다
= 컨테이너에 들어가는 내용이 분리되어야 한다
매개변수화 타입을 이용하면 컨테이너를 정의할 수 있다
MyContainer라는 객체를 정의했을때 어떤 종류의 내용이 들어갈지 정한다
Monkey객체를 넣으면 Monkey만 넣을 수 있는 컨테이너가 생성된다
이 컨테이너를 재사용할 수 있다
Mycontainer<Undergraduate> = new Mycontainer<undergraduate>();
컨테이너에 우리가 사용할 것들을 넣는다 -> 링크드 리스트, 이진트리, 큐, 스택 등에 사용가능
이 내용을 실제 구현 코드와 분리한다 //분리 후 자료구조를 이용해서 구현
+ 실제 데이터와도 내용을 분리한다
자료구조에 들어가는 데이터가 아닌 컨테이너와 이 컨테이너를 어떻게 구현할 것인지가 중요하다
매개변수화 타입과 제네릭 프로그래밍
선언하기 전 지켜야 할 규칙이있다 // 자바가 인식을 하기위함이다
첫번째 규칙은 클래스를 정의할 때 지켜야 할 규칙이다
public class LinkedList{} //매개변수화 타입 필요
-> public class LinkedList<E> {} //<>안에 제네릭 타입을 넣는다
나머지 코드에서는 E를 사용하면 된다
예시
pulic void addFirst(String s) {
-> 제네릭 사용 String -> E로 변경
public void addFirst(E obj) { -> 문자열을 사용하지 않고 객체를 사용하였기 때문에 obj를 붙여준다
문자열을 반환하는 메서드
public String removeFirst()
public E removeFirst()
모두 제네릭 타입인 E로 바꿔주면 되지만, 한 가지 예외가 있다
-> 생성자가 이에 해당한다
생성자에서의 제네릭 사용
노드를 나타내는 클래스
class Node<E> {
E data; //data라는 변수에 저장
Node<E> next; //포인터 생성
java에서 생성자는 클래스와 같은 이름을 갖는다
-> 생성자에도 Node라는 이름을 붙여준다
public Node(E obj) {
data = obj;
next = null;
}
}
이 코드들의 E(element/요소)는 모두 동일하다
배열을 만드는 방법(정의하는 방법)
E[] storage = (E[]) Object[size]; //제네릭 객체를 만들어서 E의 배열로 형변환
- 객체를 정의할 때 jvm은 이 객체를 가리키는 4바이트짜리 포인터를 설정한다
- 이 포인터는 힙에 있는 공간을 가리킨다
- 객체에 필요한 만큼의 공간을 힙에서 차지하게 된다
**기본형 타입은 객체가 아니다 (객체 메서드를 상속받지 않음 )
java에는 기본형 타입뿐만 아니라
객체 버전의 기본자료형인 래퍼클래스도 존재한다
래퍼클래스 : 기본형 int -> 래퍼클래스 Integer
래퍼 클래스는 객체 버전의 기본 자료형
java는 autoboxing을 이용하여 이 둘을 적절하게 서로 바꾼다
예외 설정하기
Java는 기본적으로 lang 클래스를 불러 온다 (Exception 자동 상속)
Exception 클래스를 상속받고 생성자를 만든 후,
생성자 안에서 super를 호출하면 예외 상황에 대한 클래스를 만들 수 있다.
super : 어떤 것을 상속받았을 때 상속받은 클래스의 생성자를 호출한다는 의미이다