---
title: "Java 정리 09"
date: "2018-11-23"
tags: ["Java"]
status: archived
verified: false
---

## Java 정리 09 - class

---

### OOP (Object Oriented Programming)

* 객체 지향 프로그래밍
* **실생활(현업)의 모든 사물(업무)을 객체로 보고 그 객체를 컴퓨터세계에서 구현하는 것**
* 3대 특징 **상속, 다형성, 캡슐화**

---

### class 

* **참조형 데이터형**
  * class, 문자열, 배열
  * 실제 값은 메모리의 다른 곳(heap)에 위치하고 그 주소(4byte)를 사용(stack)하는 데이터형
  * 참조형 데이터형은 크기를 알 수 없다
* **사용자정의 데이터형**
  * 존재하는 데이터형을 조합하여 이름을 부여하고 사용하는 것
* 객체를 찍어내는 **설계도**
  * **설계도 != 객체**

```java
// 객체화. new는 객체 생성용 키워드(객체는 heap영역에 생성됨)
클래스명 객체명 = new 클래스명();

클래스명 객체명 = null;
// null은 heap의 주소를 가지지 않은 상태
// 참조형 데이터형는 초기화값으로 null을 갖는다
```


* **자바에서 지원하는 클래스는 7가지**
  * **class** - 일반적인 코드 정의
  * **abstract class** - 상속을 위해 만드는 클래스
  * **interface** - 다중상속의 장점을 사용
  * **Inner class** - Event를 처리하기 위해
    * **inner class** - 내부클래스를 인스턴스 변수처럼 사용
    * **nested class** - 내부클래스를 static 변수처럼 사용
    * **local class** - 내부클래스를 지역변수처럼 사용
    * **anonymous inner class** - 클래스를 Argument로 사용

![01](/md/legacy-assets/java/09/01.webp)

```java
// anonymous innerclass
method명(new 부모클래스명() {
     
     자식의method() {
       ...
     }

     @Override
     부모의method() {
       ...
     }
     ...
});
```

---

### 클래스 생성

```java
[접근지정자] class 클래스명 [extends 부모클래스명] [implements 구현할인터페이스명,...] {

}

// 접근지정자
public - 패키지 외부에서 클래스 사용가능
default(package) - 패키지 내부에서만 클래스 사용가능

final - 상속 불가(오버라이드 금지)
static - nested class 만들 때
abstract - abstract class 만들 때(상속 목적)
// abstract와 final은 같이 사용할 수 없다(error!)

//클래스명은 대문자로 시작
```

---


### 클래스 작성 및 사용

1. 대상선정
2. 객체모델링
3. **클래스 구현**
4. **객체생성**
5. **method 호출**

* 1~2는 PM 또는 아키텍처가 수행
* **3~5는 개발자가 수행**

---

### 클래스 다이어그램

* 클래스 구현 전에 작성

![02](/md/legacy-assets/java/09/02.webp)

---

### 클래스 setter method, getter method

* **setter method**
  * **instance 변수에 값을 설정하는 일**
    * **값에 대한 검증**을 수행할 수 있기 때문에 setter를 사용
  * **접근지정자는 public, 반환형은 없다**
  * **매개변수가 반드시 존재**
  * method명은 **set**을 접두어로 변수와 결합하여 정의

* **getter method**
  * **instance 변수에 설정된 값을 받아가는 일**
  * **접근지정자 public, 반환형 있음**
  * **매개변수는 없음**
  * method명은 **get**을 접두어로 변수와 결합하여 정의

---

### 클래스 작성 예시

* **대상 선정**
  * 마카펜
    * 검은마카펜, 파란마카펜, 빨간마카펜

* **객체 모델링(추상화)**
  * **추상화란 대상의 공통 특징을 뽑는 것**
  * 마카펜
    * 명사적 특징
      * 색
      * 몸체
      * 뚜껑
    * 동사적 특징
      * 쓴다

* **클래스(설계도) 작성**

![03](/md/legacy-assets/java/09/03.webp)

```java
// Marker Class
public class Marker {
      // 명사적 특징(변수)
      private String color;   // 마카펜의 색
      private int body;       // 마카펜의 몸체의 갯수
      private int cap;        // 마카펜의 뚜껑의 갯수
      
      // setter
      public void setColor(String color) {
            // 인스턴스변수에 설정될 값에 대한 검증 수행
            if (color.equals("빨간색") || color.equals("파란색"))
                  this.color = color;
            else
                  this.color = "검은색";
      }

      public void setBody(int body) {
            this.body = body;
      }

      public void setCap(int cap) {
            this.cap = cap;
      }
      
      // getter
      public String getColor() {
            return color;
      }
      public int getBody() {
            return body;
      }
      public int getCap() {
            return cap;
      }
      
      // 동사적 특징(메소드)

      String write(String msg) {
            return color+"인 마카펜으로 칠판에 \""+msg+"\" 를 쓴다";
      }
}
```

* **객체화, 사용**

```java
// UseMarker Class
public class UseMarker {

      public static void main(String[] args) {
            // 검은색 마카펜 1개 생성
            Marker black = new Marker();

            black.setColor("검은색");
            black.setCap(1);
            black.setBody(1);
            
            System.out.printf("생성된 마카펜 색[%s], 뚜껑[%d], 몸체[%d]"
              ,black.getColor(), black.getCap(),  black.getBody());
            System.out.println();

            // 생성된 객체의 사용
            System.out.println(black.write("안녕하세요"));
            
            // 빨간색 마카펜 객체를 5개 생성 후 사용
            Marker red = new Marker();
            
            red.setColor("빨간색");
            red.setBody(5);
            red.setCap(5);
            
            System.out.printf("생성된 마카펜 색[%s], 뚜껑[%d], 몸체[%d]"
              ,red.getColor(), red.getCap(), red.getBody());
            
      }
}
```

---

### 숙제풀이

* 너구리, 오징어짬뽕, 신라면
  * 다음 대상을 보고 추상화, 클래스 작성, 객체화, 사용하기


![04](/md/legacy-assets/java/09/04.webp)

[RamenClass](https://github.com/younggeun0/SSangYoung/blob/master/dev/workspace/javase_prj/src/date181123/Ramen.java)
[UseRamenClass](https://github.com/younggeun0/SSangYoung/blob/master/dev/workspace/javase_prj/src/date181123/UseRamen.java)
