Java/Theory

[Java/Theory]06. OOP

양승길 2016. 5. 30. 16:15

6. OOP(Object Oriented Programming)

    * OOP는 현실세계에 존재하는 것을 시스템으로 표현하는 방법론이다.

    * 현실세계의 모든 것을 객체라는 것으로 추상화 하여 프로그램상으로 반영하는 방식이다.

    * 각 객체간의 통신(Message)을 통해서 결과를 처리하는 방식이다.

    * 객체지향의 기본적인 원리로는 Abstraction, Encapsulation, Modularity 그리고 Hierarchy가 있다. 

    * 이 원리들은 Object, Class, Polymorphism, Relationships라는 개념들에 적용하게 된다.

    * 이들이 지원하는 언어(Java, C++, C#)를 Object Oriented Programming Language라 부르며, 

       Object Oriented Programming 로부터 지원을 받는다.

    * 객체지향은 현재까지도 Promising한 개념이고 차후에도 객체지향을 기반으로 한 프로그래밍이 각광받을 것이다.


    - OOP의 절차

       1. 프로그램 사용 목적을 염두하여 어떤 객체를 만들지 결정한다. (이것을 문제영역에 의존적이라 한다.)

       2. 각 객체들이 어떤 속성과 행동을 가질지 결정한다.

       3. 각 객체들 사이에서 Message를 주고 받는 것을 결정한다.


   - Object Modeling의 과정

       1. 현실 세계의 존재하는 것을 객체로 표현한다.

       2. 객체들을 추상화라는 과정에서 속성과 행동들을 추출한다.

       3. 속성들의 Model을 만들어 내는 것을 Static Modeling이라 부르고

          행동들의 Model을 만들어 내는 것을 Dynamic Modeling이라 부른다.

       4. 객체에서 추출한 속성과 행동에 대하여 공통적이고 일반적인 개념을 Class로 만들어낸다.

          여기까지가 Object Modeling이라 한다.

       5. Object Modeling한 Class를 사용하기 위하여 다양한 Instance를 생성한다.


    -> OOP에서 Message는 객체간 data를 전달하거나 받는 통신 수단이다. Message는 OOPL에서 Method라고 부른다.

        

   - Object(객체)

      * 물리적, 개념적, 소프트웨어적 현실세계에 존재하는 모든 것을 시스템으로 표현하는 대상이다.

      * Class로 부터 생성되어 객체에 있는 속성값은 각자 다르게 만들 수 있다.

      * 모든 객체는 Class에 지정된 동작을 동일하게 수행한다.

      * 객체는 자신의 Responsibility가 있고 서로간의 Message를 주고 받는다.

      * 객체는 Identity, State, Behavior가 내포되어 있다.

      * 또한 아무리 같은 객체들이 있을지라도 각 객체마다 식별할 수 있도록 둔 것이 Identity이다.

      * 객체가 사물이나 사람 따질 것 없이 그 객체만이 보유하는 정보가 있다. 이것을 state라고 한다.

      * state는 시간이나 객체의 행위를 통해 변경되는 특징이 있다. Behavior는 말 그대로 객체가 행동하는 것을 뜻한다.

    

   - Class

     * 여러 객체들의 공통된 점을 모아서 하나로 표현한 것이며, 그 상태와 행위를 표현하는 대상이다.

     * Instance(객체)를 만드는 틀이다. 모든 Instance(객체)들의 생산처다. JVM이 인식하는 단위이다.

     * Class를 만들기 위해 적용되는 OOP의 원리가 Abstraction이다. 객체들의 공통적, 일반적 특징을

       추상적인 개념으로 만는 것으로 볼 수 있다.

    * Bean class

       Object Modeling한 Class, 현실세계를 표현한 Class. main Method가 없다.

    * Application class 

       실제 실행을 하는 클래스. main Method가 있다.

       Java Class에서 속성은 Field, 행동을 Method라 부르고 Field를 선언만 할 경우, 

       정수는 0, 논리는 false, 문자는 null로 초기화 된다.


   - Abstraction(추상화)

      * 여러 객체들의 공통적, 일반적인 특징을 하나의 개념으로 표현하는 과정을 말한다.

      * 즉, 객체들을 구분되는 핵심적인 특징으로 분류하는 원리를 말한다. 추상화는 문제영역에 

        의존적이라는 특징이 있다. Class에 있는 속성들 중 시스템에서 요구하는 것들만 사용하게 되는 것을

        문제영역에 의존적이라 한다.


   - Generalization(일반화) / Inheritance(상속)

      * Inheritance : Super Class와 Sub Class의 관계가 이루어졌을 때, 

                         Generalization과 Specialization이 명확하게 공존하는 개념이다.

                         'Sub Class' is a ' Super Class'라는 명제가 참임을 알 수있게 하는 is a 관계가 성립되야 한다.

                         Super Class에 있는 속성과 행위 등을 Sub Class와 공유하는 것이다.

                         Sub Class에 없는 속성과 행위는 Super Class에서 공유받아 사용된다.

    

                  -> Override : 공유되는 속성과 행위를 Sub Class에서 재사용하거나 추가 및 개선이 가능하는 것이다.

                                Override된 속성과 행위는 자식에게 정의 되었기 때문에 부모의 것으로부터 공유받을 필요가 없다.

    

      * Generalization : 두 개 이상의 class에서 공통된 특징들을 추출하여 하나의 일반화된 상위 Class에 병합하는 과정이다.

                             이 특징들은 attributes, associations, 혹은 method가 될 수 있다.

                             Super Class에 있는 속성과 행위는 Sub Class에 있는 속성과 행위보다 

                             추상화 수준이 높다. 이것이 Generalization이다. 

                            이유인 즉슨 Sub Class에 있는 속성과 행위는 Super Class에 있는 속성과 행위를 

                            대신 할 수 있으나 Super Class의 속성과 행위는 Sub Class에 있는 속성과 행위를 대신 할 수없다.

                            is a 관계가 성립된다.


   - Specialization(구체화)

       * 이미 존재하는 Class에서 새로운 하위 Class를 생성하는 것을 말한다. 

         만약 attributes, associations, 혹은 methods가  상위 Class의 객체에 적용되면

         SubClass 생성될 수 있다. 

       * Generalization / Specialization가 내포된 클래스를 Super Class라 부른다.

       * Specificed classes를 Sub Class라 부른다.

       * Generalization과 반대되는 말로서, Sub Class에 있는 속성과 행위는 Super Class에 있는 

         속성과 행위보다 추상화 수준이 낮다. 이것을 Specialization이라고 한다.

       * is a 관계가 성립된다.


   - Realization(실체화)

       * 실체가 존재하지 않는, 설계화 된 Class와 그 Class의 구체적인 객체들을 표현하는 것의 관계를 말한다.

         이 구체적인 객체는 설계화된 Class를 실질화 하였다.

     (Specialization ===> Generalization <=== Realization)


   - Association

       * 서로 다른 두 객체들의 다양성을 정의하며 1대다, 다대다, 1대1의 관계를 표현할 수 있다.

       * 요구될 때 사용되는 Dependaency와 달리 클래스가 생성될 때부터 타 클래스의 인스턴스를 갖게된다.

       * 그로 인하여 클래스의 생성과 삭제의 과정없이 처리된다.

       * has a 관계가 성립된다.


   - Dependency

       * 한 클래스에서 다른 클래스의 기능이 요구될 때, 그 클래스를 선언하여 사용하는 것을 말한다.

       * 사용이 끝나면 그 클래스는 삭제된다.

       * 한 Class의 행동이나 구조의 변경이 관련된 다른 Class에 영향을 끼치게 되면 두 Class는 Dependency가 있다.

       * 이 둘은 같지 않아도 되고 같아도 상관없다. 한 Class가 다른 Class를 포함할 경우 발생된다.

       * has a 관계가 성립된다.

    

   - Polymorphism

       * 하나의 인터페이스를 각자만의 다양한 방법으로 표현할 수 있는 원리를 말한다.

       * Polymophism이 지원하는 프로그래밍 언어의 문법은 

         Method OverLoading, Method Overriding, Abstract Method, Abstract Class, Interface가 있다.


   - Encapsulation / 절차은익 / 정보은익

       * 객체의 특성과 행위를 하나로 묶어서 외부로부터 보이지 않도록 하는 원리다. 여기서 외부로부터

         보이지 않는 원리는 두 가지로 분류된다.


    1. 절차은닉

       사용자에게 사용 방법만 제공하고 구현은 숨기는 것이다.

       Application Class를 최소화 하고 '해당 프로그램이 무엇을 하는지'만 초점을 둔다.

       프로그램이 진행되는 절차는 사용자로서는 관심이 없다. 

       사용자는 처리의 결과만을 갖고 효율적인 사용을 할 수 있다.

    

    2. 정보은닉

       객체의 중요한 정보를 공개하지 않는 것이다.

       -> Access Modifier    

          public    : 자신 / 동일 Package / 상속 관계 / 그 외 영역 접근 가능

          peotected : 자신 / 동일 Package / 상속 관계 /            접근 가능

          default   : 자신 / 동일 Package /           /            접근 가능

          private   : 자신 /              /           /            접근 가능

          => public, private만 주로 사용됨

       

       -> getter, setter : Instance(객체)의 속성들을 임의로 공개 할 수 없는 Encapsulation의 정보은닉으로 인하여,

                           속성들을 제어하기 위해 getter, setter메소드를 따로 정의 한다. 

                           주 특징은 전달 받은 Message에 따라 가공할 수 있다.



'Java > Theory' 카테고리의 다른 글

[Java/Theory]08. Package  (0) 2016.05.30
[Java/Theory]07. 상속  (0) 2016.05.30
[Java/Theory]05. Reference  (0) 2016.05.30
[Java/Theory]04. Operator, Condition, Array  (0) 2016.05.30
[Java/Theory]03. Datatype  (0) 2016.05.30