## 클래스와 객체
**클래스(Class)**
- 객체를 만들어내기 위한 **설계도**
- 자바에서는 이러한 설계도를 가지고 여러 객체를 생성하여 사용하는 식으로 프로그래밍을 이어나간다
- 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메서드(method)로 구성된다.
- 필드(field)란 클래스에 포함된 변수를 의미한다
- 메서드(method)란 클래스에 포함된 함수를 의미한다
- Code영역에 위치한다
- 자바 파일은 클래스를 정의하는 것이기 때문에, 클래스 이름과 자바 파일 이름은 동일해야 한다

**객체(Object) / 인스턴스(Instance)**
- 객체 : 설계도를 바탕으로 소프트웨어 세계에 구현된 **구체적인 실체**
- 인스턴스 : 클래스에 의해 만들어진 객체
- Heap영역에 위치한다
```java
// 클래스
class Animal { ... }
public class Sample {
public static void main(String[] args) {
// 변수 cat은 객체
// 변수 cat은 Animal 클래스의 인스턴스
Animal cat = new Animal(); // 클래스라는 설계도를 통해 객체 데이터를 new 생성
}
}
```
> **접근제어자**
>
> - 접근제어자는 멤버 또는 클래스에 사용되어 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 함
> - 접근제어자는 생략가능하며 생략했을 때는 자동으로 default 임을 뜻하게 된다. 따라서 default 일경우에는 접근제어자를 지정하지 않는다.
> - 접근제어자가 사용될 수 있는 곳 : 클래스, 멤버변수, 메서드, 생성자
> 1. `private` : 같은 클래스 내에서만 접근 가능
> 2. `default` : 같은 패키지 내에서만 접근 가능
> 3. `protected` : 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근 가능
> 4. `public` : 접근 제한이 전혀 없다.
## 필드
- 클래스에 포함된 변수
- 선언된 위치와 선언자에 따라 다음과 같이 구분된다
- 클래스 변수 (static variable)
- 모든 인스턴스가 공유해야 하는 값을 유지하기 위해 사용된다
- 인스턴스 생성 없이도 사용할 수 있다
- 인스턴스 변수 (instance variable)
- 지역 변수 (local variable)
- 각각의 변수는 생성/소멸 시기가 다르고, 메모리 공간과 사용 방법도 다르다.
|변수|생성 시기|소멸 시기| 저장 메모리 |
|---|---|---|--------|
|클래스 변수|클래스가 메모리에 올라갈 때|프로그램이 종료될 때| 데이터 영역 |
|인스턴스 변수|인스턴스가 생성될 때|인스턴스가 소멸할 때| 힙 영역 |
|지역 변수|블록 내에서 변수의 선언문이 실행될 때|블록을 벗어날 때| 스택 영역|
> Example
>
> ```java
> class Field {
> static int classVar = 10; // 클래스/스태틱 변수 선언
> int instanceVar = 20; // 인스턴스 변수 선언
>
> int method() {
> int localVar = 30; // 지역 변수 선언
> return localVar;
> }
> }
>
> public class Member01 {
> public static void main(String[] args) {
> System.out.println( Field.classVar ); // 클래스/스태틱 변수 참조
> Field myField1 = new Field(); // 인스턴스 생성
> System.out.println( myField1.instanceVar ); // 인스턴스 변수 참조
> System.out.println( myField1.method() ); // 메서드안의 지역변수 출력
> }
> }
> ```
## 메서드
- 클래스 안의 함수를 의미
- 다른 프로그래밍 언어에서 `함수` 라고 부르는 개념을 자바에서는 `메서드` 라고 표현한다. 하지만 혼용되서 사용되므로 크게 의미를 두지 않아도 된다.
- 메서드 정의
- 접근 제어자 : 해당 메서드가 접근할 수 있는 범위를 명시
- 반환 타입(return type) : 메서드가 모든 작업을 마치고 반환하는 데이터의 타입을 명시
- 메서드명 : 메서드를 호출하기 위한 이름을 명시
- 구현부 : 메서드의 고유 기능을 수행하는 집합. 중괄호 `{`, `}`안에 표현됨
- 클래스 메서드 : static 키워드를 가지는 메서드
- 클래스 메서드에서는 인스턴스 변수를 사용할 수 없다
- 인스턴스 메서드 : static 키워드를 가지지 않는 메서드
- 
> Example
>
> ```java
> class Method {
> static int x = 100, y = 200; // 클래스(static) 변수
>
> int a = 10, b = 20; // 인스턴스 변수
>
> int add() { // 인스턴스 메소드
> return this.a + this.b; // 인스턴스 변수끼리 합
> }
>
> static int addStatic() { // 클래스(static) 메소드
> return Method.x + Method.y; // 클래스 변수끼리 합
> }
> }
>
> public class Member {
> public static void main(String[] args) {
> System.out.println(Method.addStatic()); // 클래스 메소드의 호출 : 300
>
> Method myMethod = new Method(); // 인스턴스 생성
> System.out.println(myMethod.add()); // 인스턴스 메소드의 호출 : 30
> }
> }
> ```
## 생성자
- 클래스의 인스턴스를 생성할 때 호출되는 특별한 메서드
- 주요 목적은 인스턴스의 초기 상태를 설정하는 것
- 생성자는 클래스 이름과 같은 이름을 가지며 반환 타입이 없다
- 자바의 모든 클래스는 반드시 하나 이상의 생성자가 정의되어 있어야 한다.
- 생성자를 명시적으로 정의하지 않으면 아무 인자도 받지 않고 아무 작업도 수행하지 않는 기본 생성자를 자동으로 만들어준다
> Example
>
> ```java
> class Car {
> String modelName;
> int modelYear;
> String color;
> int maxSpeed;
> int currentSpeed;
>
> // 생성자 (인스턴스 변수 값 초기화)
> Car(String modelName, int modelYear, String color, int maxSpeed) {
> this.modelName = modelName; // 메서드의 입력값으로 인스턴스 변수의 값을 지정
> this.modelYear = modelYear;
> this.color = color;
> this.maxSpeed = maxSpeed;
> this.currentSpeed = 0; // 입력값 없이 디폴트 초기화
> }
>
> String getModel() {
> return this.modelYear + "년식 " + this.modelName + " " + this.color;
> }
> }
>
> public class Main {
> public static void main(String[] args) {
> Car myCar1 = new Car("아반떼", 2016, "흰색", 250); // 생성자의 호출
> Car myCar2 = new Car("제네시스", 2020, "검은색", 500); // 생성자의 호출
> Car myCar3 = new Car("티코", 2003, "빨간색", 100); // 생성자의 호출
>
> System.out.println(myCar1.getModel()); // 2016년식 아반떼 흰색
> System.out.println(myCar2.getModel()); // 2020년식 제네시스 검은색
> System.out.println(myCar3.getModel()); // 2003년식 티코 빨간색
> }
> }
> ```
## 용어 정리
- 클래스 : 객체 데이터를 만드는 템플릿(설계도)
- 객체 : 클래스(템플릿)과 `new` 연산자를 통해 만든 실 데이터가 들어있는 변수
- 인스턴스 : 어떤 객체가 어떤 클래스의 객체인지 관계를 설명할때 (객체 선언 == 클래스 인스턴스화)
- 클래스 필드 / 멤버 / 속성 : 클래스 안에 있는 변수를 지칭
- 메서드 : 클래스 안에 있는 함수(function)를 지칭
- 생성자 : 클래스로 객체를 만들때 각 객체의 멤버 데이터(변수)들의 값을 초기 생성 해줄수 있는 특수 메서드