객체지향이란?
Web/Java (Spring+JSP)

객체지향이란?

- 처음부터 다시 개념을 확실히 하도록 하는 차원에서 객체 지향의 개념에 대해 정리해보도록 하겠다.

 

1. 객체 지향의 역사

   - 객체 지향 이전 : C언어와 같이 실행하고자 하는 순서대로 명령어를 입력해서 실행되는 "절차 지향 언어"가 주를 이룸

             -> 점점 프로그램의 복잡도(ex. GUI의 발전)가 증가하면서 유지 보수, 개발 기간에서 비효율이 발생하였다

 

   - 객체 지향 이후 : 객체 지향의 특성인 추상화, 상속, 은닉, 재사용, 인터페이스등 여러 곳에서 객체지향을 활용해 개발.

 

 

  - 객체 지향의 특징

 : 현실에 존재하는 사물을 있는 그대로 모델링하여, 이들의 행위와 속성을 정의하고, 객체가 중심이 되어 실제 사물이 동작하는 방식으로 설계하기 시작하였다.

 

     사물 -> 객체 (Object), 사물이 하는 행위 -> Method,  사물이 갖는 속성 -> 변수 ( Variable)이라고 정의한다.

 

 

->  JAVA는 어떠한 운영체제에서도 JVM만 존재하면 독립적으로 실행될 수 있도록 설계가 되어있어, 여러 플랫폼에서 호환성 제공  : C++가 갖고 있는 시스템 레벨 접근, 메모리 직접 할당및 해제, 포인터와 같은 복잡한 개발 방식 사용 X

 

 

 

2. 객체는 어떻게 설계하는가 ?

모든 객체에는 속성이 존재한다.

 

 

객체의 Method

 

-  객체의 세가지 요소

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

     : 객체는 상태 정보를 저장하고, 유지되어져야 하며, 이러한 속성은 변수로 정의되어야 한다. 이러한 속성값이 바뀜으로 인하여 객체의 상태가 변경될 수 있어야 한다.

 

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

   : 객체는 기능을 제공해야한다. -> 이 부분은 Method를 제공함으로써 이뤄진다.

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

 

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

 : 각각의 객체는 고유한 식별자를 가져야 한다. 

 -> 카드번호, 계좌번호, 자동차 번호와 같은 속성을 통해서 각각 고유한 값을 줄 수 있으며, 이후 이는 DB에서 Primary Key,혹은 Unique key로 작성이 가능하다,

 

 

3. 물리 객체와 개념 객체 

   1) 물리 객체 : 실제로 사물이 존재하며, 이를 클래스로 정의한 객체를 의미한다. 

      ex) 자동차 렌탈 시스템 : 자동차, 고객, 직원, 작업장, 정비소...

 

   2) 개념 객체 : 웹 시스템에서 service에 해당하며, 비즈니스 로직을 처리하는 부분을 의미한다.

     -> 비즈니스 로직에서는 여러 객체를 상호작용하도록 하며, 객체가 제공하는 method를 통해 객체의 상태를 변경한다.

 

 EX) ATM 시스템 : 사용자의 action에 따라 계좌(객체) 의 잔고 속성을 변경하는 입/출금 처리

      사용자 관리 시스템 : 사용자 객체의 마지막 접속일자를 이용하여 탈퇴/휴면 처리...

 

   - 객체지향에서의 대부분의 코딩은 각 객체의 기능을 정의하고, 이를 비즈니스 로직을 처리하는 service에서 객체의 method를 활용하여 객체의 속성을 변경하는 작업이 주된 목적이다.

  -> 이러한 작업을 위해서는 객체의 속성이나 method를 잘 정의해야 한다.

 

 

  4. 객체지향의 4대 특성

   

   1) 캡슐화 (Encapsulation)

     : 캡슐화는 객체의 속성(변수)를 보호하기 위해 사용한다.

   -> 컴퓨터의 전원을 켜기 위해 메인보드를 직접 건드리는게 아니라 전원 버튼을 눌러서 상태를 변경하는 것과 비슷하다고 볼 수 있겠다.

 

    - 속성이 선언되었으나, 이의 상태를 변경하는 메소드가 없다면 잘못 선언된 속성이다.

      (무조건 기능을 제공해야 한다.)

    - 실물 객체가 가진 기능을 모두 제공해야 한다.

    - 각각의 method는 서로 관련성이 있어야 한다. ( 차량 렌탈/반납 등 상대되는 기능을 제공해야 한다.)

    - 객체 안의 method는 객체 자신의 속성만 처리해야 하며, 다른 객체에 정의된 속성을 직접 처리해선 안된다. -> method의 실행에 필요한 값들은 객체의 형태가 아닌 매개변수의 형태로 전달되어야 한다. 

 

 

   - 캡슐화의 장점?

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

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

 

      - 재 사용성이 향상된다. ( method는 단일 객체의 상태에만 영향을 준다.)

      - 유지보수의 효율성이 향상된다.

      - 무결성 보장 가능. ( 주로 변수는 private, method는 public으로 선언함)

       => public method는 입력된 매개변수를 유효성을 검증한 후에 실행하는 것을 기본으로 한다.

 

 

   2) 객체지향에서의 상속은, 하위 개념으로 내려갈수록 내용이 구체화되는 것이다.

 

    - 상속의 장점

      -프로그램 구조에 대한 이해도 향상

        : 최상위 클래스의 구조를 보고, 하위 클래스의 동작을 이해할 수 있다.

     - 재사용성 향상 : 클래스에 필요한 속성/메소드를 새로 정의하지 않고, 상속받아서 사용

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

     - 유지보수성 향상 : 각 객체마다, 자신의 메소드를 정의하고 있다면 코드 수정에서 많은 작업이 필요하지만, 상속을 사용한 경우 일관된 형태로 작성이 가능하다.

  

 

 3) 다형성

 : 다형성이란 하나의 개체가 여러 형태로 변화하는 것을 의미한다. 이는 오버라이딩을 통해서 가능하다.

 

 

4) 추상화

   -> 객체지향에서 말하는 추상화는 모델링이다.

    : 구체적으로 공통적인 부분, 또는 특정 특성을 분리해서 재조합 하는 부분을 추상화라고 한다. 

      (다형성과 상속 모두 추상화에 속한다.)