Java

레퍼런스 타입과 레퍼런스 변수

Ms.Pudding 2022. 1. 7. 03:16

A a = new A(1)
A는 레퍼렌스 타입 (객체x)
a는 레퍼렌스 변수 (객체 )

New A는 객체가 만들어지는게 아니라 , 메모리 공간을 만드는 것임 , 객체는 레퍼렌스 타입 앞에 있는 a를 객체로 부름 

A a = new A(1);
A b = a;
로 정의하면 b의 값은 A라는 메모리안에 들어감 (레퍼렌스 )
그래서 a==b true 나옴

A a = new A(1) 도 만들고,
A b = new A(1);
로 b라는 객체를 또 만들면
a==b는 false임
New 로 b가 들어갈 메모리 공간을 하나 더 만들었움
a와 b의 겂이 같아도  메모리가 다른 공간이여서 , id값은 다르게 나옴

 

Public static void Reference(){
        A a = new A(1);
        A b = a;
        b.id = 2;
        A c = b;
        c.id = 3;
        System.out.println(a.id);  
        System.out.println(b.id);
        System.out.println(c.id);    
    }

class A{
    public int id;
    A(int id){
        this.id = id;
    }
}

==> 3,3,3

레퍼렌스 타입은 같은 공간을 공유하고 있다, 만약 A라는 타입에 객체 a,b,c를 만든다면

모두 같은 공간이기 떄문에 어느 하나를 수정하면 모두의 값이 바뀌게 된다.

 

Nara Spain = new Nara();

여기서 레퍼렌스 타입은 Nara, 레퍼렌스 변수 (객체)는 Spain

 

public class Olympic {
    public static void main(String[] args){

        //referece variable( new nara까지만 ref varibale임)
        //ref는 ref를 포함하고 있는 경우도 있음 new sudo를 더해줌
        
        Nara Spain = new Nara(new Sudo("Barcelona"),1992);
        Nara Ghana = new Nara(new Sudo("Akura"));
        Nara Space = new Nara(10000000);

        String first = Spain.say();
        System.out.println(first);

        int second = Spain.date();
        System.out.println(second);

        String third = Ghana.say();
        System.out.println(third);

        int fourth = Space.date();
        System.out.println(fourth);

        


    }
}

class Nara{

    
    //private String capital = "";을 쓰려고 했는데,
    //ref 를 만들 때는 ""를 쓸 수 없음
    //""은 String에서만 쓸 수 있음
    private Sudo capital = null;
    private int year = 0;

    public Nara(Sudo capital,int year){
        this.capital = capital;
        this.year = year;
    }

    //오버로딩
    public Nara(Sudo capital){
        this.capital = capital;
    }

    public Nara(int year){
        this.year = year;
    }

    public String say(){
        return capital.capital;
    }
    public int date(){
        return year;
    }
   

}

class Sudo{
    public String capital = "";

    public Sudo(String capital){
        this.capital = capital;
    }
}

 

위의 코드에서 say()메소드의 return capital.capitald은 sudo 레퍼런스 capital 변수에서 가져오는 과정임.
레퍼렌스 변수는 이런식으로 함 !! 
 

레퍼렌스 변수를 사용하여 리스트를 만들어보자 !

 

public class SMent{

	public static void main(String[] args){

	//레퍼런스 객체 도안을 만들어줌, 아직 new SM으로 안했기 때문에 , 객체가 생성된 것이 아니다.
    List<SM> aespa = new ArrayList<SM>(); 

	//SM타입의 레퍼렌스 객체들이 생성되었다. 리스트에서 레퍼렌스 객체를 만들때는 
    //미리 new SM으로 하지않고 리스트에 넣어가면서 만들어준다. 
    aespa.add(new SM("Karina",1));
    aespa.add(new SM("Ningning",2));
    aespa.add(new SM("winter",3));
    aespa.add(new SM("giselle",4));

for(SM item : aespa){
	System.out.println(item.getName);
}

 }
}

class SM{
	private String name="";
	private int number =0 ;

	public SM(String name,int number){
		
		this.name = name;
		this.number = number;
 }
 public String getName() {
       return this.name;
   }
 
}