# ch08 : 참조 자료형

### 목차

1. [참조 자료형](#참조-자료형)
2. [생성자](#생성자)
3. [Static](#static)
4. [Pass by Value VS Pass by Reference](#pass-by-Value-VS-Pass-by-Reference)
5. [매개변수가 갯수가 정해지지 않았다면](#매개변수가-갯수가-정해지지-않았다면)

## 참조 자료형

* new 키워드로 생성한 객체 (단, String은 리터럴변수로도 선언 가능)
* 기본 자료형(byte, short, int, long, float, double, char, boolean) 제외한 모든 자료형

## 생성자

* 기본 생성자 : 매개변수가 없는, 자동으로 만들어지는 생성자
  * 만약 개발자가 다른 생성자를 만들었을 경우, 기본 생성자는 따로 만들어주어야 함
* 생성자는 여러 개 만들 수 있다.
  * 이유?

    클래스의 일부 필드만으로 객체를 생성/전달/반환해야 할 경우가 있다. 이때 클래스의 일부 필드만을 매개 변수로 받아서 객체를 생성하기 위해 여러 종류의 생성자를 만들 수 있다!
* this란
  * 객체의 변수와 매개변수의 이름이 같을 때, 구분하기 위해서 사용함

> **DTO** : 여러 자료형을 하나의 타입에 담아 전달하고자 할때 사용하는 클래스로, 데이터를 다른 서버로 전달하기 위해 사용함 **VO** : 데이터를 담아 두기 위한 클래스 [참고](https://github.com/Cs-Java-Interview/Tech-Interview/blob/main/spring/spring_dto_dao.md)

## Static

**Static 메소드**

* ex) `public static void myMethod() { … };`

1. 객체를 생성하지 않고서도 메소드 호출 가능하다.

   (일반 메소드처럼 객체별로 생성되는 게 아닌, 클래스 단위로 하나 생성되기 때문)
2. 클래스 변수(static 변수)만 사용 가능하다.

**Static 블록**

* ex) `static { … } // 클래스 내부에서`
* 클래스의 객체가 생성되면서 딱 한번만 사용할 코드일 경우, static 블록 사용

## Pass by Value VS Pass by Reference

매개 변수를 넘겨준 상황에서, 메소드 내부에서 해당 변수 값을 변경하게 되면

* Pass by Value : 원본 값이 변경 되지 않는다.
* Pass by Reference : 원본 값이 변경된다.

**Pass by Value**

* 값을 넘겨주는 호출 방식이다.
* 기본 자료형은 Call-By-Value이다.

  ```java
  public class Test {

      public static void passByValue(int a) {
          a = 20;
  				System.out.println(a); // 20
          }

      public static void main(String[] args) {
          int a = 10;

          System.out.println(a); // 10
          passByValue(a);
  				System.out.println(a); // 10
      }
  }
  ```

**Pass by Reference**

* 참조에 의한 호출 방식
* 참조 자료형은 **Pass by Reference**이다.
* 주소 값으로 참조가 가능하여, **주소 값이 가리키는 객체의 내용**을 변경할 수 있다.

  ```java
  public class ReferencePass{

      public static void passByReference(MemberDto member) {
  				member.name = "Change"
  				System.out.println(member.name); // "Change"
      }

      public static void main(String[] args) {
          MemberDto member = new MemberDto("Original");

  				System.out.println(member.name); // "Original"
          passByReference(member.name); // 함수 안에서 참조해서 데이터 변경할 경우, 외부에서도 반영됨
  				System.out.println(member.name); // "Change"
      }
  }
  ```

## 매개변수가 갯수가 정해지지 않았다면

* `타입…변수명`을 매개변수로 넘겨줌
* ex) `pubilc void atrbitrary(String message, int... numbers)`
* 하나의 메소드에서 한번만, 그리고 가장 마지막에만 선언해야함
