[Java] 객체지향이란?

SmileJun·2025년 8월 17일

Java

목록 보기
8/8

객체지향이란

  • 객체 : 현실세계의 실체 및 개념을 반영하는 상태와 행위를 정의한 데이터의 집합
  • 객체 지향 프로그래밍 : 각자의 역할을 지닌 객체들끼리 서로 메세지를 주고받으며 동작할 수 있도록 프로그래밍 하는 것

객체지향의 장점

  • 사람의 관점에서 프로그램을 이해하고 파악하기 쉽다.
  • 강한 응집력과 약한 결합력을 가진다.
  • 재사용성, 확장성, 융통성이 높다.

객체지향의 단점

  • 객체 간의 정보교환이 모두 메세지 교환을 통해 일어나므로 실행 속도가 느리다.
  • 객체가 상태를 갖기 때문에 예상치 못한 부작용이 발생할 수 있다.

객체지향의 특징

  1. 추상화

    • 객체에서 공통된 속성이나 기능을 추출하는 것.
    • 중요하지 않은 것은 감추거나 무시하고, 중요한 것만을 강조하여 추출하는 것.
    • 관점에 따라 추상화의 결과가 달라질 수 있다.
  2. 캡슐화

  • 데이터와 해당 데이터를 처리하는 메서드를 하나로 묶어서 외부에서의 접근을 제한

    • 객체지향에서는 이를 클래스로 정의하고 외부에서 마음대로 접근할 수 없게 하였다.
    • 과거 절차지향 프로그래밍에서는 소스코드가 거대해질수록 데이터가 어디서 어떻게 변화하는지 파악하기 어려웠고 유지보수가 힘들어지는 문제가 발생하였다.
    • 객체지향 프로그래밍에서는 캡슐화를 통해 이런 폐단을 해결하였다.
    • 객체의 데이터는 객체가 제공하는 기능인 메서드를 통해서 접근해야 한다.
    • 내부의 데이터나 함수를 외부에서 참조하지 못하도록 차단하는 개념을 정보 은닉화라고 하며, 이것이 바로 캡슐화라는 개념이다.
  1. 상속

    • 부모의 형질을 이어받는다는 의미로, 부모 클래스의 속성과 메소드를 그대로 활용할 수 있다.
    • 여기에 더해 새로운 속성과 메소드를 추가할 수 있으며, 같은 메소드라 하더라도 오버라이딩(Overriding)을 통하여 재정의하여 다르게 동작하게끔 할 수 있다.
    • 손쉽게 클래스를 재활용할 수 있으며, 부모가 같은 클래스들을 동시에 처리하기 용이하다.
  2. 다형성

    • 같은 코드라 하더라도 상황에 따라 다른 방식으로 동작하는 성질.
    • 클라이언트를 변경하지 않고, 서버의 구현 기능을 우연하게 변경할 수 있다.
    • Java에서 다형성을 구현할 수 있는 대표적인 예로 Overriding과 Overloading이 있다.
      • 오버라이딩(Overriding) : 임의의 클래스가 다른 클래스를 상속 받거나 인터페이스를 구현했을 때, 상위 클래스 또는 인터페이스에 정의되어 있는 메소드를 재정의하여 사용하는 것이다.
      • 오버로딩(Overloading) : 메소드에 주어진 인자(parameter)에 따라 동작을 다르게 구현할 수 있다. 코드의 중복이 줄어들고 가독성이 늘어난다.

객체지향적 설계원칙 (SOLID)

  1. SRP (Single Responsibility Principle) : 단일 책임 원칙

    • 객체는 단 하나의 책임만 가져야 한다.

    • 클래스는 단 하나의 책임을 가져야 하며, 클래스를 변경하는 이유는 단 하나의 이유이어야 한다.

  1. OCP (Open-Closed Principle) : 개방-폐쇄 원칙

    • 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계가 되어야 한다.

    • 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다.

  2. LSP (Liskov Substitution Principle) : 리스코프 치환 원칙

    • 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야 한다.

    • 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.

  3. ISP (Interface Segregation Principle) : 인터페이스 분리 원칙

    • 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
  4. DIP (Dependency Inversion Principle) : 의존 역전 원칙

    • 의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존해야 한다.

    • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.


자바 언어의 객체지향 프로그래밍

  • 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.

역할과 구현을 분리

  • 자바 언어의 다형성을 활용한다.
  • 역할 = 인터페이스, 구현 = 인터페이스를 구현할 클래스, 구현 객체
  • 객체를 설계할 때 역할과 구현을 명확히 분리한다.
  • 객체 설계시 역할을 먼저 부여하고, 그 역할을 수행하는 구현 객체를 만든다.
  • 객체의 협력으로 이루어진다.
    클라이언트 : 요청, 서버 : 응답

객체지향 프로그래밍과 절차지향 프로그래밍의 차이

  1. 절차지향 프로그래밍

    • 실행하고자 하는 절차를 정하고, 이 절차대로 프로그래밍하는 방법
    • 목적을 달성하기 위한 일의 흐름에 중점을 둔다.
  2. 객체지향 프로그래밍

    • 실세상의 물체를 객체로 표현하고, 이들 사이의 관계, 상호 작용을 프로그램으로 나타낸다.
    • 객체를 추출하고 객체들의 관계를 결정하고, 이들의 상호 작용에 필요한 함수(메서드)와 변수(필드)를 설계 및 구현한다.
    • 객체 지향의 핵심은 연관되어 있는 변수와 메서드를 하나의 그룹으로 묶어서 그룹핑하는 것이다.
    • 하나의 클래스를 바탕으로 서로 다른 상태를 가진 인스턴스를 만들면 서로 다른 행동을 하게 된다.
    • 즉, 하나의 클래스가 여러 개의 인스턴스가 될 수 있다는 점이 객체 지향이 제공하는 가장 기본적인 재활용성이라고 할 수 있다.
profile
하루하루는 성실하게, 인생 전체는 되는대로

0개의 댓글