1. 객체지향 프로그래밍 (OOP)
  ㅇ 객체들 간에 상호작용을 기반으로 한 프로그램 개발 방법론
     - 프로그램을, `절차 및 데이터`로 함께 묶은 객체들의 집합으로 구성
     - 이때, 각 객체는 동적으로 변할 수 있음
  ㅇ 객체지향 프로그래밍을 지원하는 언어 例
     -  C++,  C#,  Java,  Objective-C,  Ada95,  SmallTalk 등
2. 절차식 프로그래밍, 객체지향 프로그래밍 비교                        ☞ 프로그래밍 패러다임 참조
  ㅇ 객체지향 프로그래밍과 절차식 프로그래밍은, 서로 대비가 됨
  ㅇ 절차식 프로그래밍은,
     - 함수(또는 프로시져)가 중심이되고, 데이터는 보조 기능을 함
        . 이때의 프로그래밍은, 함수 따로 데이터 따로 분리된 형태로 다루어야 함
  ㅇ 객체지향 프로그래밍은,
     - 함수가 아닌 객체가 중심이 되어, 절차와 데이터를 함께 묶음
        . 행위/기능/함수 보다는 객체 중심
        . 논리 보다는 데이터를 지향 함 
           .. 공통의 자료구조를 함께 사용하는,
           .. 서로 밀접하게 관련된 여러 함수(메소드)들로 엮어짐
     * 특히, 규모가 큰 소프트웨어를 개발할 때 효율적임
        . 코드 재사용이 용이하며, 디버깅이 쉬운 반면에,
        . 절차식 보다는 느리고, 설계가 비교적 어려움      ☞ 객체지향 설계 참조
 
3. 객체지향 프로그래밍의 주요 특징
  ㅇ 추상화 (Abstraction)    : 모델링의 기초가 됨
     - 복잡한 실행 절차(메소드)나 데이터를 논리적으로 하나로 묶어, 단순화/추상화시키는 것
        . 데이터 추상화 (Data Abstraction) : 캡슐화, 정보은폐 등
        . 추상 클래스 (Abstract Class) 사용 등
  ㅇ 캡슐화 (Encapsulation)  : 정보 은닉
     - 복잡함을 감추고, 상호 영향을 작게하는 것
  ㅇ 상속성 (Inheritance)    : 재사용/확장 능력 제고
     - 코드의 재사용(reuse) 및 효과적인 확장(extend)
        . 기존에 작성된 클래스의 속성을 물려받아 새로운 클래스를 만들어냄
 
  ㅇ 다형태성 (Polymorphism) : 사용 편의성이 좋아짐
     - 같은 코드로 문맥에 따라 다른 형태나 동작을 할 수 있음
        . [참고] ☞ 오버로딩 오버라이딩 비교 참조
  ㅇ 동적 바인딩 (Dynamic Binding)
     - 실행 중간에도 연결된 속성 변경이 가능
4. 객체지향 프로그래밍의 주요 구성 단위들
  ㅇ 클래스 (Class)
     - 비슷한 특성을 가진 객체들의 모델링 (그룹화시키는 틀, 캡슐화한 것)
  ㅇ 객체 (Object)
     - 속성을 가지며 특정한 작업을 수행할 수 있도록 설계된 것
  ㅇ 인스턴스 (Instance)
     - 만일 객체(Object)가 값을 갖을 경우 보통 인스턴스(Instance)라고 함
  ㅇ 속성 (Attribute)
     - 객체와 관련된 특성이나 변수 같은 것
  ㅇ 메소드 (Method)
     - 객체에 대해 수행할 수 있는 작업/조작 (객체 외부와의 상호작용을 메소드를 통해 수행)
  ㅇ 연산 (Operation) 
     - 객체 자신을 바꾸거나, 외부적으로 바꿈의 효과가 나타나는 것