ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 기본형과 참조형
    JAVA 2024. 5. 5. 05:28

     

    자바는 항상 변수의 값을 복사해서 대입한다.

     

     

    출처: https://javarevisited.blogspot.com/2015/09/difference-between-primitive-and-reference-variable-java.html

     

     

    기본형

    • 변수에 들어 있는 실제 사용하는 값을 복사해서 대입
    • 건물을 복제

     

     

    참조형(Reference Type)

    • Student student1, int[] students와 같이 데이터에 접근하기 위한 참조(위치, 주)를 저장하는 데이터.
    • 기본형이 실제 사용하는 객체를 이용한다면, 참조형은 객체의 위치를 가리키는 참조값만 복사한다.
    • 객체는 .(dot)으로, 배열은 []을 통해 메모리 상에 생성된 것을 사용할 수 있다.
    • 건물로 가는 길을 복제
    • 기본값 null
    • 인스턴스를 복사하는 것이 아니라, 인스턴스를 가리키는 참조값을 복사해서 전달하는 것이다. 따라서 하나의 인스턴스를 여러곳에서 참조할 수 있다. 

     

    Studnet s1 = new Studne();
    Student s2 = s1;
    • 참조형은 기본형처럼 실제 사용하는 객체가 아니라 객체의 위치를 가리키는 참조값만 복사된다. 

     

     

     

    따라서 메서드의 호출과정도 기본형과 참조형은 상이하다. 

     

    • 기본형: 메서드 내부에서 매개변수(파라미터)의 값을 변경해도, 호출자의 변수 값에는 영향이 없다. 왜냐하면 값이 복사되어 전달되기 때문에 메서드 내부에서 변경된 값은 호출자의 변수와는 별개의 메모리 공간에 저장되기 때문이다.
    public class MethodChange1 {
     	public static void main(String[] args) {
        
    		 int a = 10;
             
     		System.out.println("메서드 호출 전: a = " + a);
            
     			changePrimitive(a);
                
     		System.out.println("메서드 호출 후: a = " + a);
            
    	 }
     		static void changePrimitive(int x) {
     			x = 20;
     	}
    }

     

    a의 값은 메서드 호출 전후 모두 10이고, x는 20이다. 

     

     

    • 참조형: 메서드 내부에서 매개변수(파라미터)로 전달된 객체의 멤버 변수를 변경하면, 호출자의 객체도 변경된다. 왜냐하면 같은 객체를 가리키는 참조값이 복사되어 전달되었기 때문에, 메서드 내부에서의 변경은 호출자의 객체에도 영향을 미치기 때문이다. (같은 인스턴스를 참조하게 되니까!)

     

    Data.java

    public class Data {
     int value;
    }
     

    VarChange2.java

    public class VarChange2 {
    	 public static void main(String[] args) {
     		Data dataA = new Data();
    		dataA.value = 10;
     		Data dataB = dataA;
     			System.out.println("dataA 참조값=" + dataA);
    			System.out.println("dataB 참조값=" + dataB);
    			System.out.println("dataA.value = " + dataA.value);
     			System.out.println("dataB.value = " + dataB.value);
                
     //dataA 변경
     dataA.value = 20;
     System.out.println("변경 dataA.value = 20");
     System.out.println("dataA.value = " + dataA.value);
     System.out.println("dataB.value = " + dataB.value);
     
     //dataB 변경
     dataB.value = 30;
     System.out.println("변경 dataB.value = 30");
     System.out.println("dataA.value = " + dataA.value);
     System.out.println("dataB.value = " + dataB.value);
     }
    }
     
    실행 결과

    dataA 참조값=ref.Data@x001

    dataB 참조값=ref.Data@x001
    dataA.value = 10
    dataB.value = 10
    변경 dataA.value = 20
    dataA.value = 20dataB.value = 20
    변경 dataB.value = 30
    dataA.value = 30
    dataB.value = 30

    'JAVA' 카테고리의 다른 글

    반환(return)은 왜 할까?  (0) 2024.05.07
    클래스 변수, 인스턴스 변수, 지역 변수  (0) 2024.05.06
    클래스, 객체(인스턴스)  (0) 2024.05.05

    댓글

Designed by Tistory.