초기의 프로그래밍은 명령을 순서대로 처리하는 절차지향 프로그래밍
방식이었습니다. 절차지향은 프로그램이 갖는 기능에 대해서만 관심을 두고 프로그램이 처리하는 데이터에 관해서는 관심을 두지 않았었습니다.
이 방식은 간단한 프로그램이 주를 이뤘던 초기 프로그램에서는 별 문제가 없었으나 점점 프로그램이 복잡해지고 거대해지자 그 구조를 쉽게 파악하기가 어려웠고, 유지보수가 상당히 어려웠습니다. 그래서 이러한 문제점을 극복하고자 다양한 프로그래밍 패러다임이 등장했고 그 중에서 프로그래머들의 큰 호응을 받은 것이 객체지향 프로그래밍
이었습니다.
객체지향 프로그래밍(Object Oriented Programming)
은 프로그래밍 패러다임 중 하나로, 속성과 기능을 가진 객체를 만들고 이 객체들 간의 상호작용을 가지고 프로그래밍 로직을 구성하는 프로그래밍 패러다임입니다. 객체를 만들 때 핵심적인 특징과 기능만을 골라오는 추상화 과정을 거쳐서 객체를 구현합니다.
객체(Object)
는 사물 또는 개념을 의미합니다. 우리가 현실에 있는 자동차나 컴퓨터와 같은 사물이 객체가 될 수도 있고, 사칙연산과 같은 논리적 개념도 객체가 될 수 있습니다.
객체지향 프로그래밍을 지원하는 대표적인 언어들로는 Java, C++, C#, Javascript, Python
등이 있습니다. 이 중 Javascript
는 프로토타입 기반 언어라고도 부르기도 합니다. 나머지 언어들은 클래스 기반 언어라고 부릅니다.
클래스(Class)
는 어떤 사물이나 개념을 추상화를 거쳐 속성과 행위를 정의한 것으로 객체를 생성하는데 필요한 일종의 설계도(청사진)가 됩니다. 이때 속성은 멤버 변수가 되고 행위는 메소드가 됩니다.
즉, 클래스
는 객체를 정의해 놓은 것이며, 객체를 생성하기 위해 사용된다고 간단하게 정의할 수 있습니다.
객체지향 프로그래밍의 장점은 다음과 같습니다.
상속
등을 통해서 클래스를 확장하거나 기존의 코드를 사용할 수 있습니다.접근 제어자
, getter/setter
의 존재로 객체를 보호하기 때문에 오류 방지나 보안성을 기대할 수 있습니다.
getter/setter
는 객체의 멤버 변수에 직접 접근하지 못하도록 하는 외부 조작 메소드입니다.
객체지향 프로그래밍은은 절차지향에 비해 속도가 느리다거나, 설계가 어렵다는 등의 단점도 존재합니다.
클래스를 통해 객체를 생성하는 과정을 인스턴스화(instantiate)
라고 하며 인스턴스화를 통해 생성된 객체를 인스턴스(instance)
라고 합니다. 프로그램에서는 클래스가 아닌 인스턴스를 통해 데이터를 다루게 됩니다.
A 클래스를 통해 인스턴스화 한 객체를 A 클래스의 인스턴스라고 부르게 됩니다.
인스턴스화 과정에서 클래스의 생성자를 가지고 인스턴스가 생성되게 됩니다.
객체지향 프로그래밍의 특징은 크게 추상화, 캡슐화, 상속, 다형성
으로 표현할 수 있습니다.
추상화
는 클래스 설계에 필요한 중요한 특징만을 뽑아내 이름을 붙이는 것을 의미합니다.
캡슐화
는 객체의 내부 로직은 감추고, 기능과 사용법만 외부에 공개하는 것 입니다. 캡슐화
라면 접근 제어자를 통해 정보은닉을 할 수 있게 하고 클래스를 독립적으로 만들어주어 코드 재활용이 편리해집니다.
상속
은 부모 클래스의 속성과 기능을 자식 클래스에서 물려받아 자신의 것 처럼 사용할 수 있게 만들어주는 특징입니다. 물려받는 자식 클래스는 속성과 기능을 그대로 사용해도 되고, 재정의를 통해 변경하여 사용할 수도 있습니다.
다형성
은 한가지가 상황에 따라서 여러 개의 형태를 갖는 다는 것을 의미합니다. 다형성
은 오버로딩(overloaindg)
과 오버라이딩(overriding)
을 통해 구현합니다.
더 자세한 내용은 객체지향 설계 포스트에서 확인하실 수 있습니다.