객체 지향 프로그래밍

이진석·2022년 10월 2일
0

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

프로그램 설계 방법론이자 개념의 일종으로, 명령형 프로그래밍에 속함.

프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수많은 '객체'라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식이다.
어떤 역할을 수행하는 메소드와 변수(데이터)의 묶음으로 구성되어 있으며 객체 지향은 특정 언어에 대한 것이 아니라 개념에 대한 것이다.

지원하는 언어

  • Smalltalk 언어
  • Ruby
  • Python
  • C++
  • Objective-C
  • Java
  • C#
  • ....

중요 요소

  • 캡슐화 (encapsulation)
    변수와 함수를 하나의 단위로 묶는 것을 의미하며 Java에서는 이를 Class를 통해 구현하고 있다.
  • 정보 은닉 (information hiding)
    프로그램의 세부 구현 정보를 외부에 드러나지 않도록 특정 모듈 내부로 감추는 것을 말하며 내부의 구현은 감추고 모듈 내에서의 응집도(cohesion)는
    높이고 외부로의 노출을 최소화하여 모듈간의 결합도(coupling)은 떨어트려 유연함과 유지보수성을 높이는 개념이다.
  • 상속 (inheritance)
    상속은 자식 클래스가 부모 클래스의 특성과 기능을 그대로 물려받는 것을 말하며, 기능의 일부분을 변경해서 사용 할 경우 자식 클래스에서 상속 받은
    그 기능만을 변경해서 다시 정의하게 되는데 이러한 작업을 오버라이딩(overriding)이라고 한다. 상속은 캡슐화를 유지하면서 클래스의 재사용을 용이하도록
    해준다.
  • 다형성 (polymorphism)
    하나의 변수, 또는 함수가 상황에 따라 다른 의미로 해석 될 수 있는 것을 말한다.

    • 서브타입 다형성
      기초 클래스 또는 어떤 인터페이스를 구현하는 상위 클래스를 생성하고, 해당 클래스를 상속받는 다수의 하위 클래스들을 만들어 상위 클래스의 포인터나 참조변수 등이 하위 클래스의 객체를 참조하게 하는 것. 이 때 각각의 하위 클래스는 상위 클래스의 메소드 위에 자신의 메소드를 덮어쓰는 메소드 오버라이딩을 수행. 상위 클래스의 참조변수가 어떤 하위 클래스의 객체를 참조하느냐에 따라 호출되는 메소드가 달라진다.
    • 매개변수 다형성
      타입을 매개변수로 받아 새로운 타입을 되돌려주는 기능, 타입 매개변수를 정의한 클래스 혹은 메소드는 사용할 때 매개변수에 타입을 지정하게 되며, 컴파일 시 지정한 타입에 따라 해석.
      • 템플릿
        C++에서 사용하는 개념으로 타입 매개변수를 입력한 타입으로 치환한 코드를 생성하는 방식.
      • 제네릭
        지정한 타입 매개변수에 해당하는 타입만을 사용하겠다고 약속하는 방식.
    • 임시 다형성
      • 함수 오버로딩
        동일한 이름의 함수를 매개변수에 따라 다른 기능으로 동작하도록 하는 것. 너무 많이 사용하면 전체적인 코드의 유지보수가 어려워지므로 템플릿 또는
        제너릭으로 대체하는 것이 일반적.
      • 연산자 오버로딩
        연산자를 오버로딩해서 기본 연산자가 해당 클래스에 맞는 역할을 수행하게 하는 것. (Java에서는 불가능)
    • 강제 다형성
      • 묵시적 형 변환
        'double b = 30;' 이라는 코드가 실행되면 int형 값이 double 타입으로 묵시적 형 변환이 일어남, double이 int 보다 큰 자료형이기 때문에 이러한 형 변환을 자료형 승급 이라고 함.
      • 명시적 형 변환
        'double b = (double)30;' 처럼 코드를 작성하면 위와 같은 결과가 나오지만 (double)을 통해 int 값이 double 형으로 바뀐다는 것을 명시적으로 표현

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

장점

  • 프로그래밍을 하면서 데이터나 기능에 변화가 생기더라도 관련된 객체만 신경을 쓰면 되어 프로그래밍하기가 좀 더 편하다.
  • 프로그램을 조금 더 의미 있는 단위로 나누기 때문에 코드를 이해하거나 다른 프로그램에서 재사용하기에도 더욱 수월하다.
  • 꼭 전체 코드가 완성되지 않더라도 기능 별로 테스트를 진행 할 수 있기 때문에 테스트에도 유리하다.

단점

  • 코드를 제대로 나누고 설계하는 것이 어렵기 때문에 설계 단계에서부터 많은 노력이 필요하다.
  • 사람이 이해하고 작성하기 방식으로 코드를 나누다보니 컴퓨터가 이해하는데 시간이 걸려 속도가 느려지거나, 공간을 많이 차지하기도 한다.

--> 많은 데이터를 다루는 프로그램이나 규모가 큰 프로젝트 같은 경우에는 객체 지향 프로그래밍을 사용하는 것이 좋고, 극도로 빠른 실행 속도가 필요하거나 저장 장치 또는 성능이 제한적인 기기들(스마트 워치 등)에서 돌아가는 프로그램을 만들 때는 사용하지 않는 것이 좋다.

profile
고양이 두마리의 집사이자 행복 코딩을 추구하는 주니어 개발자입니다!

0개의 댓글