소프트웨어를 개발하는 프로그래밍 패러다임 중 하나로, 현실 세계의 객체를 모델링하여 소프트웨어를 구축하는 개념
객체 지향은 인간의 인지 및 사고 방식까지 프로그래밍에 접목하는 인간 지향이다.
캡슐화 (Encapsulation): 클래스 내부의 멤버 변수와 메서드를 외부로부터 은닉하여 객체의 내부 구현을 숨기고, 외부로부터의 직접적인 접근을 제한
상속 (Inheritance): 한 클래스가 다른 클래스의 특성(멤버 변수와 메서드)을 자신의 것으로 받아들이는 것을 의미
추상화 (Abstraction):객체에서 공통의 특성을 추출하여 클래스로 정의하는 것을 의미
다형성 (Polymorphism): 같은 이름의 메서드나 연산자가 여러 형태로 동작하는 능력을 의미
우리에게 개구리 책으로 유명한 스프링 입문을 위한 자바 객체 지향의 원리와 이해에서는 추상화를 이렇게 이야기 했다.
"객체지향의 추상화는 곧 모델링이다."
구체적인 것을 분해해서 관찰자가 관심 있는 특성만을 가지고 재조합하는 것, 실제 사물을 정확히 복제하는게 아니라 목적에 맞게 관심 있는 특성만을 추출해서 표현하는 것
클래스와 객체 관계를 자바에서 어떻게 표현하나?
클래스 객체참조변수 = new 클래스();

추상화는 클래스이다.
public class Car {
// 속성(필드)
private String brand; // 브랜드
private int speed; // 속도
private double fuel; // 연료량
// 생성자
public Car(String brand, int speed, double fuel) {
this.brand = brand;
this.speed = speed;
this.fuel = fuel;
}
// 메서드(행동)
public void accelerate() {
speed += 10; // 가속
fuel -= 0.1; // 연료 소비
}
}
public class Main {
public static void main(String[] args) {
// 자동차 객체 생성
Car myCar = new Car("Toyota", 0, 50.0);
}
}
그렇다면 상속은 어떻게 표현할 수 있을까?
"상속은 재사용 + 확장(extends)이고, 하위 클래스는 상위 클래스이다."

동물 뽀로로 = new 펭귄(); //펭귄을 낳으니 동물 역할을 하는 뽀로로라 이름 지음
만약 이게 상속인지 파악이 안된다면 "is kind of"를 사용해보자
- 펭귄 is a kind of 동물 -> 펭귄은 동물의 한 분류이다.
- 조류 is a kind of 동물 -> 조류는 동물의 한 분류이다.
참고! 다중 상속은 지원하지 않는다.
정리
객체지향에서의 다형성이란?
오버라이딩과 오버로딩이라고 할 수 있다.
물론 상위 클래스와 하위 클래스 사이에서도 다형성을 이야기할 수 있고, 인터페이스와 그것의 구현 클래스 사이에서도 다형성을 이야기할 수 있다.
오버로딩은 같은 이름의 메서드를 다른 매개변수로 여러 개 정의하는 것을 의미하며, 컴파일 시에 어떤 메서드가 호출될지 결정
오버라이딩은 상위 클래스에서 정의된 메서드를 하위 클래스에서 재정의하는 것을 의미하며, 실행 시에 어떤 메서드가 호출될지 결정
"정보 은닉과 관련하여 객체를 조직화하고 유지 보수를 쉽게 한다."
결국 private, default, protected, public 놀음이다.

참조
- Call by Value (값에 의한 호출): 함수에 값을 전달할 때, 해당 값을 복사하여 함수에 전달하는 방식
- Call by Reference (참조에 의한 호출): 함수에 참조(주소)를 전달하여 호출하는 방식
객체지향이란 것은 소프트웨어를 개발하는 프로그래밍 패러다임이기에 사람마다 적립하고 있는 지식이 다르기에 본인만의 개념을 잡는 것도 중요하지만 많은 자료를 찾아보아서 축적을 하는 것을 추천한다.
굿!