객체지향 프로그래밍 (OOP)

객체지향 프로그래밍 (OOP)

자바에 대해 공부하면서 객체지향이라는 개념을 알게 되었습니다.

이 객체지향이라는 단어는 많이 들어왔지만 정작 잘 모르고 있었던 것 같아 개념을 잡아보면서 정리를 해보려 합니다.

절차 지향 프로그래밍 (Procedure Programming)

절차 지향 프로그래밍은 객체지향 언어 개념이 나오면서 기존 프로그래밍 방식을 표현하기 위해 사용되는 개념입니다.

이 프로그래밍 기법의 큰 틀은 일렬의 동작(모듈, 함수)들을 순서에 맞게 단계적으로 실행된다는 것입니다.

데이터와 속성보다는 명령어의 순서와 흐름에 포커싱 되어 있습니다.

소프트웨어 규모가 커지고 기능들이 복잡해지면서 추가 개발이나 유지보수의 어려움의 한계를 느끼게 되었는데 이에 객체지향 프로그래밍이 나오게 됐습니다.

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

클래스(Class)를 생성하고 클래스로부터 객체를 만들어 객체 간의 상호작용을 이용하여 주어진 문제를 해결하는 프로그래밍 방식입니다.

데이터인 필드와 절차인 메서드를 하나로 묶은 클래스 단위의 프로그래밍 방법론입니다.

현실 세계를 객체 단위로 프로그래밍하고 객체는 필드와 메서드를 하나의 블록으로 묶어서 표현합니다.

객체(Object)

현실 세계의 사물이나 개념을 시스템에서 이용하기 위해 현실 세계를 자연스럽게 표현하여

손쉽게 이용할 수 있도록 만든 소프트웨어 모델입니다.

객체는 현실 세계에 있는 이 사물이나 개념을 표현할 때 속성(attributes, properties)과 행동(messages, behaviors)을 이용하여 표현하고는 합니다.

속성

이 속성은 객체 내지는 사물이 가지고 있는 어떤 값입니다. 객체의 특성을 표현하는 정적인 성질이고

프로그래밍에서 속성은 필드(field)라 합니다.

행동

행동은 객체 내부의 일을 처리하거나 객체들 간의 서로 영향을 주고받는 동적인 일을 처리하는 단위입니다.

프로그래밍에서 행동은 메서드(method)라 합니다.

클래스

객체를 만들기 위한 모형이자 틀(template)이라 할 수 있는데, 객체를 만들려면 반드시 객체의 다양한 특성을 표현할 수 있는 모형인 클래스가 필요합니다.

그리고 이 클래스를 통해 만들어진 객체는 클래스의 구체적인 하나의 실례(instance)입니다.

이 객체와 클래스의 예시를 들자면 붕어빵을 찍어내는 붕어빵 틀을 클래스(Class)로 볼 수 있고 이 틀에서 구워져 나오는 붕어빵 하나하나를 클래스를 통해 만들어진 객체, 인스턴스로 볼 수 있는 것입니다.

객체지향 프로그래밍의 특징은 추상화, 캡슐화, 상속성, 다형성이 있습니다.

추상화 (Abstraction)

추상화는 실세계의 객체에서 불필요한 부분을 제거하여

필요한 부분만을 간결하고 이해하기 쉬운 클래스로 만드는 작업입니다.

현실 세계에 있는 자동차를 추상화된 코드로 가져온다고 했을 때 자동차의 특징을 필드와 메서드로 가져와 클래스로 만들어 구현을 할 수 있습니다.

필요한 부분들을 속성과 행동으로 구체화하여 만들어 클래스화 하는 것이 추상화의 목적입니다.

캡슐화 (Encapsulation)

캡슐화란 객체의 자료와 행위를 클래스 단위로 하나로 묶고, 실제 내부 구현 내용을 외부에 감추는 것입니다.

예를 들어 음료수를 뽑아서 먹을 수 있는 자판기가 있습니다.

우리는 이 자판기에 동전을 넣는 행위를 하고 음료수를 고르면 해당하는 음료수가 리턴되어 마실 수 있습니다.

실제로 자판기에서 음료수가 나오기 전까지 많은 동작들이 수행되지만 이용자가 이 동작들을 다 알지는 못 합니다.

여기서 객체와 객체 간의 의사소통을 위한 정보만을 노출시키고, 실제 내부 구현 정보는 은닉하는 것이 캡슐화의 목적입니다.

상속성 (Inheritance)

상속성은 객체지향의 가장 핵심이 되는 개념입니다.

상속되는 속성을 제공하는 상위 클래스와 하위 클래스들은 계층도의 관계를 가집니다.

예를 들어, 사람이라는 상위 클래스가 있고 이를 상속받는 여러 직업의 하위 클래스들이 있습니다. 이 직업들의 속성을 또 상속받는 다른 하위 클래스들도 수많이 있는데, 이 하위 클래스들을 상속이라는 개념을 사용하지 않고 개개로 사용하게 된다면 중복되는 속성들을 계속 반복적으로 기술해줘야 합니다.

이러한 공통의 특성을 하위 클래스마다 반복적으로 기술하지 않고 한 번만 기술하기 때문에

중복을 줄여 재사용성의 효과를 늘리는 것이 상속성의 목적입니다.

다형성(polymorphism)

다형성은 원래 생물학적 용어로 여러(poly) 형태(morphy)를 의미합니다.

외부에 보이는 모습은 한 가지 형태이지만 실질적으로 쓰이는 기능은 여러 가지 역할을 수행한다는 의미로 쓰입니다.

예를 들어 "이동한다"라는 말을 들었을 때 우리는 이 이동한다라는 내용에 대한 메서드를 생각해 볼 수 있습니다.

그러나, 이 "이동한다"라는 메서드는 객체가 무엇이냐에 따라 여러 의미로 해석됩니다.

사람에 관해서는 "걸어서 이동한다", 자동차에 관해서는 "바퀴로 이동한다", 그리고 비행기는 "날아서 이동한다"로 생각해 볼 수 있겠죠.

객체의 종류에 따라, 상황에 따라 의미가 달라지는 것을 다형성이라 합니다.

from http://carrotdevelopment.tistory.com/2 by ccl(A) rewrite - 2021-11-28 02:01:34