0. POJO(Plain Old Java Object)
- 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트
1. Object-Oriented Programming
- 프로그래밍에서 필요한 데이터를 추상화 시켜 '상태와 행위를 가진 객체'로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 기법
1). 장점
- 코드의 재사용성이 높음
- 유지보수가 쉬움 , 수정해야 할 부분이 클래스 내부 멤버 or 메서드로 존재
- 대형 프로젝트에서, 업무 분담에 용이
2). 단점
- 처리 속도가 상대적으로 느림
- 객체가 많으면 용량이 커질 수 있음
- 설계시 많은 시간과 노력이 필요
2. OOP 프로그래밍 특징
1). 클래스와 객체
- 클래스 : 객체를 만들기 위하여 데이터를 '상태, 행위, 변수, 메서드'로 정의한 것으로 객체를 만들기 위한 메타데이터, 틀 같은 존재
- 객체 : 클래스에서 정의한 것을 토대로 실제로 데이터를 할당한 데이터
2). 캡슐화
- 데이터와 코드를 외부에서 알 수 없게 보호
- 객체의 역할을 데이터와 기능으로 묶어서 관리 하는것
3). 추상화
- 객체들의 공통적인 특징(변수, 메소드)등을 묶어 표현한것
- 인간의 예로들면, 손, 발, 이름 등 공통된 정보들을 모아놓은 것
4). 상속화
- 부모클래스의 속성을 그대로 이어 받아 사용하고 자식클래스에서 이 속성들을 원하는 대로 재정의하여 사용할 수 있게 한것
5). 다형성
- 오버로딩, 오버라이딩등으로 다른 파라미터등을 가진 동일한 메소드를 호출하여 사용
3. OOP 5원칙 (SOLID)
- 단일 책임 원칙(SRP, Single Responsibility Principle)
- 한 클래스는 하나의 책임만을 가져야 한다.

- 개방 폐쇠 원칙(OCP : Open/Closed Principle)
- 확장에는 열려있고 변경에는 닫혀있음

- 리스코프 치환 원칙(LSP : Liskov’s Substitution Principle)
- 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
- 자식클래스는 부모클래스에서 가능한 행위를 모두 수행할 수 있어야함

- 인터페이스 분리 원칙(ISP : Interface Segregation Principle)
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
- 자신이 사용하지 인터페이스는 구현하지 않아야함

- 의존관계 역전 원칙 (DIP : Dependency Inversion Principle)
- 구체화된 클래스보다 추상클래스, 인터페이스에 의존해야한다.
- 의존 관계를 맺을 때, 변화하기 쉬운것 보단 변화하기 어려운 것에 의존해야 한다는 원칙
ex) 예를들어, 캐릭터 클래스가 다음과 같을 때, 이 캐릭터의 무기를 다른것으로 바꾸기 위해서는
내부 필드를 바꿔야하는데, 이는 개방페쇠원칙에 어긋남
public class OneHandSword
{
private final String NAME;
private final int DAMAGE;
}
public class Character
{
private final String NAME;
private int health;
private OneHandSword weapon;
}