1. 정의

상태(데이터, 변수)와 행위(데이터 처리, 메소드)를 묶어 객체를 만들고 객체들의 상호작용으로 프로그램을 구현하는 방식

2. 특징

2.1. 캡슐화(Encapsulation)

  • 변수와 함수(메소드)를 하나의 단위로 묶는 것(데이터의 번들링). 보통 클래스를 통해 구현
  • 클래스의 인스턴스를 통해 클래스에 포함되어 있는 변수와 함수에 쉽게 접근할 수 있다.
  • 모듈화 향상, 인터페이스 간결
  • 정보 은닉(Information hiding)
    • 내부 구현을 숨겨 모듈 내의 응집도를 높이고, 모듈간의 결합도를 낮춰 유연성과 유지보수성을 높인다.
    • 정보 은닉은 캡슐화로부터 파생된 보조 개념(캡슐화 != 정보 은닉)

2.2. 상속(Inheritance)

  • 상위 클래스의 특성과 기능을 이용하거나 확장할 수 있다.
  • 같은 타입으로 묶을 수 있다.
  • 계층 구조를 이룰 수 있다.
  • 캡슐화를 유지하면서도 클래스의 재사용 용이

2.3. 다형성(Polymorphism)

  • 하나의 인터페이스를 이용해 서로 다른 구현을 제공
    • 다형성은 메서드 오버로딩과 메서드 오버라이딩을 통해 지원된다.
  • 하나의 변수, 또는 함수(메소드)가 상황에 따라 다르게 해석되는 것
  • 장점
    • 하나의 타입으로 관리할 수 있다.
    • 메소드의 활용 범위를 넓힐 수 있다.
  • 서브타입 다형성
    • 기초 클래스 또는 인터페이스를 구현하는 상위 클래스를 생성하고 해당 클래스를 상속받는 다수의 하위 클래스들을 만들어 상위 클래스의 포인터나 참조 변수 등이 하위 클래스의 객체를 참조하는 것
    • 상위 클래스의 메소드 위에 하위 클래스의 메소드를 덮어쓰는 오버라이딩을 통해 상위 클래스의 참조 변수에 의해 참조되는 하위 클래스의 메소드가 호출된다.
  • 매개변수 다형성
    • 타입을 매개변수로 받아 새로운 타입을 되돌려주는 기능
    • C++의 템플릿(Template), Java의 제네릭(Generic)
  • 임시 다형성
    • 함수 오버로딩 : 매개변수가 다른 동일한 이름의 함수를 여러 개 생성하는 것. 본질적으로는 같다.
    • 연산자 오버로딩 : 기본 연산자가 수행되는 클래스에 따라 다르게 동작하도록 하는 것. C++, C#에서 제공
  • 강제 다형성
    • 묵시적 형 변환 : 손실이 적은 방향인 작은 자료형에서 큰 자료형으로 이루어진다.
    • 명시적 형 변환 : 원하는 형태를 명시하여 형을 변환할 수 있다.

2.4. 추상화(Abstraction)

  • 핵심적인 개념 또는 기능 등을 간추려 내는 것
  • 클래스간의 공통점을 찾아서 공통의 조상을 만드는 작업(구체화 : 상속을 통해 클래스를 구현, 확장하는 작업)
  • 현실 세게에 존재하는 다양한 객체들의 공통된 특성을 모아 일반화 해놓은 것
  • 추상 클래스, 추상 메소드
  • 2.5. 메시지(Message)

  • 객체 간 서로 통신하는 방법
  • 여러 객체는 동일한 프로세스를 가질 필요 없음

3. 대표 언어

  • [[java]]
  • C++
  • C#

4. 장단점

  • 장점 : 모듈화되어 있기 때문에 코드의 재사용(생산성 향상), 유지보수가 용이
  • 단점 : 설계의 어려움, 캡슐화로 인한 많은 함수 호출 등으로 처리 속도가 상대적으로 느리다.

5. 참고

  • 클래스(Class) : 변수와 메소드의 집합. 설계도 또는 틀.
  • 객체(Object) : 코드 상에서 자료형이 임의의 클래스로 선언된 식별자를 말한다.
  • 인스턴스(Instance) : 메모리에 할당된 객체를 말한다.
/* 클래스 */
public class Car {
  ...
}
/* 객체와 인스턴스 */
public class Main {
	public static void main(String[] args) {
		Car truck, fireEngine; // '객체'

		// 인스턴스화
		truck = new Car(); // Car 클래스의 '인스턴스'(객체를 메모리에 할당)
		fireEngine = new Car(); // Car 클래스의 '인스턴스'(객체를 메모리에 할당)
	}
}