현실에 존재하는 사물을 있는 그대로 모델링하여 이들의 행위와 속성을 정의하고,
절차적이 아닌 객체가 중심이 되어 실제 사물이 동작하는 방식으로 설계하는 프로그래밍 방식.
사물에 대해서는 객체 Object 라고 부르며, 해당 사물이 하는 행위를 Method 로 정의하고
해당 사물이 가지는 속성을 변수 Variable 라고 정의한다.
객체는 상태 정보를 저장하고 유지해야 하며, 이러한 속성(Variable)은 변수로 정의 되어야 한다.
이러한 속성값이 바뀌면 객체의 상태가 변경될 수 있어야 한다.
객체는 Method를 통해 기능을 제공해야 한다.
이는 캡슐화와 연관이 있으며, 외부로부터 직접 속성에 접근하여 변경하게 하는 것이 아닌 객체가 제공하는 Method로 기능이 제공되어야 한다.
객체는 고유한 식별자를 가져야 한다. 카드번호, 계좌번호와 같은 속성을 통해서 고유한 값을 가질 수 있어야 한다.
실제로 사물이 존재하며, 이를 클래스로 정의한 객체. (ex. 고객, 직원, 카드 등)
웹 시스템의 서비스에 해당되며, 비즈니스 로직을 처리하는 부분을 의미한다. 비즈니스 로직에서는 여러 객체가 서로 상호작용 하도록 하며, 객체가 제공하는 method를 통해 객체의 속성을 변경시킨다. (ex. 사용자 관리 시스템, ATM 시스템)
객체의 속성(Variable)을 보호하기 위해 꼭 필요한 정보와 기능만 외부에 오픈한다.
대부분의 멤버 변수와 메서드를 감추고 외부에 통합된 인터페이스만은 제공하여 일관된 기능을 구현 하게 한다.
객체지향의 패러다임 중 하나인 추상화를 제공한다.
실제로 Method가 어떻게 동작하는 지는 외부에서 이해할 필요가 없으며, 단순 호출만으로 해당 기능을 실행할 수 있고, 이를 통해 객체 단위로 프로그램 설계가 가능하다.
재사용성 향상
객체는 단일 객체에만 영향을 주기에, 객체의 모듈성과 응집도가 높아지고 이를 통하여 재사용성이 높아진다.
유지보수와 효율성이 향상된다.
객체지향에서 상속은 속성의 상속이 아닌, 하위로 내려갈수록 구체화 되는 것이다.
이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야 할때 기존 클래스를 상속(inheritance) 받아서 속성이나 기능을 확장하여 객체를 구현한다.
상속하는 클래스 : 상위 클래스, parent class, base class, super class
상속받는 클래스 : 하위 클래스, child class, derived class, subclass
class B(sub class) extends A(super class) {...}
자바는 단일 상속(single inheritance)만을 지원하므로 extends 키워드 뒤에는 단 하나의 클래스만 올 수 있다.
프로그램 구조에 대한 이해도가 향상된다. 상위 클래스의 구조를 보고 하위 클래스의 동작을 이해할 수 있다.
재사용성 향상
해당 클래스에 필요한 속성, 메서드를 모두 정의하지 않고 상속을 받아서 사용할 수 있다.
확장성 향상
일관된 형태의 클래스 객체를 추가할 수 있어 간단하게 프로그램 확장이 가능하다.
유지보수성 향상
각 객체마다 메서드를 정의하고 있다면 수정 작업이 번거롭지만 상속을 사용한 경우 유지보수가 편리하여 효율성이 향상된다.
하나의 개체가 여러 자료형으로 구현되어 실행되는 것을 의미하며, 객체지향에서 다형성은 오버라이딩 을 통해 가능하다. 다형성을 잘 활용하면 유연하고 확장성있고, 유지보수가 편리한 프로그램을 만들수 있다.
이러한 다형성의 특징을 활용하여 하나의 상위 클래스 타입으로 각각의 객체의 속성에 맞게 동작하도록 설계할 수 있다.
객체지향에서 추상화는 모델링이다. 구체적으로 공통적인 부분, 또는 특정 특성을 분리해서 재조합한다.