2020.11.02 생활코딩 유투브 공부 ( 모든 출처 : 유투버 생활코딩 ) 142 ~

참조(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          ->        

        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 타입이다. 














댓글