ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 객체지향 프로그래밍에 대해 알아보자
    Language/Java 2023. 12. 27. 17:52

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

    객체지향 프로그래밍이란 프로그램을 데이터와 데이터를 처리하는 행동(메소드)을 가진 객체의 집합으로 보는 프로그래밍 패러다임이다. 프로그래머는 객체의 설계도인 클래스를 통해 객체가 가져야 할 상태와 행동을 정의하고, 객체를 생성하고 조립하며 프로그램을 개발한다.

     

    이미지 출처: https://codingnomads.co/blog/what-is-object-oriented-programming-oop-concepts-in-java

     

    하나의 역할을 수행하기 위해 필요한 데이터와 메소드를 객체로 묶어 사용하기 때문에 재사용이 용이하고, 유연하며, 유지보수하기 쉽기 때문에 대규모 소프트웨어 개발에 사용된다.

    2. 객체지향 프로그래밍의 등장 배경

    프로그래밍 패러다임은 절차지향 프로그래밍 → 구조적 프로그래밍 → 객체지향 프로그래밍 순서대로 등장하였다. 각 패러다임은 이전 패러다임의 단점을 보완하기 위해 고안되었으며 이들의 특징은 다음과 같다.

    • 절차지향 프로그래밍: 입력된 데이터를 순차적으로 처리하며 결과를 도출한다. 초기 프로그래밍 언어에서 널리 사용되었으며, 대표적으로 C언어가 있다.
    • 구조적 프로그래밍: 절차지향 프로그래밍의 개념을 확장한 방식으로, 데이터를 순차적으로 처리하는 부분을 함수로 묶었다.
    • 객체지향 프로그래밍: 데이터와 데이터를 처리하는 함수를 객체로 묶었다. Java, Python, C++등이 객체지향 프로그래밍 언어의 예다.

    즉 객체지향 프로그래밍은 데이터와 데이터를 처리하는 함수를 객체라는 단위로 묶어, 이전 패러다임보다 재사용성, 유지보수성, 가독성을 향상시킨 패러다임이다.

    3. 객체지향 프로그래밍의 특성

    객체지향의 특성으로는 추상화, 상속, 캡슐화, 다형성이 있다. 이러한 특징을 적절하게 활용하면 결합도는 낮고, 응집도는 높은 코드를 작성할 수 있다.

    3.1. 추상화

    추상화는 복잡한 시스템을 단순하게 만들어서 사용자가 이해하고 사용하기 쉽게 하는 것이다. 시스템의 공통되거나, 핵심적인 부분에 초점을 맞추고 복잡한 세부 구현을 숨김으로써 이루어진다. 추상화를 통해 사용자는 애플리케이션이 일을 수행하는 방법이 아니라 수행하는 일 자체에 집중할 수 있다.

    3.1.1. 실 세계 예시

    • 자동차를 운전하는 사람이 있다.
    • 자동차를 운전하는 사람은 페달과 핸들이 무슨 일을 하는지 알고 있지만, 페달과 핸들이 내부적으로 어떻게 차를 동작시키는지는 알지 못한다.
    • 즉 자동차의 복잡한 내부 구현은 숨기고, 간단한 핸들과 페달만 노출시켜 사용자가 내부 구현을 모르더라도 자동차를 운전할 수 있도록 한 것이다.
    • 또한 자동차가 변경되어도 페달과 핸들만 유지된다면 새롭게 자동차 운전 방법을 배울 필요가 없다.

     

    3.2. 상속

    객체 지향 프로그래밍에서 상속은 상위 클래스의 데이터와 메소드를 하위 클래스에서 재사용하는 것을 말한다.

     

    일반적으로 상속 관계는 부모-자식 관계로 알려져있지만, 재사용+확장 개념으로 보는 것이 맞다. 즉 상속 관계를 수직적인 조직도가 아닌 분류도로 봐야 한다. 상속 관계는 "하위 클래스 is a kind of 상위 클래스" 문장을 만족해야 한다.

    • is a kind of 예시:
      • 사람 is a kind of 동물: 사람은 일종의 동물이다.
      • 자동차 is a kind of 이동수단: 자동차는 일종의 이동수단이다.

    객체지향 설계 원칙인 SOLID 원칙 중 리스코프 치환 원칙은 "서브 클래스는 슈퍼 클래스의 역할을 수행할 수 있어야 한다"는 원칙이다. 만약 상속 관계를 부모-자식관계로 바라봐보자. 아들은 아빠의 역할을 수행할 수 없다. 하지만 사람은 동물의 역할을 수행할 수 있다. 이렇듯이 상속 관계는 재사용+확장 개념으로 보는 것이 더 적합하다.

     

    3.3. 캡슐화

    캡슐화는 데이터와 데이터를 조작하는 메소드를 하나의 캡슐로 묶어 정보를 보호하고 외부의 불필요한 접근으로부터 숨기는 것이다. 이를 정보 은닉 매커니즘이라고도 한다. 자바에서는 접근 제어자를 통해 캡슐화를 구현할 수 있다.

     

    3.3.1. 캡슐화 vs 추상화

    추상화와 캡슐화 둘 다 내부의 구체적인 구현을 숨기는 특징이 있어, 이 두가지 개념을 명확하게 구분하는 것이 헷갈렸다.

     

    이 두 개념의 차이는 추상화는 내부의 구현을 숨겨 사용자에게 중요한 기능만 제공하는 데 초점을 맞추고, 캡슐화는 데이터와 메소드를 묶고 외부로부터 보호하는 데 초점을 두고 있다는 것이다.

    4. 다형성

    객체지향 프로그래밍에서 다향성은 객체가 때에 따라 다르게 동작할 수 있게 해주는 것을 의미한다. 대표적인 예시로는 컴파일 다형성인 오버로딩과 런타임 다형성인 오버라이딩이 있다.

    • 오버로딩: 여러 개의 메소드가 동일한 이름을 갖지만 매개변수가 다른 경우 컴파일러가 오버로드된 메소드 중에 어떤 형식을 호출할 것인지 컴파일 시간에 식별한다. 오버로드된 메소드에 따라 객체는 다르게 동작한다.
    • 오버라이딩: 상속한 클래스의 메소드를 재정의하는 오버라이딩은 런타임에 호출할 메소드가 결정된다. 오버라이딩된 메소드에 따라 객체는 다르게 동작한다.

    4. 정리

    객체지향 프로그래밍은 추상화, 상속, 캡슐화, 다형성의 특징을 가진 프로그래밍 매커니즘이다. 이러한 특성을 잘 활용하면 결합도는 낮고, 응집도는 높은 프로그램을 작성할 수 있다. 객체지향의 특징을 잘 살리며 프로그래밍 하기 위한 설계 원칙으로는 SOLID 원칙이 있다.

    5. 참조

    • 자바 코딩 인터뷰 완벽 가이드, 안겔 레오나르드, 6장 객체지향 프로그래밍
    • 스프링 입문을 위한 자바 객체 지향의 원리와 이해, 김종민, 02장 자바와 절차적/ 구조적 프로그래밍
    • 스프링 입문을 위한 자바 객체 지향의 원리와 이해, 김종민, 03장 자바와 객체 지향
Designed by Tistory.