객체 지향 프로그래밍(OOP)과 객체(Object)
객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나
여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 컴퓨터 프로그래밍의
패러다임 중 하나이다
객체 지향 프로그래밍에서 객체(Object)란 실제 사물을 프로그래밍으로 옮겨와 모델링하는 것으로 자신의 속성(PROPERTY)과 행위(Method)를 가지고 있다. 객체의 속성은 객체의 상태, 성질, 데이터 등을 의미하고, 행위란 객체의 기능이나 데이터를 조작하는 연산 등을 의미한다.
객체의 데이터를 사용하기 위해서는 메시지 전송(message Sending)을 통해 간접적으로 데이터를 얻어와야 한다.
객체지향 프로그래밍은 아래와 같이 크게 4가지의 특징을 가지고 있다.
1. 캡슐화(Encapsulation)
캡슐화란 하나의 객체에 대해 그 객체가 특정한 목적을 위해 필요한 변수나 메서드를 하나로 묶는 것을 의미한다.
캡슐화를 위해서는 메소드를 아래와 같이 설계해야 한다.
1) 속성이 선언되었으나 이를 변경하는 메서드가 없다면 잘못된 속성이다.
2) 실물 객체가 가진 모든 기능을 제공해야 한다.
3) 각각의 메소드는 서로 관련성이 있어야 한다.
4) 객체의 변경은 객체 안에 있는 메서드로 처리해야 한다.
예를 들어 자바에서 객체의 private 데이터를 접근할 때 getter 등을 이용해야지만 접근할 수 있는 것은 캡슐화의 일종이다. 이를 통해 정보의 은닉화를 이루어내 의도치 않은 동작 오류를 방지하고 유지보수 효율을 높일 수 있다.
캡슐화를 이용하면 실제 메서드가 어떻게 동작하는지를 외부에 알리지 않고 기능을 실행할 수 있다. 따라서 추상화를 제공할 수 있다. 또한 캡슐화를 추구함으로써 객체의 응집도가 높아져 재사용성이 높아지게 된다.
2. 상속성(Inheritance)
상속성은 기존 상위클래스(Superclass)에 근거하여 새로운 하위 클래스(Subclass)와 행위를 정의할 수 있는 속성이다.
OOP에서 상속성은 재사용성(reuse)을 향상해준다.
예를 들어 [그림 4]의 사람이라는 상위 클래스의 "식사를 한다"라는 메서드가 있다고 하자. 사람의 하위 클래스인 학생과 연예인도 모두 공통적으로 식사를 할 것이다. 이때 상위 클래스의 "식사를 한다"라는 메서드를 상속받아 사용할 수 있으므로 학생과 연예인 클래스에 따로 메서드를 정의할 필요가 없다.
또한 상속성은 상위 클래스의 변경 한 번으로 여러 개의 하위 클래스들의 변경이 가능해 유지보수성이 향상된다.
3. 다형성(Polymorphism)
다형성은 서로 다른 클래스의 객체가 같은 동작 수행 명령을 받았을 때, 각자의 특성에 맞게 동작하는 것을 말한다.
예를 들어 [그림 4]의 학생과 연예인이 모두 "해야 할 일을 한다"라는 같은 메서드가 있다고 하자. 이때 학생에게 "해야 할 일을 한다"를 실행시키면 "공부를 한다"를 실행하고, 연예인에게 "해야할 일을 한다"를 실행시키면 "노래를 부른다"가 실행되도록 할 수 있다.
다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해 준다. 이를 통해 코드의 재사용을 가능케하여 유지보수가 용이하도록 도와줄 수 있다.
4. 추상화(Abstraction)
추상화는 객체들이 공통적으로 필요로 하는 속성이나 동작을 하나로 추출해내는 과정이다.
OOP에서의 추상화는 사물들의 공통적인 특징을 파악한 후, 하나의 묶음으로 만들어내는 것이다.
예를 들어 람보르기니, 페라리, 마세라티 등의 객체들이 있다면 "자동차"라는 개념으로 묶고 "바퀴가 4개 달려있다", "도로를 달린다" 등의 속성을 추출할 수 있을 것이다.
OOP의 장단점
장점
1. 재사용성을 높이고 유지보수가 용이하다.
2. 어떻게 동작하는지 몰라도 여러 기능을 사용할 수 있다.
3. 객체 단위로 데이터를 모델링하여 요구사항을 보다 명확하게 파악할 수 있다.
단점
1. 객체 간의 정보 교환이 메시지 교환을 통해 일어나 실행 시간의 오버헤드가 크다. 즉, 실행이 느리다.
2. 객체의 설계가 쉽지 않다.
'Computer Science > [프로그래밍 언어론]' 카테고리의 다른 글
[프로그래밍 언어론] 객체 지향 설계 5원칙 (SOLID)란? (0) | 2022.02.16 |
---|---|
[프로그래밍 언어론] 컴파일러와 인터프리터의 차이점 (0) | 2022.02.10 |
[프로그래밍 언어론] 파라미터 전달 방식(pass by value, pass by reference, pass by result, pass by value-result, pass by name) 비교 | call by value와 call by reference (0) | 2022.01.14 |
[프로그래밍 언어론] 단축 평가 계산(Short-circuit Evaluation) (0) | 2022.01.13 |
[프로그래밍 언어론] 댕글링 포인터(Dangling Pointer)란? 댕글링 포인터 해결법 (0) | 2022.01.12 |