IT 개발/JAVA

객체 지향 프로그래밍 개념 - 객체(Object)

미웡할꺼야 2021. 1. 10. 19:59

[참고] Oracle > Java Documentation > What is an Object?

[참고] 위키백과 - 객체 (컴퓨터 과학)

[참고] [객체지향] 상태, 행동, 식별자 - 개발의 꽃 - 티스토리

[참고] 객체 정리 | ChoDragon9

[참고] Object-Oriented Programming Concepts - Velog

 

운영체제(OS) : Windows 10 64bit

JDK8 기준 내용임.
Oracle 원문을 네이버 파파고 번역기를 통해 해석한 거라 내용이 이상할 수 있음.

객체란

  • 객체의 행동의 결과는 상태에 영향을 받고, 객체는 유일하게 식별이 가능하다.

    • 한 객체에서 상태가 다르면 같은 행동이라도 행동의 결과는 달라지지만 여전히 식별 가능한 객체이다.

    • ex) 앨리스의 키는 현재 상태에 따라 매우 커질수도 있고, 매우 작아질 수도 있으나, 앨리스는 여전히 앨리스이다.

    • 실제 객체의 상태와 동작을 식별해야 객체 지향 프로그래밍 측면에서 생각하기 쉽다.


상태

  • 상태를 알면 행동의 결과를 쉽게 예측할 수 있다.

  • 객체의 상태는 정적인 프로퍼티(변하지 않는 상태), 동적인 프로퍼티(시간에 따라 변하는 상태)로 구성된다.

  • 객체의 프로퍼티

    • 객체를 구성하는 단순한 값인 속성과 객체와 객체를 연결하는 링크의 조합을 말한다.

  • 객체는 스스로의 행동에 의해서만 상태가 변경된다.

    • 즉, 외부의 객체 메시지를 통해 객체 스스로가 메시지를 참고하여 상태를 변경하는 것이다.


행동

  • 객체의 상태를 변경하는 것은 객체의 자발적인 행동뿐이다(메시지를 받아 상태가 변경되는 것도 결국 객체의 자발적인 행동에 의해 변경되는 것이다).

  • 행동과 상태

    • 행동과 상태의 조합으로 행동을 우아하게 표현할 수 있다.

    • 현재 행동의 결과를 확인할 때, 과거의 행동을 돌아볼 필요 없이 상태를 이용하면 결과를 쉽게 확인할 수 있다.

    • ex) 앨리스의 키가 40cm이면 문을 통과할 수 있다.

  • 협력과 행동

    • 객체의 행동은 두 가지 관점에서 살펴볼 수 있다.

    • 첫 번째로, 객체 자신의 상태 변경. 두 번째로, 협력하는 다른 객체에 대한 메시지 전송.

  • 상태 캡슐화

    • 메시지 송신자는 메시지 수신자의 상태 변경에 대해서는 전혀 알지 못한다. 그저 그러기를 바라고 전달할 뿐이다.

    • 상태를 외부에 노출시키지 않고 행동을 통해 캡슐화하는 것이다(객체의 자율성을 높인 것이다).

    • 자율적인 객체는 스스로 판단하고 스스로 결정하기 때문에 자율성이 높아지고 객체의 지능도 높아진다.

    • 객체의 지능이 높아진다는 것은, 협력하는 과정이 유연하고 간결해진다는 결과를 도출한다. 즉, 이것이 상태 캡슐화의 이유이다.


