실제 세계는 사물(객체)로 이루어져 있으며 발생하는 모든 사건들은 사물간의 상호작용이다.
상속, 다향성과 같은 개념들로 인해 생기는 장점들이다.
처음부터 객체지향에 얽매이기 보다는 기능적으로 완성한 후에 차근차근 객체지향적으로 발전시키는게 좋다.
객체를 정의해놓은 것이다. 실세계에서는 붕어빵 기계이라고 생각하면 된다.
실제로 존재하는 것. 사물 또는 개념이다. 붕어빵이라고 생각하면 된다.
클래스의 인스턴스 == 객체
라고 보면 된다.
객체는 모든 클래스의 인스턴스를 대표하는 포괄적인 의미를 갖고 있다.
인스턴스는 어떤 클래스로부터 만들어진 것인지에 대한 구체적인 의미를 갖고 있다.
붕어빵은 붕어빵 기계의 인스턴스이다. 붕어빵은 객체이다. (O)
붕어빵은 붕어빵 기계의 객체이다. 붕어빵은 인스턴스이다. (X)
객체를 나타내는 특성들이다. 변수에 해당된다.
객체가 하는 기능들이다. 메서드(함수)에 해당된다.
하나의 데이터를 저장할 수 있는 공간
같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
데이터와 함수의 결합 (구조체 + 함수)
class Variables {
int iv; // 인스턴스변수
static int cv; // 클래스 변수(static변수, 공유변수)
void method() { // 인스턴스 메서드
int lv = 0; // 지역변수
}
static void method(int ch) { // 클래스 메서드
cv = ch
}
}
인스턴스 변수
클래스 변수
인스턴스 메서드
클래스 메서드
Class Car {
String color;
String gearType;
int door;
Car() {
this("white", "auto", 4);
}
Car(String color) {
this(color, "auto", 4);
}
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
다음과 같이 오버로딩을 통해 생성자를 여러개 생성할 수 있다.
class InitTest {
int x;
int y = x;
void method() {
int j;
int j = i;
}
}
멤버 변수(인스턴스 변수, 클래스 변수)는 자동으로 자료형에 맞는 기본값으로 초기화가 된다.
지역 변수는 사용하기 전에 반드시 초기화를 해야 한다.
class Car {
int door = 4;
Engine e = new Engine();
...
}
class Car {
int door = 4;
Engine e = new Engine();
Car (int door, Engine e) {
this.door = door;
this.e = e
}
...
}
class Car {
static int cv = 3;
int iv = 2;
static {
// static 초기화 블럭
cv = 2
}
{
// 인스턴스 초기화 블럭
iv = 1
}
...
}
클래스가 처음 로딩될 때 단 한번 초기화 된다.
기본값 -> 명시적초기화 -> 클래스 초기화 블록
인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다.
기본값 -> 명시적초기화 -> 인스턴스 초기화 블록 -> 생성자