[Java] 객체지향과 4가지 핵심요소

희원·2022년 1월 19일
0

객체지향 프로그래밍이란?

(OOP, Object Oriented Programming)

현실에 존재하는 사물을 있는 그대로 모델링하여 이들의 행위와 속성을 정의하고,
절차적이 아닌 객체가 중심이 되어 실제 사물이 동작하는 방식으로 설계하는 프로그래밍 방식.

사물에 대해서는 객체 Object 라고 부르며, 해당 사물이 하는 행위를 Method 로 정의하고
해당 사물이 가지는 속성을 변수 Variable 라고 정의한다.

객체의 3가지 요소

1) 상태 유지 (객체의 상태)

객체는 상태 정보를 저장하고 유지해야 하며, 이러한 속성(Variable)은 변수로 정의 되어야 한다.
이러한 속성값이 바뀌면 객체의 상태가 변경될 수 있어야 한다.

2) 기능 제공 (객체의 책임)

객체는 Method를 통해 기능을 제공해야 한다.
이는 캡슐화와 연관이 있으며, 외부로부터 직접 속성에 접근하여 변경하게 하는 것이 아닌 객체가 제공하는 Method로 기능이 제공되어야 한다.

3) 고유 식별자 제공 (객체의 유일성)

객체는 고유한 식별자를 가져야 한다. 카드번호, 계좌번호와 같은 속성을 통해서 고유한 값을 가질 수 있어야 한다.

물리 객체와 개념 객체

물리 객체

실제로 사물이 존재하며, 이를 클래스로 정의한 객체. (ex. 고객, 직원, 카드 등)

개념 객체

웹 시스템의 서비스에 해당되며, 비즈니스 로직을 처리하는 부분을 의미한다. 비즈니스 로직에서는 여러 객체가 서로 상호작용 하도록 하며, 객체가 제공하는 method를 통해 객체의 속성을 변경시킨다. (ex. 사용자 관리 시스템, ATM 시스템)


객체지향 4가지 핵심요소

  • 캡슐화
  • 상속
  • 다형성
  • 추상화

1. 캡슐화

객체의 속성(Variable)을 보호하기 위해 꼭 필요한 정보와 기능만 외부에 오픈한다.
대부분의 멤버 변수와 메서드를 감추고 외부에 통합된 인터페이스만은 제공하여 일관된 기능을 구현 하게 한다.

Method 설계

  • 속성이 선언되었으나, 상태를 변경하는 method가 없다면 잘 못 선언된 속성이다. 즉 자신이 가지고 있는 속성에 대해서는 해당 상태를 변경하는 기능을 제공해야 한다.
  • 객체가 가진 기능을 모두 제공해야한다.
  • 각각의 Method는 서로 관련성이 있어야 한다. 렌탈/반납, 등록/해지 등 상대되는 기능을 제공해야 한다.
  • 객체 안의 Method는 객체 안의 속성을 처리해야 하며, 다른 객체를 전달받아 다른 객체에 정의된 속성을 직접 처리하면 안된다.

Method의 실행에 필요한 값들은 객체의 형태가 아닌 매개변수의 형태로 전달되어야 한다.

  • 외부에서 접근을 위한 Getter / Setter Method
  • 데이터 처리를 위한 CRUD Method
  • 비즈니스 로직 처리를 위한 Method
  • 객체의 생명 주기 처리를 위한 Method (disconnect(), quit() 등 소멸에 대한 method)
  • 객체의 영구성 관리를 위한 Method (외부에서 접근이 불가능하도록 private 선언하고 Method를 통해 접근하도록 설계)

무결성

  • 객체의 무결성을 위해 변수는 private으로 선언하고, Method를 public으로 선언하는 형태로 작성한다.
  • Getter/Setter를 제외한 public method는 입력된 매개변수를 Validation 한 후에 실행하는 것을 기본으로 한다.
    Validation을 통해 객체의 값을 바꾸거나 값에 대한 유효성을 가질 수 있다.

캡슐화의 장점

  • 객체지향의 패러다임 중 하나인 추상화를 제공한다.

    실제로 Method가 어떻게 동작하는 지는 외부에서 이해할 필요가 없으며, 단순 호출만으로 해당 기능을 실행할 수 있고, 이를 통해 객체 단위로 프로그램 설계가 가능하다.

  • 재사용성 향상

    객체는 단일 객체에만 영향을 주기에, 객체의 모듈성과 응집도가 높아지고 이를 통하여 재사용성이 높아진다.

  • 유지보수와 효율성이 향상된다.


2. 상속

객체지향에서 상속은 속성의 상속이 아닌, 하위로 내려갈수록 구체화 되는 것이다.
이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야 할때 기존 클래스를 상속(inheritance) 받아서 속성이나 기능을 확장하여 객체를 구현한다.

상속하는 클래스 : 상위 클래스, parent class, base class, super class
상속받는 클래스 : 하위 클래스, child class, derived class, subclass

class B(sub class) extends A(super class) {...}

자바는 단일 상속(single inheritance)만을 지원하므로 extends 키워드 뒤에는 단 하나의 클래스만 올 수 있다.

상속의 장점

  • 프로그램 구조에 대한 이해도가 향상된다. 상위 클래스의 구조를 보고 하위 클래스의 동작을 이해할 수 있다.

  • 재사용성 향상

    해당 클래스에 필요한 속성, 메서드를 모두 정의하지 않고 상속을 받아서 사용할 수 있다.

  • 확장성 향상

    일관된 형태의 클래스 객체를 추가할 수 있어 간단하게 프로그램 확장이 가능하다.

  • 유지보수성 향상

    각 객체마다 메서드를 정의하고 있다면 수정 작업이 번거롭지만 상속을 사용한 경우 유지보수가 편리하여 효율성이 향상된다.


3. 다형성

하나의 개체가 여러 자료형으로 구현되어 실행되는 것을 의미하며, 객체지향에서 다형성은 오버라이딩 을 통해 가능하다. 다형성을 잘 활용하면 유연하고 확장성있고, 유지보수가 편리한 프로그램을 만들수 있다.

  • 상위 클래스의 Move() 메서드를 각각의 하위 클래스에서 오버라이딩(재정의)한다.

  • 상위 클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각 클래스에 맞는 기능을 구현한다.
  • 상위 클래스 객체를 선언할 때 하위 클래스로 인스턴스를 생성하면 하위 클래스에서 재정의한 메서드가 호출된다.

이러한 다형성의 특징을 활용하여 하나의 상위 클래스 타입으로 각각의 객체의 속성에 맞게 동작하도록 설계할 수 있다.


4. 추상화

객체지향에서 추상화는 모델링이다. 구체적으로 공통적인 부분, 또는 특정 특성을 분리해서 재조합한다.

profile
모든 시작은 사소함으로부터

0개의 댓글