본문 바로가기
Java

Java 기본 - 기본형과 참조형

by KongJiHoon 2024. 12. 4.

** 변수의 데이터 타입을 가장 크게 보면 기본형참조형으로 분류할 수 있다.

 

1. 기본형

  • int, long, double, boolean등 처럼 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입
  • 기본형은 연산 가능, 참조형은 연산 불가능
  •  
 int a = 10, b = 20;
 int sum = a + b;

2. 참조형

  • 객체(ex) Student student) 및 배열(int[] arr)과 같이 데이터에 접근하기 위한 참조값(주소)를 저장하는 데이터 타입
  • 객체는 .(dot), 배열은 []를 통해서 메모리 상에 지정된 주소를 찾아가야 사용가능.
  • 기본형을 제외한 나머지는 모두 참조형이다.

 

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

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

** 참조형의 경우 실제 사용하는 객체가 아니라 객체의 위치를 가리키는 참조값(주소)가 복사된다.

ex)

Student s1 = new Student(); // 예를들어 주소값 x001
Student s2 = s1; -> s2가 가리키는 주소값 또한 x001

 

 

참조형과 변수 대입

 

예시코드)

 

Data

public class Data {
	int value;
}

 

VarChange2

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 = 20
 dataB.value = 20
변경 dataB.value = 30
 dataA.value = 30
 dataB.value = 30

 

  • Data dataA = new Data()를 통하여 객체를 생성하였고 dataB에 dataA를 가리키고 있는 참조값을 복사해주었다.
  • 따라서 두 객체가 가리키는 주소값이 같기 때문에 둘 중 하나에 객체에 접근에 값을 바꿔주면 동일한 값이 출력된다.

 

 

기본형 vs 참조형 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.value = 10
메서드 호출 후: dataA.value = 20

 

 

  • 위 코드에서는 메서드를 호출할 때 매게변수 dataX에 변수 dataA의 값을 전달한다.
  • 메서드 호출 시 dataA는 참조값을 dataX에 전달했기 때문에 dataX를 통해서도 dataA에 있는 객체에 접근하여 값을 변경할 수 있다.

기본형과 참조형의 메서드 호출

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

 

Null

** 값이 존재하지 않는, 없다는 뜻이다.

 

NullPointerException

  • 이름 그대로 Null을 가리키다인데, 이때 발생하는 예외다. 결국 참조값(주소)이 없는 곳을 찾아갈 때 발생하는 예외이다.  

 

예시코드)

public class NullMain2 {
 
 public static void main(String[] args) {
 		Data data = null;
       		data.value = 10;// NullPointerException 예외 발생
		System.out.println("data = " + data.value);
    }
 }

 

  • 위 코드에서는 data가 가리키는 주소가 null이기 때문에 data안의 value에 접근할 수가 없다. 따라서 NullPointerExceoption이 발생한다.

'Java' 카테고리의 다른 글

Java 기본 - 생성자  (0) 2024.12.08
Java 기본 - 객체지향 프로그래밍  (1) 2024.12.07
Java 기본 - 클래스(배열)  (0) 2024.11.19
Java 기본 - 클래스, 객체, 인스턴스  (0) 2024.11.11
StringBuilder  (0) 2024.09.12