2 기본형과 참조형

 1  2 기본형과 참조형-1
 2  2 기본형과 참조형-2
 3  2 기본형과 참조형-3
 4  2 기본형과 참조형-4
 5  2 기본형과 참조형-5
 6  2 기본형과 참조형-6
 7  2 기본형과 참조형-7
 8  2 기본형과 참조형-8
 9  2 기본형과 참조형-9
 10  2 기본형과 참조형-10
 11  2 기본형과 참조형-11
 12  2 기본형과 참조형-12
 13  2 기본형과 참조형-13
 14  2 기본형과 참조형-14
 15  2 기본형과 참조형-15
 16  2 기본형과 참조형-16
 17  2 기본형과 참조형-17
 18  2 기본형과 참조형-18
 19  2 기본형과 참조형-19
 20  2 기본형과 참조형-20
※ 미리보기 이미지는 최대 20페이지까지만 지원합니다.
  • 분야
  • 등록일
  • 페이지/형식
  • 구매가격
  • 적립금
자료 다운로드  네이버 로그인
소개글
2 기본형과 참조형에 대한 자료입니다.
본문내용
2. 기본형과 참조형
#1.인강/0.자바/2.자바-기본
[[/기본형 vs 참조형1 - 시작]]
[[/기본형 vs 참조형2 - 변수 대입]]
[[/기본형 vs 참조형3 - 메서드 호출]]
[[/참조형과 메서드 호출 - 활용]]
[[/변수와 초기화]]
[[/null]]
[[/NullPointerException]]
[[/문제와 풀이]]
[[/정리]]
기본형 vs 참조형1 - 시작
**자바에서 참조형을 제대로 이해하는 것은 정말 중요하다.**
지금까지 기본형과 참조형에 대해서 조금씩 보았다. 이번에는 기본형과 참조형에 대해서 더 깊이있게 알아보고 확실하
게 정리해보자.
변수의 데이터 타입을 가장 크게 보면 기본형과 참조형으로 분류할 수 있다. 사용하는 값을 변수에 직접 넣을 수 있는 기
본형, 그리고 이전에 본 `Student student1 `과 같이 객체가 저장된 메모리의 위치를 가리키는 참조값을 넣을 수 있
는 참조형으로 분류할 수 있다.
기본형(Primitive Type): `int`, `long `, `double `, `boolean `처럼 변수에 사용할 값을 직접 넣을 수 있는 데이
터 타입을 기본형이라 한다.
참조형(Reference Type): `Student student1 `, `int[] students `와 같이 데이터에 접근하기 위한 참조
(주소)를 저장하는 데이터 타입을 참조형이라 한다. 참조형은 객체 또는 배열에 사용된다.
쉽게 이야기해서 기본형 변수에는 직접 사용할 수 있는 값이 들어있지만 참조형 변수에는 위치(참조값)가 들어가 있다.
참조형 변수를 통해서 뭔가 하려면 결국 참조값을 통해 해당 위치로 이동해야 한다.
**기본형 vs 참조형 - 기본**
기본형은 숫자 `10`, `20`과 같이 실제 사용하는 값을 변수에 담을 수 있다. 그래서 해당 값을 바로 사용할 수 있다.
참조형은 실제 사용하는 값을 변수에 담는 것이 아니다. 이름 그대로 실제 객체의 위치(참조, 주소)를 저장한다. 참
조형에는 객체와 배열이 있다.
객체는 `.`(dot)을 통해서 메모리 상에 생성된 객체를 찾아가야 사용할 수 있다.
배열은 `[]`를 통해서 메모리 상에 생성된 배열을 찾아가야 사용할 수 있다.
**기본형 vs 참조형 - 계산**
기본형은 들어있는 값을 그대로 계산에 사용할 수 있다.
예) 더하고 빼고, 사용하고 등등, (숫자 같은 것들은 바로 계산할 수 있음)
참조형은 들어있는 참조값을 그대로 사용할 수 없다. 주소지만 가지고는 할 수 있는게 없다. 주소지에 가야 실체가
있다!
예) 더하고 빼고 사용하고 못함! 참조값만 가지고는 계산 할 수 있는 것이 없음!
기본형은 연산이 가능하지만 참조형은 연산이 불가능하다.
```java
int a = 10, b = 20;
int sum = a + b;
```
기본형은 변수에 실제 사용하는 값이 담겨있다. 따라서 `+`, `-`와 같은 연산이 가능하다.
```java
Student s1 = new Student();
Student s2 = new Student();
s1 + s2 //오류 발생
```
참조형은 변수에 객체의 위치인 참조값이 들어있다. 참조값은 계산에 사용할 수 없다. 따라서 오류가 발생한다.
물론 다음과 같이 `.`을 통해 객체의 기본형 멤버 변수에 접근한 경우에는 연산을 할 수 있다.
```java
Student s1 = new Student();
s1.grade = 100;
Student s2 = new Student();
s2.grade = 90;
int sum = s1.grade + s2.grade; //연산 가능
```
**쉽게 이해하는 팁**
기본형을 제외한 나머지는 모두 참조형이다.
기본형은 소문자로 시작한다. `int`, `long `, `double `, `boolean ` 모두 소문자로 시작한다.
기본형은 자바가 기본으로 제공하는 데이터 타입이다. 이러한 기본형은 개발자가 새로 정의할 수 없다. 개발
자는 참조형인 클래스만 직접 정의할 수 있다.
클래스는 대문자로 시작한다. `Student `
클래스는 모두 참조형이다.
**참고 - String**
자바에서 `String `은 특별하다. `String `은 사실은 클래스다. 따라서 참조형이다. 그런데 기본형처럼 문자 값을 바로
대입할 수 있다. 문자는 매우 자주 다루기 때문에 자바에서 특별하게 편의 기능을 제공한다. `String `에 대한 자세한 내
용은 뒤에서 설명한다.
기본형 vs 참조형2 - 변수 대입
**대원칙: 자바는 항상 변수의 값을 복사해서 대입한다.**
자바에서 변수에 값을 대입하는 것은 변수에 들어 있는 값을 복사해서 대입하는 것이다.
기본형, 참조형 모두 항상 변수에 있는 값을 복사해서 대입한다. 기본형이면 변수에 들어 있는 실제 사용하는 값을 복사
해서 대입하고, 참조형이면 변수에 들어 있는 참조값을 복사해서 대입한다.
이 대원칙을 이해하면 복잡한 상황에도 코드를 단순하게 이해할 수 있다.
**기본형 대입**
```java
int a = 10;
int b = a;
```
**참조형 대입**
```java
Student s1 = new Student();
Student s2 = s1;
```
기본형은 변수에 값을 대입하더라도 실제 사용하는 값이 변수에 바로 들어있기 때문에 해당 값만 복사해서 대입한다고
생각하면 쉽게 이해할 수 있다. 그런데 **참조형의 경우 실제 사용하는 객체가 아니라 객체의 위치를 가리키는 참조값만
복사**된다. 쉽게 이야기해서 실제 건물이 복사가 되는 것이 아니라 건물의 위치인 주소만 복사되는 것이다. 따라서 같은
건물을 찾아갈 수 있는 방법이 하나 늘어날 뿐이다.
구체적인 예시를 통해서 변수 대입시 기본형과 참조형의 차이를 알아보자.
기본형과 변수 대입
다음 코드를 보고 어떤 결과가 나올지 먼저 생각해보자. 너무 쉽고 당연한 내용이지만, 이후에 나올 참조형과 비교를 위
해서 다시 한번 정리해보자.
**VarChange1**
```java
package ref;
public class VarChange1 {
public static void main(String[] args) {
int a = 10;
int b = a;
System.out.println("a = " + a);
System.out.println("b = " + b);
//a 변경
a = 20;
System.out.println("변경 a = 20");
System.out.println("a = " + a);
System.out.println("b = " + b);
//b 변경
b = 30;
System.out.println("변경 b = 30");
System.out.println("a = " + a);
System.out.println("b = " + b);
}
}
```
**실행 결과**
```
a = 10
b = 10
변경 a = 20
a = 20
b = 10
변경 b = 30
a = 20
b = 30
```
그림을 통해 자세히 알아보자.
**int a = 10**
**int b = a**
**실행 결과**
```
a = 10
b = 10
```
변수의 대입은 변수에 들어있는 값을 복사해서 대입한다. 여기서는 변수 `a`에 들어있는 값 `10`을 복사해서 변수 `b`에
대입한다. 변수 `a` 자체를 `b`에 대입하는 것이 아니다!
**a = 20**
**실행 결과**
```
a = 10
b = 20
```
변수 `a`에 값 `20`을 대입했다. 따라서 변수 `a`의 값이 `10`에서 `20`으로 변경되었다. 당연한 이야기지만 변수 `b`에는 아
무런 영향을 주지 않는다.
**b = 30**
**실행 결과**
```
a = 20
b = 30
```
변수 `b`에 값 `30`을 대입했다. 변수 `b`의 값이 `10`에서 `30`으로 변경되었다. 당연한 이야기지만 변수 `a`에는 아무런 영
향을 주지 않는다.
**최종 결과**
여기서 핵심은 `int b = a `라고 했을 때 변수에 들어있는 값을 복사해서 전달한다는 점이다. 따라서 `a=20 `, `b=30 `이
라고 했을 때 각각 본인의 값만 변경되는 것을 확인할 수 있다.
너무 당연한 이야기를 왜 이렇게 장황하게 풀어서 하지? 라고 생각한다면 이제 진짜 문제를 만나보자.
참조형과 변수 대입
참조형 예시를 위해 `Data ` 클래스를 하나 만들자. 이 클래스는 단순히 `int value `라는 멤버 변수를 하나 가진다.
**Data**
```java
package ref;
public class Data {
int value;
}
```
다음 코드를 보고 어떤 결과가 나올지 먼저 생각해보자. 꼭 먼저 생각해보고 이후에 실행해서 정답을 맞춰보자.
**VarChange2**
```java
package ref;
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
하고 싶은 말
김영한의 실전 자바 기본편 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편