9osari.log
← 목록으로

[JAVA] 기본형과 참조형

2025년 4월 2일 · #java#김영한-java-기본

기본형과 참조형

기본형

참조형

// 기본형
int a = 10;
a = a + 5; // 산술 연산 가능
// a = null; // 컴파일 오류

// 참조형
String str = "hello";
str = null; // null 대입 가능
// str = str + 10; // 가능하긴 하지만, 내부적으로는 객체끼리의 연산 처리

!!!기본형은 사용하는 값을 복사해 전달하고 참조형은 참조값(주소값)을 복사해 전달!!!

  //기본형 Primitive Type = 변수에 값을 직접 넣을 수 있음
int num = 1000;
long num2 = 10000000000L;
double num3 = 3.14159265359;
boolean flag = true;

//참조형 Reference Type = 참조값(주소값)을 저장해 데이터를 간접적으로 참조
Student student1;
int[] student;

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

자바는 항상 변수의 값을 복사해 대입

자바에서 변수에 값을 대입하는 것은 변수에 들어 있는 값을 복사해 대입하는 것.

//기본형 대입
int a = 1;
int b = a;    //a, b 각각 다른 1
//참조형 대입
Student s1 = new Student();  //x001 참조값
Student s2 = s1     //참조값을 복사해 대입

기본형 변수 대입

public static void main(String[] args) {
  int a = 10;
  int b = a;
  System.out.println("a = " + a); //10 출력
  System.out.println("b = " + b); //10 출력
  //a 변경
  a = 20;
  System.out.println("a = " + a); //20 출력
  System.out.println("b = " + b); //10 출력
  //b 변경
  b = 30;
  System.out.println("a = " + a); //20출력
  System.out.println("b = " + b); //30출력
}

참조형 변수 대입

public class Data {
	int value;
}
public static void main(String[] args) {
  Data dataA = new Data(); //dataA는 참조값 x001 가짐
  dataA.value = 10; // x001.value = 10
  Data dataB = dataA; // dataB는 참조값 x001 가짐

  System.out.println("dataA 참조값=" + dataA); //x001 출력
  System.out.println("dataB 참조값=" + dataB); //x001 출력
  System.out.println("dataA.value = " + dataA.value);  //10 출력
  System.out.println("dataB.value = " + dataB.value);  //10 출력
  //dataA 변경
  dataA.value = 20; //x001.value 가 20으로 변경

  System.out.println("dataA.value = " + dataA.value); //20 출력
  System.out.println("dataB.value = " + dataB.value); //20 출력
  //dataB 변경
  dataB.value = 30; //x001.value 가 30으로 변경

  System.out.println("dataA.value = " + dataA.value); //30
  System.out.println("dataB.value = " + dataB.value); //30
}

기본형과 메서드 호출

public static void main(String[] args) {
  int a = 10;
  System.out.println("메서드 호출 전: a = " + a); //10 출력
  changePrimitive(a); //a에 값을 복사해 전달
  System.out.println("메서드 호출 후: a = " + a); //10 출력 (변화X)
}


static void changePrimitive(int x) {
  x = 20; //x는 a의 복사본인데, main의 a에게 영향 X
}

자바의 기본형은 무조건 값 복사다.

참조형과 메서드 호출

public static void main(String[] args) {
  Data dataA = new Data(); //dataA는 x001
  dataA.value = 10; //x001.value = 10
  System.out.println("메서드 호출 전: dataA.value = " + dataA.value); //10출력
  changeReference(dataA); //dataA의 참조값 x001을 전달
  System.out.println("메서드 호출 후: dataA.value = " + dataA.value); //20출력
}

static void changeReference(Data dataX) {
//x001을 매개변수로 받아옴
  dataX.value = 20; //x001.value = 20(값 바뀜)
}

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

변수와 초기화

맴버변수

public class Student {
  String name;
  int age;
  int grade;
}
//클래스에 선언된 변수는 맴버 변수

지역변수

public static void main(String[] args) {
  Student student1;
  student1 = new Student();
  Student student2 = new Student();
}
//student1, student2 -> 지역 변수
public static void main(String[] args) {
  int a = 10;
  System.out.println("메서드 호출 전: a = " + a);
  changePrimitive(a);
  System.out.println("메서드 호출 후: a = " + a);
}

public static void changePrimitive(int x) {
  x = 20;
}

//매개변수 a,x 는 지역변수임.

지역변수는 말 그대로 그 지역에서만 사용되는 변수

변수 x는 changePrimitive 에서만 사용되고 changePrimitive 메서드가 끝나면 제거됨. 변수 a도 main 메서드가 종료되면 없어짐.

변수의 값 초기화


🔗 문제 글 바로가기: 기본형과 참조형 예상질문
출처: 김영한의 실전 자바 - 기본편

···
← PREV [JAVA] 클래스와 객체 NEXT → [JAVA] 객체지향 프로그래밍