# 레퍼런스와 static
## 들어가며
---
일반 변수와 객체를 가리키는 변수.
```
// 일반 변수
int score = 88;
// 객체를 가리키는 변수
Cat cat1 = new Cat();
```
미묘하게 다른 듯하다. 어떤 차이가 있을까?
![클라우드스터딩-자바-레퍼런스형-vs-기본형-차이](https://i.imgur.com/ipbqku3.png)
이를 알아보기 위해 아래 내용을 학습해보자.
1. 레퍼런스 변수
2. 기본형 변수와의 차이
3. static 키워드
- 클래스 변수
- 클래스 메소드
## 1. 레퍼런스 변수
---
레퍼런스(reference) 변수는 객체를 가리킨다.
![클라우드스터딩-자바-레퍼런스-변수-예](https://i.imgur.com/gefY972.png)
엄밀히 말하면 객체의 주소 정보를 담고 있다.
```
// 객체 생성 후, 그 객체의 주소를 marine1 변수에 저장. 그 객체를 Marine 타입 으로 해석.
Marine marine1 = new Marine("레이너", 80);
// marine1 주소의 객체이 접근하여, stimpack() 동작을 실행
marine1.stimpack();
```
## 2. 기본형 변수와의 차이
---
#### 표기 방식?
레퍼런스 형은 대문자로 시작한다. 이와 반면, 원시형 변수는 소문자로 시작한다.
#### 저장 방식?
레퍼런스 변수는 객체를 간접적으로 저장한다. 어떻게? 객체의 주소를 저장함으로써.
![클라우드스터딩-자바-레퍼런스-변수-기본형-차이](https://i.imgur.com/11oKvAf.png)
기본형(primitive) 변수는 값을 직접 저장한다.
```
int score = 88;
double weight = 73.6;
boolean isMale = true;
char alphabet = 'A';
```
![클라우드스터딩-자바-기본형(primitive)-변수](https://i.imgur.com/TG4xzKb.png)
#### 객체도 변수에 담으면 안되나?
객체는 하나의 변수에 담기에 너무 크다. 뿐만 아니라 그 크기가 유동적이다. 때문에 자바는 객체 접근을 위해 어드레싱(addresing) 방식 즉, 주소지를 통한 접근 방식을 취한다.
![클라우드스터딩-자바-레퍼런스(reference)-변수](https://i.imgur.com/7u3xPU9.png)
## 3. static 키워드
---
#### 무엇?
static은 “공유”라는 개념을 담은 키워드이다. static은 클래스의 필드와 메소드에 적용될 수 있다. static 필드는 클래스 변수, static 메소드는 클래스 메소드라 부른다.
![클라우드스터딩-자바-static-필드-메소드](https://i.imgur.com/5PUlfws.png)
#### 클래스 변수 vs 인스턴스 변수
클래스 변수(static 필드)는 클래스 영역에 존재한다. 객체 외부에 존재하므로 여러 객체가 공유에 좋다.
![클라우드스터딩-자바-클래스-변수-vs-인스턴스-변수-비교-차이-1](https://i.imgur.com/nRPLmri.png)
이와 반대로 non-static 필드는 "인스턴스 변수"라 부른다. 인스턴스 변수는 각 객체 내부에 존재한다.
![클라우드스터딩-자바-클래스-변수-vs-인스턴스-변수-비교-차이-2](https://i.imgur.com/IEOWjCp.png)
클래스 변수와 인스턴수 변수 선언 예.
```
public class Main {
public static void main(String[] args) {
Student std0 = new Student(2019122104, "Park");
Student std1 = new Student(2019206028, "Kim");
Student std2 = new Student(2019153237, "Lee");
}
}
class Student {
// 클래스 변수
static int count = 0;
// 인스턴스 변수
int id;
String name;
// 생성자
Student (int i, String s) {
id = i;
name = str;
count++;
}
}
```
#### 클래스 메소드 vs 인스턴스 메소드
클래스 메소드(static 메소드)는 주체 객체 없이 실행된다. 간편한 기능 구현에 좋다.
![클라우드스터딩-자바-클래스-메소드-vs-인스턴스-메소드-비교-차이](https://i.imgur.com/VzzYQlZ.png)
그 대표적인 예로 <kbd>Math.random()</kbd>이 있겠다.
```
// Math의 static 메소드 random()을 호출
double rand = Math.random();
```
이와 반면 인스턴스 메소드는 주체 객체를 통해 수행된다.
```
// 인스턴스 메소드를 수행하려면 먼저, 주체 객체가 생성되야 한다.
Student std4 = new Student(2007122104, "Choi");
// std4 변수에 연결된 객체가 주체가 되어, 인스턴스 메소드를 수행
std4.study();
```
## 요약
---
![클라우드스터딩-자바-레퍼런스와-static-요약](https://i.imgur.com/8SjXUXO.png)
#### 레퍼런스 변수
- 레퍼런스 변수란, 객체를 가리키는 변수다.
- 기본형 변수는 값을 직접 저장하나, 레퍼런스 변수는 객체의 위치를 가리킨다.
#### static 키워드
- static 키워드는 필드와 메소드에 적용될 수 있다.
#### 클래스 변수
- 클래스 변수란, 클래스 영역에 존재한다.
- 인스턴스 변수란, 객체 내부에 존재한다.
#### 인스턴스 변수
- 클래스 메소드란, 주체 객체가 없이 수행되는 메소드다.
- 인스턴스 메소드란, 주체 객체가 실행하는 메소드다.
## 확인하기
---
<div class="interact_responsive_padding" style="padding:100% 0 0 0;position:relative;margin-bottom:5px;"><div class="interact_responsive_wrapper" style="height:100%;left:0;position:absolute;top:0;width:100%;"><iframe id="interactApp5ce54fd17bcb600014fd74fa" width="100%" height="100%" style="border:none;max-width:100%;margin:0;" allowTransparency="true" frameborder="0" src="https://quiz.tryinteract.com/#/5ce54fd17bcb600014fd74fa/q/1?method=iframe"></iframe></div></div>
## 도서구매
<a href="http://www.yes24.com/Product/Goods/104740689"><img src="http://image.yes24.com/goods/104740689/XL" width="50%" /></a>