객체지향 프로그래밍(Object Oriented Programming)

<< Object Oriented Programming-OOP >> 

절차지향 프로그래밍, 구조적 프로그래밍
        ex) C 프로그래밍
     - 일을 처리하는 순서와 과정을 프로그래밍으로 구현
     - Procedure, Process 를 중시함
     - 순서, 과정이 달라지면 새로운 작업 모델이 필요함
     - 재사용성이 불가능
  반면...
 OOP(객체지향 프로그래밍)는
 - 프로세스 중심이 아닌 객체 중심으로 프로그래밍 하는 것.
 - 재사용성이 뛰어남. 모듈화. 확장성..

□ Object Oriented Programming
      : 인간의 현실세계를 프로그램에 반영한 것.
         즉, 현실세계에 존재하는 객체(object-물건, 물체)를 프로그램에 반영한 것.

   1) Object : 물건, 물체를 의미,  유 무형의 물체
       ex) 자전거, 컴퓨터, 책상, 집, 정치, 윤리, 사회, 공기 ....

   2) 이러한  객체-object의 특징으로는
       속성(attribute)과 행위(behavior)를 갖는다는 것.
        ...따라서 프로그램에 객체를 반영할 때는 먼저  속성과 행위를 뽑아내는 과정이 필요
           -> 이를 객체 모델링이라 한다.

 OOP의 주요 특징
  1) 추상화-Abstraction
 
2) 은닉화-Encapsulation(캡슐화)
  3) 다형성-Polymorphism
  4) 상속성-Inheritance

1) 추상화(Abstraction)란?
   ...어떤 물체(object)에서 주된 특징을 부각시켜 표현하고, 나머지 부분은 과감하게 생략하는 것

   OOP에서 사용되는 추상화도 이와 비슷하다.
   한 물체를 대표하는 속성(명사)과 기능(동사)를 추출해내는 것을 프로그래밍에서는 추상화라고 한다.
   ex) 집을 프로그래밍으로 추상화해보면...
        House
           |-속성(attribute): 방수, 주인이름, 지붕색...
           +-행위(behavior) : 세를 놓다. 수리하다. 청소하다. 사다. 팔다....
       위의 속성은 멤버변수로... 
              행위 또는 기능은 메소드로 표현한다.

 위의 집이란 객체를 자바 프로그램에 추상화해보면

 class House
 {  //...속성...멤버변수: "has a" 관계를 갖는다.
      int room;
      String ownerName;
      String addr;

      public void existAt(String addr){ 
           System.out.println(addr+"에 위치하다");
      }
 }
 class HouseTest   {
      public static void main(String args[]) {
           House h=new House();
           h.existAt("300번지");

           House h2=new House();
           h2.existAt("100번지");
     }
 }////////////////////////////

2) 은닉화(Encapsulation)
   - Data를 캡슐화하되
   - Data에 접근할 때는 메소드로 접근하도록 한다.

  ○ 캡슐화 방법
    ㄱ) 멤버 변수 앞에 private 접근 지정자를 붙인다.
 private 지정자는 자기 클래스에서만 접근 가능한 접근지정자이다.(access modifier);
        ex) private String name;

    ㄴ) 멤버 변수에 값을 할당하고 값을 꺼내올 수 있는 메소드를 만든다.
 - setter/getter메소드.
 - 메소드의 접근 지정자는 public으로 주고
 - setter 메소드들은 반환타입은 없되, 매개변수를 받아들이도록
 - setter 메소드의 역할은 매개변수의 값을 멤버변수에 할당하는 일.
   ex) public void setName(String n) {
    name=n;
       }
 - getter메소드들은 반환타입이 있되 매개변수는 받아들이지 않는다.
 - getter메소드의 역할:  멤버변수 값을 반환해주는 일
    ex) public String getName() {
    return name;
        }
3) 다형성(Polymorphism)

○  오버로딩(Overloading) - 다중정의, 중복정의
○  오버라이딩(Overriding) - 재정의

