오늘 배운 내용
- Java : 참조, 제네릭(Generic), Collections Farmework
새로 알게된 내용
참조와 복제
우선, 다음의 구문의 차이점을 생각해보자.
int a = 1;
A a = new A(1);
전자는 데이터형이 int이고, 후자의 데이터형은 A이다.
int는 기본 데이터형, A는 기본 데이터형이 아니므로 참조 데이터형이다.
기본형과 참조형의 차이는 다음에서 확인 !
여기서 차이가 발생하는데, 기본데이터형에서는 복제가 되고, 참조 데이터형에서는 참조가 된다. 다음을 확인하자.
1) 복제란?

2) 참조(reference)란?

참조는 복제와는 다르게 값을 그대로 따라가는 것이 아니라, 같은 인스턴스를 공유하는 것이다.
복제와는 다르게 참조에서는 같은 인스턴스를 공유하므로 당연히 차이점이 있을텐데
큰 차이점으로는 b의 값을 변경하면 a의 값이 복제에서는 바뀌지 않지만, 참조에서는 바뀐다.
제네릭 (Generic)이란?
제네릭이란 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미한다.
다음 코드를 보면,
class Person<T>{
public T info;
}
public class GenericDemo {
public static void main(String[] args) {
Person<String> p1 = new Person<String>();
Person<StringBuilder> p2 = new Person<StringBuilder>();
}
}
여기서 차이점은 각각의 인스턴스를 생성할 때 사용한 <> 사이에 어떤 데이터 타입을 사용했는가이다.
class Person<T>{
public T info;
}
여기서 info라는 필드는 T라는 데이터 타입을 갖는다. 여기서 T라는 데이터 타입은 Person이라는 클래스 옆에 <>안에 지정이 되어있고, 이 T라는 데이터 타입은 위에서 언급했듯이 각각의 인스턴스를 생성할 때 사용한 <> 사이의 데이터 타입을 따라간다. 즉,
Person<String> p1 = new Person<String>();
여기서 T는 String의 데이터 타입을 갖고,
Person<StringBuilder> p2 = new Person<StringBuilder>();
여기서 T는 StringBuilder의 데이터 타입을 갖는다.
정리해보면 p1.info와 p2.info의 데이터 타입은 아래와 같다.
- p1.info : String
- p2.info : StringBuilder
제네릭을 사용하는 이유는?
제네릭을 사용하는 이유는 다음과 같이 정리할 수 있다.
- 중복되는 코드를 제거해주기 때문에 코드의 가독성을 높여준다.
- 제네릭의 데이터 타입은 참조형만 가능한데, 이는 컴파일 단계에서 오류를 검출할 수 있게한다.
- 즉, 런타임 단계가 아니기 때문에 비교적 안정성이 높아진다.
제네릭의 특성
1) 복수의 제네릭을 사용할 수 있다.
class Person<T, S>{
public T info;
public S id;
Person(T info, S id){
this.info = info;
this.id = id;
}
위와 같이 복수의 제네릭은 서로 이름이 다르고 쉼표로 구분해서 사용할 수 있다.
2) 제네릭의 데이터 타입은 참조형만 가능하다.
즉, 기본형을 사용하기 위해서는 Wrapper class를 사용해야한다. 래퍼클래스에 관한 내용은 여기 확인 !
3) 제네릭은 생략해서 사용 가능하다. (Java가 인식하는 경우에 !)
EmployeeInfo e = new EmployeeInfo(1);
Integer i = new Integer(10);
Person<EmployeeInfo, Integer> p1 = new Person<EmployeeInfo, Integer>(e, i);
Person p2 = new Person(e, i);
//자바는 생성자의 매개변수를 통해 제네릭을 인식할 수 있음 !! 따라서 생략이 가능하다!
4) 제네릭은 메소드에 적용할 수 있다.
public <U> void printInfo(U info){
System.out.println(info);
}
제네릭의 제한
제네릭으로 올 수 있는 데이터 타입을 특정 클래스의 자식으로 제한할 수 있다.
package org.opentutorials.javatutorials.generic;
abstract class Info{
public abstract int getLevel();
}
class EmployeeInfo extends Info{
public int rank;
EmployeeInfo(int rank){ this.rank = rank; }
public int getLevel(){
return this.rank;
}
}
class Person<T extends Info>{
public T info;
Person(T info){ this.info = info; }
}
public class GenericDemo {
public static void main(String[] args) {
Person p1 = new Person(new EmployeeInfo(1));
Person<String> p2 = new Person<String>("부장");
}
}
여기서
class Person<T extends Info>{
이 부분을 확인해보면 Person의 T는 Info 클래스나 그 자식 이외는 올 수 없다.
//extends는 상속뿐 아니라 구현의 관계에서도 사용할 수 있다.
느낀점
오늘 드디어 생활코딩 Java 입문 수업을 완강했다.
완강을 했어도 아직 많이 부족하지만.. 이제 본격적으로 프로그래밍의 길에 들어선 것 같아서 참 뿌듯하고 기쁜 하루였던 것 같다.앞으로 모르는 부분이 있을 때, 부족하다고 생각할 때 계속 찾아가서 복습해야겠다.
그리고 꼭 성공해서 생활코딩님께 보답하자...!
이제 Java의 정석 공부하쟈..ㅎㅅㅎ
참고
'TIL&WIL' 카테고리의 다른 글
| 2023-05-02 TIL (Java : Math 클래스) (0) | 2023.05.02 |
|---|---|
| 2023-05-01 TIL (Java : JVM, 변수, 형변환) (0) | 2023.05.01 |
| 2023-04-27 TIL (Java : Object, enum) (0) | 2023.04.27 |
| 2023-04-26 TIL (Java : 예외) (0) | 2023.04.26 |
| 2023-04-25 TIL (Java : 인터페이스, 다형성) (0) | 2023.04.25 |