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

Eunkyung·2021년 12월 25일
0

CS

목록 보기
1/1

나는 비전공자로서 처음 접한 언어가 파이썬이다. 스크립트 언어로 초보자도 쉽게 배울 수 있다는 특징이 있는데 나는 파이썬에 큰 흥미가 없었다. 자바에 처음 눈을 뜬 순간 주력 언어로 삼아야겠다고 생각했다. 변수 선언 시 데이터 유형을 지정해야 하고 파이썬에 비해 코드의 양도 많지만 확실하게 데이터 유형을 지정하고 깔끔하게 정리되는 패키지 구조가 체계적으로 느껴졌다. 자바를 공부하면 "객체 지향 프로그래밍"에 대해서 수없이 듣게 되는데 오늘은 객체 지향 프로그래밍에 대해서 알아보자.

우선, 어떻게 객체 지향 프로그래밍이 등장하게 되었는지 알아보자.
초기 프로그래밍은 절차적 프로그래밍이었다. 절차적 프로그래밍은 순차적으로 동작하는 방식으로 빠르게 처리되는 장점이 있지만, 코드의 양이 늘어날수록 스파게티 코드가 되어 유지보수가 어렵다는 단점이 있다. 이 때, 구조적 프로그래밍이 탄생하게 된다. 구조적 프로그래밍은 함수 단위로 나누고 함수끼리 호출하는 방식으로 큰 문제를 해결하기 위해 작은 함수로 쪼개는 탑-다운 방식이다. 그러나 구조적 프로그래밍도 데이터 자체를 구조화하지는 못해서 많은 양의 로직을 처리하는데 한계가 있었다. 이를 극복하기 위해 객체 지향 프로그래밍이 등장하게 된다. 구조적 프로그래밍과 반대로 작은 문제들을 해결할 수 있는 객체들을 만든 뒤, 이 객체들을 조합해서 큰 문제를 해결하는 상향식 해결법이다.

그렇다면 객체 지향 프로그래밍은 어떤 특징이 있을까? 객체 지향 프로그래밍의 4가지 특징에 대해 알아보자.

첫 번째는 캡슐화이다. 캡슐화는 관련있는 데이터와 메서드를 같은 객체 안으로 모으는 것으로, 객체의 상세 내용을 외부로부터 감추는 것이다. 접근 제어자를 통해 외부에서 데이터에 직접 접근하여 변경하는 것을 제한하고 getter와 setter를 통해 접근하도록 한다. 이렇게 하면 객체 내부의 값이 변경될 때, 유효하지 않은 값으로 바뀌는 문제를 막을 수 있고, 자유롭게 객체 내부를 변경할 수 있다. 그 결과 응집도를 높이고 결합도를 낮출 수 있다.

두 번째는 추상화이다. 추상화는 불필요한 정보를 감춤으로써 복잡도를 낮추는 것이다. 일례로 우리가 커피머신을 이용해 커피를 마시는 과정을 생각해보자. 우리는 캡슐을 넣는 곳과 물의 양, 눌러야 하는 버튼에 대해서는 알아야 하지만, 내부적인 커피머신의 작동 원리에 대해서는 알 필요가 없다. 이처럼 내부 동작을 몰라도 다음 기능을 개발할 수 있도록 하는 것이 추상화이다.

세 번째는 상속이다. 클래스를 정의할 때, 다른 클래스가 가지고 있는 기능을 물려받을 수 있어 재사용성이 높아진다는 특징이 있다. 매번 같은 함수를 만드는 것은 코드의 중복이 발생하여 비효율적이고 재사용이 떨어져 상위 클래스에 공통된 기능을 구현하고 해당 클래스를 상속받는다. 그러나 자식 클래스가 부모 클래스에 강하게 결합되어 캡슐화를 깨뜨린다는 단점이 있다.

마지막으로 객체 지향의 꽃 다형성이다. 다형성은 하나의 속성이 여러 가지 형태를 가질 수 있는 것으로 기능의 확장 및 변경을 가능하게 해준다. 다형성의 종류는 크게 런타임 타입 발생과 컴파일 타입 발생이 있다. 런타임 발생의 대표적인 예는 오버라이딩으로 상속받은 부모 클래스의 메소드를 재정의하여 사용하는 것이다. 어떤 객체가 함수를 호출하는지에 따라 호출되는 오버라이드된 함수의 모습이 결정되고 컴파일 시에 알 수 없다는 특징이 있다. 컴파일 타임 발생의 대표적인 예는 오버로딩으로 메서드 이름은 같지만 매개변수 개수나 타입, 순서를 다르게 지정할 수 있다.

Reference
profile
꾸준히 하자

0개의 댓글