□  오버로딩(Overloading) - 다중정의, 중복정의
   (기존방식-절차중심)
 밀크커피-  void getMilkCoffee (int cf, int s, int cr)
 블랙커피-  void getBlackCoffee (int cf)
 프림커피-  void getCreamCoffee (int cf, int cr)
  (OOP방식 - 오버로딩)
        void   getTea (int cf, int su, int cr) - 밀크커피
 String getTea (int cf)                - 블랙커피 [o, 반환타입은 신경안씀]
 void   getTea (int cf, int cr)         - 프림커피
 void   getTea (int cf, int sugar)      - 설탕커피[x, 프림커피와 중복됨]
        void   getTea (Yuja y)                - ○, 블랙커피와 데이터형이 다름

        ==> 오버로딩(중복정의,다중정의)
            : 메소드 이름을 동일하게 주되,
              매개변수의 데이터 타입과 갯수, 순서를 다르게 주어 구성하는 것.

    ***오버로딩의 조건***
     1) 오버로딩하려는 메소드 이름이 같아야 한다.
     2) 메소드의 매개변수의 데이터타입이 다르거나, 갯수가 다르거나 순서가 달라야 한다.
     3) 메소드의 반환타입은 신경 안써도 된다 (같아도 되고 달라도 됨)

□ 오버로딩의 종류
    i) 생성자 오버로딩
    ii) 메소드 오버로딩

I ) 생성자 오버로딩
  ○ 생성자란?
     : 객체가 생성될 때 최초로 실행되는 메소드를 의미.
  ○ 생성자 구성시 유의할 점
  a) 생성자 이름은 클래스명과 동일하게
  b) 반환타입을 가져선 안된다.
  c) 생성자의 접근지정자로는 public, protected, 생략형,private 모두 가능하나,
     대부분 public속성을 많이 준다.
     cf) Math 클래스의 경우 생성자에 private 지정자를 두고 있다.

  ○ 생성자의 주요 역할  :  멤버 변수를 초기화 하는 일
  ○ 사용자가 생성자를 구현하지 않았을 경우
     -->컴파일러는 default 생성자를 제공해줌

※ 그러나 사용자가 생성자를 하나라도 구현했다면, 그 때는 컴파일러가 제공 해주는 기본 생성자는 사라진다.
  - 자바에서는 생성자를 다양하게 오버로딩 함으로써 다양한 초기값을 부여하고 있다.

 ○ 생성자 안에서 this()의 사용
    - this()는 자기 자신의 생성자를 호출하는 메소드
    - 한 클래스 안에 여러 개의 생성자가  오버로딩된 형태로 존재하고,
      그 기능이 유사할 때, this라는 키워드를 이용해서 자기 자신의 다른 생성자를  호출할 수 있다.

    - 이 때 주의할 점...
     ㄱ) this()는 생성자 안에서만 호출해야 한다.
     ㄴ) this()를 호출할 때는 반드시 생성자의 첫 번째 문장이어야 한다.
     ㄷ) 또한 생성자 안에서 this()와 super()를 함께 쓸 수 없다.

 ※ this 의 사용(정리)******************************
 1) this.변수 : 자기 클래스의 멤버변수(인스턴스 변수)를 접근할 때 사용
 2) this.메소드: 자기 클래스의 멤버 메소드를  접근할 때 사용
 3) this() : 자기 자신의 생성자 호출 시 사용

 *** this 라는 키워드는 static 메소드 안에서는 사용할 수 없다.

**************************************************
□ 오버라이딩(Overriding)
    ...상속 개념과 맞물려 사용 부모로부터 상속 받은 메소드를 재정의해서 사용하는 것
      : 재정의
   **오버라이딩 조건******************
     - 오버라이드 하려는 메소드가 부모 클래스에 존재해야 한다.
     - 메소드 이름이 동일해야 한다.
     - 메소드의 매개변수 갯수, 데이터타입이 같아야 한다.
     - 메소드의 반환타입도 같아야 한다.
     - 메소드의 접근 지정자는 부모클래스와 동일하거나, 접근 범위가 넓어야 한다.
     - Exception의 경우 부모 클래스의 메소드와 동일하거나 더 구체적인 Exception을
       발생시켜야 한다.

