Post

[JAVA] 기본형과 참조형

[JAVA] 기본형과 참조형

기본형과 참조형

기본형

  • 소문자로 시작
  • 값을 직접 지정
  • null 대입 불가
  • 산술연산 가능
  • 기본형을 제외한 나머지 변수는 모두 참조형

참조형

  • 참조값(주소값)을 복사
  • 개발자가 직접 지정 가능
  • 클래스와 배열을 다룰 수 있음
  • null 대입 가능
  • 산술연산 불가
1
2
3
4
5
6
7
8
9
// 기본형
int a = 10;
a = a + 5; // 산술 연산 가능
// a = null; // 컴파일 오류

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

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

1
2
3
4
5
6
7
8
9
  //기본형 Primitive Type = 변수에 값을 직접 넣을 수 있음
int num = 1000;
long num2 = 10000000000L;
double num3 = 3.14159265359;
boolean flag = true;

//참조형 Reference Type = 참조값(주소값)을 저장해 데이터를 간접적으로 참조
Student student1;
int[] student;
  • 객체는 .(dot), 배열은 []을 사용해야 메모리에 생성된 객체를 쓸 수 있다.
  • 클래스는 대문자로 시작 클래스는 참조형
  • String → 클래스임 따라서 참조형

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

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

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

  • 기본형 → 실제 값을 복사해 대입
  • 참조형 → 변수의 참조값(주소값)을 복사해 대입
1
2
3
//기본형 대입
int a = 1;
int b = a;    //a, b 각각 다른 1
1
2
3
//참조형 대입
Student s1 = new Student();  //x001 참조값
Student s2 = s1     //참조값을 복사해 대입

기본형 변수 대입

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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출력
}

참조형 변수 대입

1
2
3
public class Data {
	int value;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
}

기본형과 메서드 호출

1
2
3
4
5
6
7
8
9
10
11
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
}

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

참조형과 메서드 호출

1
2
3
4
5
6
7
8
9
10
11
12
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(값 바뀜)
}

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

  • 기본형은 메서드 내부에서 매개변수(파라미터)의 값을 변경해도 호출자의 변수 값 영향 X
  • 참조형은 메서드 내부에서 매개변수(파라미터) 로 전달된 객체의 맴버 변수를 변경하면 호출자의 객체도 변경

변수와 초기화

맴버변수

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

지역변수

1
2
3
4
5
6
public static void main(String[] args) {
  Student student1;
  student1 = new Student();
  Student student2 = new Student();
}
//student1, student2 -> 지역 변수
1
2
3
4
5
6
7
8
9
10
11
12
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 메서드가 종료되면 없어짐.

변수의 값 초기화

  • 맴버변수 : 자동 초기화
  • 지역변수 : 직접 초기화


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

This post is licensed under CC BY 4.0 by the author.

Trending Tags