Java - 객체지향
객체란?
객체
- 식별 가능한 세상에 존재하는 물체
- 속성과 행위로 구성
ex) 자동차는 회사, 모델, 색상, 가격, 속도 등의 속성
가속, 브레이크, 기어변속, 조명, 경적 등의 행위
-> 이러한 것을 필드(속성)와 메서드(행위)로 정의하여 구현함.
객체 간의 협력
객체간의 협력은 메서드를 통해 이루어진다.
ex) 사람은 차에게 원하는 메서드를 호출하면 차는 그에 맞는 속성값을 변화 시킨다. (가속페달 -> 속도 / 클락션 -> "빵빵")
이를 통해 데이터를 주고받을 수도있는데 그 메서드의 ()괄호 안에 들어가는 값을 파라미터 - 매개변수 라고 부른다.
객체 간의 관계
계속해서 차와 사람을 예시로 든다면.

1. 사용관계
사람과 차는 독립적인 각각의 객체이다. 여기서 사람은 차라는 객체를 사용한다.
2. 포함관계
차는 타이어, 문, 핸들 등의 객체를 포함하고 있다.
3. 상속관계
차와 기차를 하나의 공통된 기계 시스템이 만든다고 했을 때 차와 기차 둘다 청사진이라는 객체가 필요하면 기계 시스템에 의해 상속받은 객체라고 할 수 있다.
객체지향 프로그램 특징
1. 캡슐화
- 의미
- 속성과 행위를 하나로 묶어 객체(=encapsulation)로 만든 후 실제 내부 구현 내용은 외부에서 알 수 없게 감추는 것
그렇기 때문에 보안에 좋다.
- 이유
- 외부 객체에서 해당 필드와 메서드를 잘못 사용하여 객체가 변화하지 않게 한다.
- 캡슐화된 객체를 노출 시킬 지 아닐지는 접근제어자를 통해 표현한다.
(public, private, default...)
2. 상속
- 의미
- 객체지향 프로그래밍에는 부모객체와 자식객체가 존재하는데,
부모가 자식에게 유산을 물려주듯 필드와 메서드를 사용할 수 있도록 하는 것을 말한다.
- 이유
- 객체간의 구조를 파악하기 쉽다.
- 부모한테 있는 것만 수정하면 자식들은 자동으로 변경되어 코드 일관성을 유지하기 좋다.
- 코드 중복이 줄어들어 코드의 재사용성이 증가된다.
3. 다향성
- 의미
- 객체가 연산할때마다 각 객체가 가지고 있는 고유한 특성에 따라 여러가지 형태로 재구성 되는 것을 의미한다.
ex) Car라는 클래스가 있고 그 안에 horn()이라는 메서드가 있을 때 carA, carB로 객체를 만들어서 각각의 클락션 소리를 따로 가질 수 있는 것
4. 추상화
- 의미
- 객체에서 반복, 공통되는 속성을 빼내서 상위 개념으로 새롭게 선언하는 것을 추상화
- 이 과정을 객체를 모델링 한다고 함.