4) 상속성(Inheritance)
  : 기존 클래스에 작은 기능이나 특성을 추가하여 새로운 클래스로 만드는 것을 의미.
    즉 부모클래스를 만들고, 그 부모클래스에 있는 속성과 기능을 자식클래스에서 상속받아,
    새로운 기능과 속성을 추가하는 것.

 -상속 개념을 적용함으로써 개발시간 단축,  재사용성 등에 놀라운 장점이 있다.


-------------+  +--------------+                                  
Person       |      |Student    |
-------------+ <----+--------------+
-name: String|  | - subject    |
-age : int   |  |   : String   |
-------------+  +--------------+
 |
 |
-------------+     상속관계는 "is a" 관계가
Staff        |  성립할 때 맺을 수 있다.
-------------+      ex) Student is a Person
-dept: String|   Staff is a Person
             |   Teacher is a Person
-------------+

**자바에서 상속을 받을 때는 extends 란 키워드를 사용한다.
  자바는 단일 상속 개념이므로 extends 로 상속 받을 수 있는 클래스는 단 하나뿐이다.
/////////////////////////////////////////////
※ super 의 사용(정리)*****************************
   1) super.변수 : 부모클래스로부터 물려받은 변수
   2) super.메소드:   "              "      메소드
   3) super() : 부모클래스의 생성자
 ..super()역시 생성자 안에서만 호출 가능하며, 생성자의 맨 첫줄에 위치 해야 한다.
         super 라는 키워드도 static 메소드 안에서 사용 불가.
         super() 는 부모클래스에 생성자가 오버로딩된 형태로 여러 개 존재할 때 그 중에서
         어떤 생성자를 호출할 지 결정할 수 있다.

 **그러나 super()생성자를 사용자가 명시적으로 호출하지 않는다면, 컴파일러는 자식클래스
   생성자에서 super()의 디폴트 생성자를 자동으로 호출한다.
   ----------------------------------------
  ex)
   class Parent   {
        String name;
       public Parent(String n) {
           name=n;
       }//인자 생성자----
   }//////////////////
   class Son extends Parent  {
       public Son()  {
            super("아무개");  //만일 이 문장이 없다면 에러발생
       }//---------        //컴파일러가 super()를 자동호출 하므로...
    }////////////////////

**************************************************
[실습문제]
좌표를 나타내는 MyPoint클래스를 설계해보자.
   1. 클래스이름: MyPoint
   2. 멤버변수: x, y좌표를 기억시킬 변수
   3. 2의 멤버변수를 캡슐화한다.
   4. 캡슐화한 변수에 접근할 set/get계열 메소드를 구성한다.
   5. MyPoint클래스의 생성자를 구성한다.
      ...3가지 형태로 오버로딩해보자.
   6. this()를 이용해서 멤버변수 값을 초기화하자.
   7. 메소드 구성:
      1) MyPoint클래스의 x, y좌표값을 증가 감소시켜주는 메소드
      2) x와 y값이 같은지를 비교하는 메소드를 구성해보자.
   8. main()메소드를 갖는 PointTest클래스를 만들어
      MyPoint객체 생성해 자기가 구성한 메소드를 호출해보자.
/////////////////////////////////////////////

'Java' 카테고리의 다른 글

예외 처리(Exception)  (0) 2011.11.30
String 클래스의 주요 메서드 정리  (0) 2011.11.30
다형성(Polymorphism)  (0) 2011.11.30
인터페이스(Interface)  (0) 2011.11.30
추상(Abstract) 클래스  (0) 2011.11.30