> For the complete documentation index, see [llms.txt](https://leeans-dev-book.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://leeans-dev-book.gitbook.io/docs/lecture/java/section4./class.md).

# Class

#### 객체지향은 진입장벽이 있는 주제

* 바로 설명하기보다, 직접 실습을 통해 하나하나 알아갈 것

### 클래스/객체 없이 프로그래밍을 한다면?

```java
//  1 버튼
char btn1Print = '1';
int btn1Space = 1;
String btn1Mode = "DARK";
placeButton(btn1Print, btn1Space, btn1Mode);

//  더하기 버튼
char btnPlusPrint = '+';
int btnPlusSpace = 3;
String btnPlusMode = "DARK";
placeButton(btnPlusPrint, btnPlusSpace, btnPlusMode);

//  클리어 버튼
char btnClearPrint = 'C';
int btnClearSpace = 2;
String btnClearMode = "DARK";
placeButton(btnClearPrint, btnClearSpace, btnClearMode);
```

```java
static void placeButton (char print, int space, String mode) {
    System.out.printf(
        "표시: %c, 공간: %s, 모드: %s%n",
        print, space, mode
    );
}
```

* 같은/유사한 형식의 반복되는 코드들
* 반복을 줄이고, 체계적이고 안정적이게 이 버튼들을 다룰 방법 필요

#### Ex01 - button.java

* 파일생성시 작성된 최상단의 package 라인은 지우지 말 것

{% code title="Button.java" %}

```java
public class Button {

    char print;
    int space;
    String mode;

    Button (char print, int space, String mode) {
        this.print = print;
        this.space = space;
        this.mode = mode;
    }

    void place () {
        System.out.printf(
                "표시: %c, 공간: %s, 모드: %s%n",
                print,space, mode
        );
    }
}
```

{% endcode %}

* `[Main.java](<http://Main.java>)` 파일과 같은 위치에 생성
* 클래스 *class* : 각 버튼이 갖고 있을 속성(들)과 기능(들)을 정의

{% code title="Main.java" %}

```java
Button button1 = new Button('1', 1, "DARK");
Button buttonPlus = new Button('+', 3, "DARK");
Button buttonClear = new Button('C', 2, "DARK");

button1.place();
buttonPlus.place();
buttonClear.place();
```

{% endcode %}

* 객체 *object* / 인스턴스 *instance* : 속성(프로퍼티)들과 기능(메소드)들의 묶음
  * 자바에서는 객체와 인스턴스를 같은 것으로 이해해도 됨
* 인스턴스는 클래스에서 정의한 방식으로 양산됨

#### 💡 클래스 & 인스턴스 - 프랜차이즈 본사 & 매장

* 초반부에 이해를 위해 프렌차이즈 비유를 사용할 것

#### ex02 - DancingCup.java

{% code title="DancingCup.java" %}

```java
//  본사의 코드
public class DancingCup{
    //  인스턴스가 가질 필드(field)들
    int no;
    String name;

    //  인스턴스가 가질 메소드 - 💡 static을 붙이지 않음
    String intro () {
        // no와 name 앞에 this를 붙인 것과 같음
        return "안녕하세요, %d호 %s점입니다."
                .formatted(no, name);
    }
}
```

{% endcode %}

* ⭐ 클래스파일의 이름은 클래스의 이름과 동일해야 함 *(`public` 클래스일 시)*
* IntelliJ에서 클래스명 수정해 볼 것 - **refactor**

{% code title="Main.java" %}

```java
//  본사 소속의 매장을 내는 코드
DancingCupstore1 = new DancingCup();
store1.no = 1; // 🔴
store1.name = "서면";

DancingCupstore2 = new DancingCup();
store2.no = 2;
store2.name = "남포";


//  인스턴스의 필드들에 접근
int store1No = store1.no;
String store2Name = store2.name;

//  인스턴스의 메소드 호출
String store1Intro = store1.intro();
```

{% endcode %}

* 디버깅 툴로 인스턴스들 살펴볼 것
* `out` 디렉토리 살펴볼 것 - 클래스들이 `.class` 파일로 생성

⭐️ 생성자 메소드 - 매장을 내는 메소드

#### ex03&#x20;

{% code title="DancingCup.java" %}

```java
public class DancingCup{
    int no;
    String name;

    //  ⭐ 생성자(constructor) : 인스턴스를 만드는 메소드
		//  ⭐ this : 생성될 인스턴스를 가리킴
    DancingCup(int no, String name) {
        this.no = no;
        this.name = name;
    }

    String intro () {
	//  String name = "몽고반"; // 주석해제 시 name 대체
        return "안녕하세요, %d호 %s점입니다." // 🔴
                .formatted(no, name);
    }
}
```

{% endcode %}

```java
//  클래스로 인스턴스를 생성 - 💡 new 연산자 + 생성자 호출
//  본사의 방침대로 매장을 내는 것
DancingCupstore1 = new DancingCup(1, "서면");
DancingCupstore2 = new DancingCup(2, "남포");
DancingCupstore3 = new DancingCup(3, "부산대");

String[] intros = {
    store1.intro(), store2.intro(), store3.intro()
};

```

* 메서드 이름 없이, 반환 타입(해당 클래스) 뒤로 괄호가 따라옴
* `return`을 명시하지 않음 - 해당 클래스 타입의 인스턴스 반환
* `new` 연산자와 함께 사용되어 인스턴스를 반환
* 필수 작성 아님 - 언제나 같은 내용의 인스턴스를 반환할 경우
  * 작성되지 않았을 경우에는 인자 없이 호출 (이전 예제 확인)
  * ⭐️ 코드에 작성하지 않아도 컴파일러가 자동 생성
    * `.class` 파일에서 확인 가능
* 자동생성
  * 메뉴 - 코드 - 생성
    * 윈도우: `alt` + `insert`
    * 맥: `command` + `N`
  * `생성자` 선택
  * `name` 과 `price` 선택
* 💡 생성자를 작성하지 않는다고 생성자가 없는 것이 아님
  * `ex02` 의 컴파일된 파일 DancingCup.`class` 살펴 볼 것

#### ⭐️ `this` - 만들어질 인스턴스를 가리킴

* `intro` 메소드 브레이크포인트에서 `this` 항목 확인
  * `no` 와 `name` 에 `this` 를 붙인 것과 같음
* 메소드 내에서 같은 이름의 변수나 인자가 없다면 식별자는 `this` 의 필드를 가리킴
* 같은 이름의 변수나 인자가 있다면 덮어씌워짐
  * 필드에는 `this`를 붙여 구분
  * 생성자에서 `this` 를 빼고 실행해 볼 것
  * `intro` 에서 주석 해제해 볼 것, `this` 를 사용하여 다시 해 볼 것
