객체지향 프로그래밍
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 클래스의 '인스턴스'(객체를 메모리에 할당)
}
}