객체 지향 프로그래밍

Kyuwon Cho·2022년 3월 6일
0

Computer Science

목록 보기
8/8

Object Oriented Programming

객체 지향 프로그래밍이란?

프로그래밍 방법론이자 하나의 개념을 의미한다.

객체들의 상호작용을 통해 프로그램을 만드는 것을 객체 지향 프로그래밍이라 한다.

객체

객체란 실제로 존재하는 모든 것을 의미하며 사물뿐만이 아니라 개념 또한 객체로 표현할 수 있다.

  • 책상, TV와 같은 사물
  • 수학 공식 같은 논리나 개념

객체 지향 프로그래밍 특징

1. 추상화(Abstraction)

객체들의 공통적인 특징인 속성(Property, data fields)과 기능(Function, methods)을 도출하는 것을 의미한다.

TV를 하나의 객체로 예시
길이, 높이, 무게, 색상, 볼륨 등은 속성으로 표현 가능하다.
키기, 끄기, 볼륨 높이기/낮추기 등은 기능으로 표현 가능하다.

2. 캡슐화(Encapsulation)

데이터 독립이 가능할 수 있도록 속성과 기능을 하나로 묶어서 관리하는 것을 의미한다(data bundling).

추상화를 통해 객체의 공통적인 특징을 도출하면 캡슐화를 통해 하나로 묶어 준다.

정보 은닉(캡슐화 != 정보 은닉)
외부에서 객체로의 접근을 막아 해당 객체의 정보를 알 수 없지만, 객체의 공개된 메소드만을 통해 사용이 가능한 것을 의미한다. 객체의 데이터 및 함수에 직접 접근이 불가하기 때문에 조회 및 변경이 불가하게 된다.

  • 객체의 정보 손상, 오용 최소화
  • 객체 내부 조작 방법이 달라져도 사용 방법은 같다
  • 객체가 다른 객체에 영향을 끼치지 않는다 -> 독립성 유지

객체 모듈화
객체의 응집도화 독립성을 높였기 때문에 객체의 모듈화가 가능하다. 잘된 모듈화는 모듈의 재사용성을 높이고, 중복 코드를 모듈로 대체하면 추후 유지보수시 모듈 내부만을 수정하는 것으로 수정사항을 반영할 수 있게 된다.

모든 메소드를 개방하거나 폐쇄한 객체는 제대로 된 모듈이 될 수 없다. 개방/폐쇄를 적절하게 설계를 해야 모듈로써 의미가 생긴다.

3. 상속(Inheritance)

하나의 클래스가 가진 특징(속성, 기능)을 다른 클래스가 물려받는 것을 의미한다. 이미 작성된 클래스를 물려받는 새로운 클래스는 물려받은 특징을 다시 정의하는데 물려준 부모 클래스는 변화 없이 그대로 유지하는 반면 물려받은 부모 클래스의 필요한 부분은 유지하고 수정할 부분은 수정해서 사용한다. 이 과정을 오버라이딩(Overriding)이라 한다.

상속을 통해 캡슐화를 유지하면서 클래스의 재사용이 가능하다

4. 다형성(Polymorphism)

객체 지향의 고유적 특성으로 특정 상황에 따라 동일한 이름의 함수가 다른 작업을 하는 것을 의미한다.

특정 상황

  • 조상타입으로 자손타입 인스턴스를 참조하면 조상 클래스의 값이 자손 클래스의 값으로 오버라이딩
  • 같은 메소드의 매개변수의 타입에 따라 다르게 동작하는 오버로딩(Overloading)

오버라이딩 vs 오버로딩
오버라이딩은 상속 받은 메서드의 내용을 변경하는 것을 의미한다. 상속 받은 후 같은 선언부의 메서드를 하나 만들면 오버라이딩이 된다. 기능을 추가할 때 사용하는 것으로 아얘 새로운 메서드를 만드는 것보다 상속받은 것을 재활용해서 사용하는 것이 바람직하다.

오버로딩은 한 클래스 내에서 같은 이름의 메서드를 여러 개 정의하는 것을 조건 하에 허용하는 것으로 매개변수의 개수 차이, 타입의 차이를 조건으로 둔다. 이때 클래스(or 메서드)의 반환타입은 오버로딩의 조건과 아무 상관이 없다.

5. (역)직렬화(Serializer, (De)serializer)

서버나 다른 프로그램에 객체를 전송하기 위한 일련의 과정으로 이를 통해 서버와 클라이언트는 객체를 송수신할 수 있다.

직렬화를 통해 객체를 바이트코드로 변환하여 송신하는 것을 의미한다.
역직렬화는 수신한 바이트코드를 다시 객체로 변환하는 것을 의미한다.

자세한 설명은 새로운 글에서

객체 지향 프로그래밍의 장/단점

장점

  1. SW생산성 향상
  • 개발자가 만든 데이터 사용 -> 신뢰성 있는 SW 작성
  • 코드의 재사용성 -> 모듈 재사용
  • 쉬운 수정(업그레이드, 디버깅 등)
  1. 쉬운 실제 세계의 모델링
  • 객체 지향 프로그래밍이 실세계의 모든 것을 객체로 표현해서 개발하는 것이기 때문에 모델링이 편해진다.
  1. 보안성 향상
  • 캡슐화를 통해 정보 은닉의 장점을 가질 수 있다

단점

  1. 절차 지향 프로그래밍에 비해 현저히 느린 실행 속도
  • 캡슐화와 격리 구조로 인한 속도 저하
  1. 추가적인 메모리와 연산에 대한 비용
  • 모든 것을 객체로 표현하기 때문에 포인터 크기의 메모리와 연산에 대한 비용이 든다
  1. 코드가 어렵고 복잡해진다.
  • 그래서 대부분 다중 상속을 지원하지 않는다 -> 생산성 저하

0개의 댓글