객체 지향 프로그래밍

goodjam92·2023년 4월 8일
0
post-thumbnail

서론

객체 지향 프로그래밍 개발 공부를 하다보면 기초적인 개념으로 나오는 객체 지향 프로그래밍이라는 개념이 있다. 데이터에 대한 생각, 데이터 구조, 코드를 어떻게 정리하는지의 방법들이 제시되어있다고 보면 되는데 이번에 한 번 제대로 알아보고자 글을 쓰게됐다.

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

우리는 실생활에서 객체의 실체들과 함께하는데 이 객체들은 각자 역할과 기능이 있다.
예를 들어 카페의 테이블, 의자, 커피잔 등과 같이 이런 사물들조차 객체라고 볼 수 있다. 이러한 개념으로 우리가 프로그래밍을 바라 볼 때 프로그램의 각 부분들을 독립적인 단위의 객체로서 역할을 정의하여 객체들 간의 상호 작용을 통해 프로그램을 만드는 것을 말한다.

객체 지향 프로그래밍의 4가지 원리

  • 캡슐화 (encapsulation)
  • 추상화 (abstraction)
  • 상속 (inheritance)
  • 다형성 (polymorphism)

캡슐화 (encapsulation)

객체에서 구현되는 부분은 private 상태를 갖고, 다른 객체에서 직접적인 접근을 할 수 없다. 객체는 자신의 상태를 method를 통해 관리하며 이 객체와 데이터를 주고 받으려면 public methods를 사용해야 한다. 객체의 데이터와 기능을 하나로 묶어서 관리하여 코드의 수정 시 발생하는 오류를 줄여주면서 객체의 재활용이 원활해진다.

추상화 (abstraction)

어떤 객체가 수행하는 역할에 대한 핵심 개념만 알고 있고, 그 역할의 세부 구현 내용은 드러나지 않아야한다. 쉽게 얘기하면 어떤 기능에 대해 무엇을? 이라는 부분이 보여지고 어떻게? 부분은 숨기는 것을 말한다.

실생활에서의 예로 자판기를 생각해보자. 우린 돈을 넣고 원하는 것을 눌러서 뽑는다. 이 때 돈이 맞는지, 물품 수량 파악, 물품이 나오는 과정 등을 우리가 알 필요가 있을까? 우린 그저 돈을 넣고 뽑을 뿐이다.

상속 (inheritance)

개발을 하다보면 비슷한 로직이나 형태를 가진 객체들이 많이 생성하는데 여러 개의 비슷한 객체를 작성하는 것은 비효율적인 일이 된다. 그래서 상속이라는 개념을 활용한다.

바로 (부모)클래스의 메서드 또는 데이터를 다른 (자식)클래스가 그대로 물려받아 사용할 수 있는 것을 상속이라고 한다. 이를 활용하여 자식 클래스는 부모 클래스의 메서드, 데이터를 모두 물려받으면서, 새로운 메서드 또는 데이터를 추가하여 사용하면서 코드를 재활용 할 수 있다.

다형성 (polymorphism)

하나의 기능이나 객체의 속성이 있을 때 이것들이 다양한 방식으로 동작하는 것을 다형성이라고 한다. 즉 어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할 수 있다. 대표적인 예로 메서드 오버라이딩메서드 오버로딩이 있다.

  • 오버라이딩 (Overriding)
    • 부모 클래스의 메소드와 같은 이름과 매개변수를 사용하면서 내부 구현 동작을 재정의 하는 것
  • 오버로딩 (Overloading)
    • 같은 이름의 함수를 여러 개 정의한 후 매개변수만 다르게 해서 같은 이름을 경우에 따라 호출하여 사용하는 것
  • 코드로 본 다향성의 예시
class Vehicle {
  move() {}
}
// Overriding
class MotorBike extends Vehicle {
  move() {
    console.log("오토바이가 움직인다.");
  }
}
// Overriding
class SportsCar extends Vehicle {
    move() {
    console.log("스포츠카가 움직인다.");
  }
}
// 매개변수로 인터페이스 타입의 참조 변수를 전달
class Driver {
  drive(vehicle) {
    vehicle.move();
  }
}

const sportsCar = new SportsCar();
const motorBike = new MotorBike();
const driver = new Driver();

driver.drive(sportsCar); // "스포츠카가 움직인다."
driver.drive(motorBike); // "오토바이가 움직인다."

객체 지향 프로그래밍은 객체 간 관계와 협력을 설계하는 것인데, 다형성은 그 관계를 보다 유연하고 확장이 용이한 설계가 가능하도록 한다. 또한 다형성을 제대로 활용하기 위해서는 추상화와 상속에 대한 개념들이 함께 존재해야 한다.

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

장점

  • 소프트웨어 생산성 향상
  • 대형 프로젝트에 적합하다.
  • 코드의 재사용성이 높아진다.
  • 유지보수가 용이하다.

단점

  • 절차 지향 프로그래밍에 비해 느린 실행 속도
  • 필요한 메모리양의 증가

끝으로

지금까지 객체 지향 프로그래밍을 알아보았다. 이 주제에 대해 나는 이해를 했어도 이걸 남에게 전달해줄 때 전문적인 용어보단 최대한 쉬운 말로 풀어서 설명한다는 것이 가장 어려운거 같다. 어쨌든 앞으로도 내가 개발을 할 때 꼭 명심해야하는 개념이기에 잊지않도록 이 글을 보며 되새겨야겠다.
.
.
.
.
.
.

참고 사이트
[freeCodeCamp] 6살 아이에게 객체 지향 프로그래밍 개념 설명하는 방법
[인코덤] 객체 지향
[코드잇] 객체 지향 프로그래밍을 알고 계신가요?
[코드스테이츠] 객체 지향 프로그래밍의 4가지 특성

profile
습관을 들이도록 노력하자!

0개의 댓글