ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 기본형 과 참조형
    Java & Spring 2024. 6. 12. 18:33

    대원칙: 자바는 항상 변수의 값을 복사해서 대입한다.
    자바에서 변수에 값을 대입하는 것은 변수에 들어 있는 값을 복사해서 대입하는 것이다.
    기본형, 참조형 모두 항상 변수에 있는 값을 복사해서 대입한다. 기본형이면 변수에 들어 있는 실제 사용하는 값을 복사 해서 대입하고, 참조형이면 변수에 들어 있는 참조값을 복사해서 대입한다.

    • 기본형(Primitive Type): int , long , double , boolean 처럼 변수에 사용할 값을 직접 넣을 수 있는 데이 터 타입을 기본형이라 한다.
    •  
    • 참조형(Reference Type): Student student1 , int[] students 와 같이 데이터에 접근하기 위한 참조 (주소)를 저장하는 데이터 타입을 참조형이라 한다. 참조형은 객체 또는 배열에 사용된다.

      String은 클래스이다. 따라서 참조형이다. 하지만 기본형처럼 문자 값을 바로 대입할 수 있다. 문자를 자주 사용하기 때문에 자바에서 특별하게 편의 기능을 제공하는 것이다.

    요약하면 기본형 변수에는 직접 사용할 수 있는 값이 들어있지만 참조형 변수에는 위치(참조값)가 들어가 있다.

    • 기본형은 연산이 가능하지만 참조형은 연산이 불가능하다. 그 이유는 기본형은 변수에 실제 사용하는 값이 들어있는 반면 참조형은 변수에 객체의 위치인 참조값이 들어가 있기 때문이다.
      참조형은 .을 통해 멤버 변수에 접근하여 연산이 가능하다.
    기본형
    int a = 10, b = 20;
    int sum = a + b;
    
    참조형
    Student s1 = new Student();
    Student s2 = new Student();
    s1 + s2 //오류가 발생한다.
    
    참조형 .을 통한 멤버변수에 접근하여 연산
    Student s1 = new Student();
     s1.grade = 100;
     Student s2 = new Student();
     s2.grade = 90;
    int sum = s1.grade + s2.grade; //연산 가능

    메서드 호출도 마찬가지이다. 메서드를 호출할 때 사용하는 매개변수(파라미터)도 결국 변수일 뿐이다. 따라서 메서드 를 호출할 때 매개변수에 값을 전달하는 것도 앞서 설명한 내용과 같이 값을 복사해서 전달한다.

    기본형과 메서드 호출 
    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
    메서드 호출 후: a = 10

    메서드를 호출할 때 매계변수 x 에변수 a 의값을전달한다. 이 코드는 다음과 같이 해석할 수 있다int x =
    자바에서 변수에 값을 대입하는 것은 항상 값을 복사해서 대입한다. 따라서 변수 a , x 각각 숫자 10 을가지고 있다.

    참조형과 메서드 호출
    
    public class MethodChange2 {
    	public static void main(String[] args) {
    		Data dataA = new Data();
    		dataA.value = 10;
    		System.out.println("메서드 호출 전: dataA.value = " + dataA.value); 
            changeReference(dataA);
    		System.out.println("메서드 호출 후: dataA.value = " + dataA.value); 
        }
         
         static void changeReference(Data dataX) {
             dataX.value = 20;
    }
    
    실행결과
    메서드 호출 전: dataA.value = 10 
    메서드 호출 후: dataA.value = 20

    메서드 호출

    메서드를 호출할 때 매계변수 dataX 에 변수 dataA의 값을 전달한다.
    Data dataX = dataA
    자바에서 변수의 값을 대입하는 것은 항상 값을 복사해서 대입, 변수 dataA는 참조값 x001 을 가지고 있으므로 참조값을 복사해서 전달했다. 따라서 변수 dataA, dataX 둘다 같은 참조값인 x001을 가지게 된다.

    메서드 안에서 값을 변경

    메서드 안에서 dataX.value = 20 으로 새로운 값을 대입하게 되면 참조값을 통해 x001 인스턴스에 접근하고 그 안에 값을 20으로 변경한다. dataA, dataX 둘다 같은 x001 인스턴스를 참조하기 때문에 dataA.value와 dataX.value는 둘다 20이란 값을 가진다.

    기본형과 참조형의 메서드 호출
    자바에서 메서드의 매개변수(파라미터)는 항상 값에 의해 전달된다. 그러나 이 값이 실제 값이냐, 참조(메모리 주소)값 이냐에 따라 동작이 달라진다.

    • 기본형: 메서드로 기본형 데이터를 전달하면, 해당 값이 복사되어 전달된다. 이 경우, 메서드 내부에서 매개변수 (파라미터)의 값을 변경해도, 호출자의 변수 값에는 영향이 없다.
    • 참조형: 메서드로 참조형 데이터를 전달하면, 참조값이 복사되어 전달된다. 이 경우, 메서드 내부에서 매개변수(파 라미터)로 전달된 객체의 멤버 변수를 변경하면, 호출자의 객체도 변경된다.

     

    'Java & Spring' 카테고리의 다른 글

    테스트 코드  (0) 2024.06.13
    자바 클래스  (0) 2024.06.11
    JVM(Java Virthal Machine)  (0) 2023.12.28
    오버로딩 (Overloading) , 오버라이딩 (Overriding) 차이점  (0) 2023.12.26
    자바(java) - 상속(inheritance) / extends  (1) 2023.12.08
Designed by Tistory.