[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.