프로그램을 독립된 단위인 객체들의 모임으로 보고, 각각의 객체는 메시지를 주고 받고 데이터를 처리하는 메커니즘을 가진 프로그래밍이다.
=> 기존 만들었던 코드를 재사용 할 수 있다는 장점.
데이터를 보호하기 위한 OOP의 특성중 하나이다.
정보은닉 : 객체 세부적인 내용이 외부에 드러내지 않는다.
=> 외부에서 데이터 직접접근을 차단한다.
캡슐화 : 필드와 메서드를 하나로 묶는다.
함수를 입력하면 다른 클래스 코드의 잘못된 데이터를 차단할 수 있다.
메서드를 통해 특정 개체에 들어갈 수 있는 것과 없는 것을 검증하는 것
2단계: 비즈니스 로직을 잘 캡슐화해라
// MotorBikeRunner 클래스의 main함수안에 있는 코드
int ducatiSpeed = ducati.getSpeed(); //get ducati speed
ducatiSpeed = ducatiSpeed + 100; ducati.setSpeed(ducatiSpeed);
이러한 비즈니스 로직또한 객체안에 캡슐화 할 수 있다.
=> MotorBike 클래스 안에 속도를 올리는 메서드를 만들자.
공통성과 본질을 모아 추출하는 것으로,
핵심적인 코드만 보여주는 것이다.
목적
추상화는 가장 필요한 데이터를 "보여주는것" 에 초점, 주로 무엇을해야하는지.
캡슐화는 필요한 정보를 위해 코드와 데이터를 "묶는것"에 초점. 그것이 어떻게 이루어져야하는지.
객체 내부상태에 대한 정보를 숨기는 방식
캡슐화는 추상화를 제공하기 위해 사용되는 전략이라 볼 수 있따.
코드를 재사용하여 기능 및 특성을 자식에게 물려줄수있다.
class Animal {
private String name;
public void setName(String name) {
this.name = name;
}
public abstract void hello() {
System.out.println('hi!');
}
}
class Bear extends Animal {
public void hello() {
System.out.println("growl!");
}
}
Bear 클래스는 Animal을 상속받아 모든 코드를 물려받았고, 수정하고싶은 hello 메서드만 메서드재정의 하였다.
객체 변경에 용이한 OOP 특성이다
메서드의 이름은 같게하지만 파라미터 개수나, type 을 다르게 하여 서로 다른 메서드로서 동작하게 하는 것.
void howl(String name) {System.out.println(name)}
void howl(String name, int count) {System.out.println(count)}
void howl(String name, double count) {System.out.println(count)}
=> 예시를 잘 못 들었는데 아무튼 대충 이런 형식.
상속과 연관이 있는 특성이다!
슈퍼클래스(부모)에서 상속받은 메서드를 재정의하는것
조건
오버로딩은 기존에 없는 새로운 메서드를 정의하는 것이라면, 오버라이딩은 기존의 메서드(상속받은)의 내용을 재정의하는 것이다.
상속받은 메서드와 다른 파라미터를 가지는 메서드는 "오버로딩" 된것이고,
상속받은 메서드와 같은 파라미터를 가지는 건 "오버라이딩" 되었다 볼수잇다.