[자바] 기본형vs참조형

brand_mins·2024년 1월 11일

Java

목록 보기
38/47

1. 기본형 vs 참조형

1) 기본형

  • int, long, double, boolean처럼 변수에 직접 사용할 수 있는 값
  • 기본형은 들어있는 값을 그대로 계산한다.
int a = 10;
int b = 20;
int sum = a+b;

2) 참조형

  • 참조형: Student student1, int[] students와 같이 데이터에 접근하기 위한 참조값을 저장하는 데이터 타입
  • 참조형은 객체와 배열이 있고 .(주소 연산자)를 통해서 메모리 상에 객체 접근
  • 들어있는 참조값을 그대로 사용한다. 연산 불가능
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;

(1) String

  • String은 클래스이고 참조형이다.

2. 기본형vs참조형-변수 대입

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

1) 기본형

  • 실제 사용하는 값을 복사해서 대입한다.
int a = 10;
int b = a;
  • 코드 예시는 다음과 같다.
package ref;

public class VarChange1 {

    public static void main(String[] args) {
        int a = 10;
        int b = a;
        System.out.println("a = " + a);
        System.out.println("b = " + b);

        // 변경
        a = 20;
        System.out.println("a = " + a);
        System.out.println("b = " + b);

        b = 30;
        System.out.println("a = " + a);
        System.out.println("b = " + b);

    }
}

(1) 분석

  • 10 값은 a에 대입되고 a의 10은 b값으로 대입한다.
  • a값이 변경되었을때 a값은 변경된 값으로 b는 그대로 값을 유지한다.
  • b값이 변경되었을때 b값은 변경된 값으로 a는 그대로 값을 유지한다.

2) 참조형

  • 변수에 들어있는 참조값을 그대로 사용한다.
  • 즉, 기본형처럼 실제 사용하는 값이 아닌 사용하는 위치의 참조값을 복사하여 대입됨
Student s1 = new Student();
Student s1 = s1;
package ref;

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: " + dataA.value);
        System.out.println("dataA.value = " + dataA.value);
        System.out.println("dataB.value = " + dataB.value);

        // dataB 변경
        dataB.value = 30;
        System.out.println("변경된 dataB value: " + dataB.value);
        System.out.println("dataA.value = " + dataA.value);
        System.out.println("dataB.value = " + dataB.value);
    }
}
  • Data dataA = new Data();
- 새 데이터를 생성하여 메모리에 참조값이 부여되고 그 참조값을 Data타입의 data1 변수에 대입
  • Data dataB = dataA;
- dataA의 참조값은 dataB에 복사된다.
- 즉, 두개의 인스턴스가 아닌 하나의 인스턴스가 된다.

3. 기본형vs참조형-메서드 호출

  • 자바에서는 변수의 값을 대입하는 것은 변수에 있는 값을 복사해서 대입한다.
  • 메서드 호출도 사용하는 매개변수(파라미터)도 변수이다.

1) 기본형

package ref;

public class MethodChange1 {
    public static void main(String[] args) {
        int a = 10;
        System.out.println("메서드 호출 전: " + a);
        changePrimitive(a);
        System.out.println("메서드 호출 후: " + a);
    }

    static void changePrimitive(int x) {
        x = 20;
    }
}
  • 기본형은 메서드로 데이터를 전달하면 해당 값이 복사되어 전달되지만 파라미터 값을 변경해도 호출했을 때 영향이 없다.

2) 참조형

package ref;

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값이 변경되었다면 호출했을 때 변경된 값으로 바뀐다.
profile
IT 개발자가 되기 위한 기록

0개의 댓글