식별자

  • 객체가 식별 가능하다는 것은 객체를 서로 구별할 수 있는 특정 프로퍼티가 객체 안에 존재하다는 것이다.

  • 객체와 값의 가장 큰 차이는 값은 식별자를 가지지 않지만, 객체는 식별자를 가진다는 점이다.

  • 값과 객체

    • 값(Integer, String)의 경우 불변 상태이므로 두 인스턴스의 상태가 같으면 두 인스턴스는 동등하다고 본다.

    • 객체의 경우 시간에 따라 변경되는 가변 상태이므로 타입이 같은 두 객체의 상태가 같더라도 동등하다고 볼 수 없고, 상태가 다른데도 동일한 객체라고 볼 수 있다.

      • Ex. 이름이 같고, 나이가 같은 두 사람이 함께 있더라도 둘은 명백히 다른 사람이다.

      • Ex. 10년 전의 나와 10년 후의 나는 상태가 다르지만 결국 동일한 사람이다.

  • 여기에서 말하는 것은, 상태를 기반으로 객체의 동일성을 판단할 수 없다는 것이다. 즉, 객체는 식별자에 의해서만 동일성을 검사할 수 있는 것이다.


행동이 상태를 결정한다.

  • 상태를 먼저 결정하고 행동을 결정하는 것은 설계에 나쁜 영향이 끼친다.

  • 그 이유를 살펴보자

    • 첫 번째, 상태를 먼저 결정할 시 캡슐화가 저해된다.(상태가 외부에 노출하는 상황)

    • 두 번째, 객체가 협력자가 아닌 고립된 섬이 된다.

    • 세 번째, 재사용성이 저하된다.(협력을 하지 못하므로)


객체지향 세계와 현실 세계

  • 객체지향 세계는 현실 세계를 추상화한 것이 아니라, 새로운 세계를 가지고 있되, 현실보다 더 많은 특징과 능력을 보유한 객체가 존재하는 것이다.

  • 현실세계는 주가 사람이 되어 사람의 행동에 따라 객체들의 상태가 결정되는데, 객체지향 세계에서는 모두가 주체가 되어 스스로 자신의 상태를 결정한다.


소프트웨어 객체

  • 소프트웨어 객체는 상태 및 관련 동작으로 구성되기에 개념적으로 실제 객체와 유사하다. 

  • 객체는 필드(일부 프로그래밍 언어의 변수)에 상태를 저장하고 메서드(일부 프로그래밍 언어의 함수)를 통해 동작을 표시한다.

  • 메서드는 객체의 내부 상태에서 작동하고 객체 대 객체 통신을 위한 기본 메커니즘 역할을 합니다.

  • 내부 상태를 숨기고 모든 상호 작용이 객체의 방법을 통해 수행되도록 요구하는 것을 데이터 캡슐화라고 한다. 이는 객체 지향 프로그래밍의 기본 원리이다.


객체 지향이 제공하는 이점

  • 모듈화(Modularity)

    • 객체의 소스 코드는 다른 개체의 소스 코드와 독립적으로 쓰고 유지할 수 있다.

    • 일단 생성되면 시스템 내에서 객체를 쉽게 전달(유연성)할 수 있다.

  • 정보 은닉(Information-hiding)

    • 가장 기본적인 특징이며 정보 은닉의 대표적인 예가 데이터 캡슐화라고 할 수 있다.

    • 객체의 메서드와 상호작용함으로써(메서드를 통해 외부와 통신), 내부 구현의 세부사항은 외부로부터 숨겨져 있다(정보 은닉).

  • 코드 재사용(Code re-use)

    • 다른 소프트웨어 개발자가 작성한 객체가 이미 있는 경우 해당 객체를 프로그램에서 사용할 수 있다(재사용성).

    • 이를 통해 전문가는 복잡한 작업별 객체를 구현/테스트/디버그 할 수 있으며, 이 객체를 신뢰할 수 있는 사용자 고유의 코드로 실행할 수 있다.

  • 플러그인 및 디버깅 용이성(Pluggability and debugging ease)

    • 플러그인(Pluggability)은 마음대로 뺐다 꼽았다 하며 대체될 수 있다는 뜻이고 하나의 모듈로서 다른 것과 맞물리지 않기 때문에 디버깅이 쉽다(debugging ease).

    • 특정 객체에 문제가 있는 것이 확인되면 응용 프로그램에서 해당 개체를 제거하고 다른 개체를 대체하여 연결할 수 있다.

    • ex) 볼트가 파손되면 기계 전체가 아닌 볼트만 교체.