기본형(Primitive Type) : 변수가 값 자체를 보관
int, boolean, char, double 등
참조형(Reference Type) : 변수는 값이 보관되어 있는 영역을 가리킴(실제 값은 메모리 어딘가에 저장되어있고 변수는 그 메모리를 가리키는 역할)
Person, String, int[] 등 클래스 기반 자료형(배열을 포함한 객체 모두)
기본형 (Primitive Type)
기본형의 경우에는 변수가 값 자체를 보관
int a = 3;
int b = a;
System.out.println(a); // 3 출력
System.out.println(b); // 3 출력
a = 4;
System.out.println(a); // 4 출력
System.out.println(b); // 3 출력
b = 7;
System.out.println(a); // 4 출력
System.out.println(b); // 7 출력
먼저 a에 3이 보관되고, b에는 a의 값인 3이 복사돼서 보관된다. 그 다음에 a = 4를 하면 a만 바뀌고 b는 그대로 3이다. 마찬가지로 b = 7을 하면 b만 바뀌고 a는 그대로 4이다.
참조형 (Reference Type)
참조형의 경우에는 변수가 값 자체를 보관하는 게 아니라, 변수가 값을 '가리킨다'고 생각하자. 실제 값은 메모리의 어딘가에 저장되어 있고, 변수는 그 영역을 가리키는 역할이다.
객체
Person p1, p2;
p1 = new Person("박효신", 28);
p2 = p1;
p2.setName("이선희");
System.out.println(p1.getName());
System.out.println(p2.getName());
이선희
이선희
p1은 "박효신"이라는 이름을 가진 Person 인스턴스가 저장되어 있는 영역을 가리킨다. p2 = p1은 p2에게 같은 영역을 가리키라는 명령이다. 그 후, p2.setName("이선희")를 하면 그 영역에 있는 인스턴스의 name은 "이선희"로 바뀐다. p1, p2 모두 같은 영역을 가리키고 있으니까 두 출력 값은 모두 "이선희"로 출력된다.
배열
자바에서 배열도 객체이기 때문에 참조형이다.
int[] a = new int[3];
int[] b = a;
a[0] = 1;
b[0] = 2;
System.out.println(a[0]);
System.out.println(b[0]);
2
2
+ String은 기본형? 참조형?
Java의 String은 2가지 방식으로 생성이 가능하다.
String s1 = "hello";
String s2 = "hello";
String ss1 = new String("hello");
String ss2 = new String("hello");
즉, 바로 값을 넣는 방식과 new를 통한 생성자 방식이 있다.
이때, 차이점은 그냥 String s1 = "hello"라고 선언한 s1과 s2는 ==을 통해 물어보면 true라 출력하고,
String ss1 = new String("hello")라고 선언한 ss1과 ss2는 ==을 통해 물어보면 false라 출력한다.
System.out.println("String Test");
String s1 = "hello";
String s2 = "hello";
String ss1 = new String("hello");
String ss2 = new String("hello");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
System.out.println(ss1 == ss2);
System.out.println(ss1.equals(ss2));
위의 코드를 실행해보면, 결과 값으로 아래와 같이 나온다.
String Test
true
true
false
true
String은 기본형 변수 이기도 하면서, 참조형 변수 이기도 한 것 같다. (정말 팩트로만 따진다면 사실상 기본형 변수가 아니지만 Java에서 기본형 변수처럼 사용하도록 만들어준다) 그냥 값을 넣었을 때와 new 를 이용한 생성자 생성 방법은 조금 다르기도 하니까 알아두면 좋을 것 같다.
참조형과 기본형을 구분하는 방법은 데이터의 집합 여부이다.
데이터 1개를 나타내면 기본형, 데이터를 1개 이상 즉, 묶음으로 가지면 이것들을 모두 포함해야해서 값으로 저장할 수 없고 묶음의 주소를 기억해야 해서 참조형이 되는 것이다.
여기서 데이터의 묶음이라는 점을 주의해서 보면 데이터의 묶음 입니다. 따라서 데이터를 나타내는 하나하나의 변수들 a[0], p.name 등은 기본형이다.
'TIL > Java' 카테고리의 다른 글
[Java] 기본형vs참조형 / null 퀴즈 (0) | 2022.01.07 |
---|---|
[Java] null (0) | 2022.01.07 |
[Java] 중간고사: 문제 해결 능력 기르기_코드잇 소개 프로그램 (0) | 2022.01.07 |
[Java] 콘솔 입력 받기(Scanner) (0) | 2022.01.07 |
[Java] 중간고사: 문제 해결 능력 기르기_플로이드의 삼각형 (0) | 2022.01.06 |