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