참조(2/4) : 참조란 ?
class A {
public int id;
A(int id) {
this.id = id;
}
}
- 기본데이터타입
public static void runVale(){
int a = 1;
int b = a; 여기 a는 a를 복제한것
/* 그림 예 )
a b
복제
1 -> 1
b = 2; 따라서 b에 2를 넣으면 a는 바뀌지않음( 복제해서 사용했으니까 )
System.out.println("runValue, " + a) ;
}
-참조형 데이터 타입 , new 로 객체를 만드는 데이터 타입, 일반형이 아닌 데이터 타입
public static void runReference() {
A a = new A(1);
A b = a; 참조형 타입은 다름 : a를 복제한 것이 아니라 주소값을 참조하고 있는 것
b.id = 2; -> b에 있는 id에 2를 넣어줬지만 a와 b 가 참조하고 있는 주소는 동일해서
a에있는 id 도 변경이 된다.
/* 그림
a -> A
b -> 인스턴스
System.out.println("runReference, " + a.id) ; -> a.id 는 2
또다른 예 )
A a = new A(1);
A b = a ;
b = new A(2); -> b는 A(2) 라는 새로운 주소가 생겨서 a 와 주소가 달라짐 각자 다른 인스턴스를 가리키게 된다. b 값을 여러번 바꿔도 a 값에 변화가 생기지 않는다.
또 다른 예 )
public class ReferenceParameterDemo {
static void _value ( int b ) {
b = 2;
}
static void runValue() {
int a = 1 ;
_value(a);
System.out.println("runValue, " + a ) ; // a에대한 부분은 변경되지 않는다.
}
static void _reference1 ( A b ) {
b = new A(2);
}
static void runReference1 () {
A a = new A(1);
_reference1 (a);
System.out.println("runReference1, " + a.id ) ; ( 1 출력 변경되지 않은값)
}
static void _reference2 ( A b ) {
b.id = 2;
}
static void runReference2 () {
A a = new A (1);
_reference2(a);
System.out.println("runReference2, " + a.id ) ; -> 2 가 출력 ( 변경된값)
}
제네릭
제네릭 ( 1/5 ) : 제네릭의 사용
제네릭 : 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미한다.
나중에 인스턴스생성할때 확정하는것.
제네릭 ( 2/5 ) : 제네릭의 사용 이유
class 내부에서 사용할 데이터 타입 -> 나중에 인스턴스를 사용할 때 확정
class Person <T> {
public T info; //클래스 infor 의 타입을 클래스를 만들때 명시적으로 지정하지 않았다. 나중에 객체생성(인스턴스화)할때 그 타입을 지정해준다.
}
Person<String> p1 = new Person<String> ();
Person 을 객체생성(인스턴스화)을 할 때 (p1) String 타입으로 해줌 -> 위에 Person 클래스의 <T> 도 String타입이 되고 infot 의 타입도 자연스레 String 이 됨
-> p1 의 테이터 타입은 인스턴스의 데이터타입과 일치해야 하기때문에 p1의 데이터타입도 String 데이터타입.
Person<StringBuilder> p2 = new Person<StringBuilder>();
이때는 Person<StringBuilder> 격이 되고 infor 도 StrinBuilder 타입인거고 p2도 StrongBuilder 타입이 된다.
p1과 p2의 차이는 p1은 infor 가 String 타입이고 p2는 info 가 StringBuilder 타입이다.
댓글
댓글 쓰기