---
# System prepended metadata

title: 클래스와 객체
tags: [과외(하희영)]

---

## 클래스와 객체

**클래스(Class)**

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

![](https://i.imgur.com/H2uXhc6.png)

**객체(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 키워드를 가지지 않는 메서드
- ![](https://i.imgur.com/wu8OALn.png)

> 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)를 지칭
- 생성자 : 클래스로 객체를 만들때 각 객체의 멤버 데이터(변수)들의 값을 초기 생성 해줄수 있는 특수 메서드