객체 지향 프로그래밍 (Object-Oriented Programming, OOP)은 프로그래밍에서 필요한 데이터를 추상화 시켜 상태(filed)와 행위(method)를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
객체는 프로그램에서 사용되는 데이터, 식별자에 의해 참조되는 공간을 의미하며 값을 저장할 변수와 작업을 수행 할 메소드를 서로 연관된것들 끼리 묶어 만든 것이다.
객체를 자동차의 필드와 메서드로 표현하면 다음과 같다.

)
식별 가능한 객체를 소프트웨어의 객체로 설계하는 것을 객체 모델링 이라고 부른다.
사람 객체는 자동차 객체를 사용한다.
타이어, 차문, 핸들 객체는 자동차 객체에 포함되어 있다.
공장에서는 자동차 뿐만 아니라 기차도 생성하며 이 두개는 하나의 공통된 기계시스템인 bluePrint 기능을 모함하기에 기계시스템 객체를 상속받는 상속 관계이다.
인스턴스라고 부르며 이 과정을 인스턴스화라고 부른다. 
특징에 관한 자세한 내용은 아래와 다음 내용에서 다룬다.
//클래스 선언
public class Car {}
//생성자 정의
//반환 타입이 없으며 이름은 클래스와 동일하다.
//기본 생성자는 생략이 가능하다.
public Car() {} // 기본 생성자 (o)
public Car(String company) {} // 기본 생성자 (x)
new를 사용하여 클래스로부터 객체를 생성한다. new 연산자 뒤에는 해당 클래스의 생성자 호출 코드를 작성한다.참조형 변수를 받아준다.Car[] carArray = new Car[3];
Car car1 = new Car(); // Car클래스의 객체인 car1 인스턴스 생성
car1.changeGear('P');
carArray[0] = car1;
필드의 초기화는 두가지로 이루어 진다. 객체의 행위인 메서드도 마찬가지이다.
// 외부 접근
Car car = new Car();
car.color = "blue";
// 내부 접근
double brakePedal() {
speed = 0;
return speed;
}
메서드 오버로딩 은 하나의 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도, 매개변수의 개수 또는 타입, 순서가 다르면 동일한 이름을 사용해서 메서드를 정의한다.
public void println(String x){...}
public void println(Object x) {...}
멤버는 필드와 메서드의 결합체이다.
static 키워드를 이용하면 클래스 멤버로 선언된다.//static
static String company = "GENESIS";
//class member 사용
Car car = new Car(); // 객체 생성
car.company = "Ferrari";
//인스턴스 필드(model) 사용 불가, 객체의 생성 필요
System.out.println("자동차 모델 확인: " + model);
생성자는 객체가 생성될 때 호출되며 객체를 초기화하는 역할을 수행한다.
public Car(String modelName, String colorName) {
model = modelName;
color = colorName;
}
this 는 객체 즉, 인스턴스 자신을 표현하는 키워드이다.
this를 이용하여 자신의 주소를 반환한다. Car returnInstance() {
return this;
}
this() 는 객체 즉, 인스턴스자신의 생성자를 호출 하는 키워드이다.
this() 의 사용은 코드의 중복을 제거한다. public Car(String model) {
this(model, "Blue", 50000000);
}
제어자는 객체의 무결성을 지키기위해, 클래스 또는 멤버에 사용하며 외부의 접근을 막는다.
public, protected, default, privatestatic, final, abstractpublic : 접근 제한이 전혀 없다.
protected : 같은 패키지 내에서, 다른 패키지의 자손 클래스에서 접근 가능하다.
default : 같은 패키지 내에서만 접근이 가능하다.
private : 같은 클래스 내에서만 접근이 가능하다.
- 클래스 :
public,default- 메서드 & 멤버변수 :
public,protected,default,private- 지역변수 : 없음
객체의 private 필드를 읽거나 저장하기 위해 Getter Setter 가 사용된다.
Getter Setter 의 사용방법은 인스턴스 메서드 호출과 동일하다.
private double speed;
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
⚠️ 제어자 사용시 주의 사항
static과 abstract를 함께 사용할 수 없다.abstract와 final을 동시에 사용할 수 없다.abstract메서드의 접근 제어자가 private일 수 없다.private와 final을 같이 사용할 필요는 없다.이번시간에는 객체와 클래스의 관계에 대해 알아보았다. 개념은 간단하지만 사용하는데 많은 주의점이 필요한 듯 하다. 다음시간에는 상속과 인터페이스에 대해 알아본다.