Programming Language/JAVA (2) - 혼공자

[Java 혼자 공부하는 자바] 객체 지향 프로그래밍

나수비니 2023. 9. 23. 17:36
728x90

이 파트 공부 하면서 카타르시스 느꼈다....


객체 지향 프로그래밍 (OOP, Object-Oriented Programming)

  • 핵심 키워드
    • 클래스, 객체, new 연산자, 클래스 변수, 인스턴스, 클래스 멤버
  • 핵심 포인트
    • 객체의 개념과 객체의 상호작용에 대해 알기
    • 클래스로부터 객체를 생성하고, 변수로 참조한다

 

객체 지향 프로그래밍

  • 객체지향프로그래밍이란?
    • 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 ‘객체’들의 모임으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임 중 하나이다.
    • 프로그래밍에서 필요한 데이터를 추상화시켜 상태(속성, 어트리뷰트)와 행위(메서드)를 가진 객체로 객체를 만들고, 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 방법.
      • 머리가 핑핑돈다. 뭐라고 설명해야 하지, 퍼즐이 맞춰지는 기분?…
  • 특징
    • 객체 지향 프로그래밍에서는 모든 데이터를 **객체(objective)**로 취급하며, 이러한 객체가 바로 프로그래밍의 중심이 된다.
    • 객체(objetive)란 간단히 이야기하면 실생활에서 우리가 인식할 수 있는 사물로 비유할 수 있다.
    • 객체를 만들어 내기 위한 설계도와 같은 개념을 **클래스(class)**라고 한다.

 

객체 지향 프로그래밍의 특징

 

추상화(Abstraction)

객체에서 공통된 속성과 행위를 추출해 공통의 속성과 행위를 찾아서 타입을 정의하는 과정

  • 추상 클래스나 추상 클래스가 갖는 추상 메서드를 의미하기 보다는, 클래스를 설계하는 것 자체를 의미한다. 즉, 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다.
  • 추상화는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단하게 만든다.

 

캡슐화(Encapsulation)

객체의 필드와 메서드를 묶고, 실제 구현 내용은 감추는 것이다.

객체 지향 프로그래밍에서 기능과 특성의 모음을 “클래스”라는 “캡슐”에 분류해서 넣는 것

  • 외부 객체는 객체 내부의 구조를 알 수 없으며, 객체가 노출해서(ex.public) 제공하는 필드와 메소드만 이용할 수 있다.
  • 필드와 메소드를 캡슐화 하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하기 위함.
  • 캡슐화의 목적 2가지는?
    • 코드를 재수정 없이 재활용하는 것
    • 접근 제어자를 통한 정보 은닉

 

상속(inheritance)

클래스의 상속은 부모 클래스의 멤버(필드, 메서드, 내부 클래스)를 내려받아 자식 클래스 내부에 포함시키는 것.

자식 클래스에선 부모 클래스의 속성과 기능을 이어받아 사용할 수 있다.

  • 상위(부모) 객체의 필드와 메서드를 하위(자식) 객체에게 물려준다.
  • 부모 객체의 필드와 메서드를 상속받은 자식의 객체에서 그대로 사용할 수 있다.
  • 기능의 일부분을 변경해야 할 경우 상속받은 자식 클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있다.
  • 하위 객체는 상위 객체를 확장해서 추가적인 필드와 메서드를 가질 수 있다.
  • 일반적으로 상위 객체는 종류, 하위 객체는 구체적인 사물에 해당한다.
  • 자식 클래스를 선언할 때, 어떤 부모 클래스를 상속받을 것인지 결정한다.

 

  • 부모(parent class, super class / 상위 클래스)
    • 해당 클래스에 선언된 변수와 함수를 물려주는 클래스
  • 자식(child class, sub class / 하위 클래스)
    • 다른 클래스로부터 물려받고자 하는 클래스
  • 상속의 효과
    • 반복된 코드의 중복을 줄임
    • 유지 보수의 편리성 제공
    • 클래스의 다형적 표현 가능

 

다형성(polymorphism)

같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 말한다. 하나의 변수명, 함수명이 상황에 따라 다른 의미로 해석될 수 있는 것이다.

  • 코드 측면에서 보면, 다형성은 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해준다.
  • 부모 타입에는 모든 자식 객체가 대입
  • 인터페이스 타입에는 모든 구현 객체가 대입
  • 효과: 객체를 부품화시키는 것이 가능, 유지 보수가 용이

 

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

장점

  1. 코드 재사용 용이
  2. 유지 보수 쉬움

단점

  1. 처리속도가 상대적으로 느림
  2. 객체가 많으면 용량이 커질 수 있음
  3. 설계시 많은 시간과 노력이 필요

클래스

  • 설계도. 즉, 객체를 생성하기 위한 필드와 메소드가 정의되어 있다.

 

객체

  • 클래스에 선언된 모양 그대로 생성된 실체, ‘클래스의 인스턴스’. 즉, 사용할 수 있는 실체이다.
  • 물리적으로 존재하거나, 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지며 식별 가능한 것

객체의 속성

  • 필드 (Filed) + 동작 메소드(method)로 구성

 

인스턴스 (instance, 객체)

  • 클래스를 통해서 구현해야할 대상(객체)이 실제로 구현된 구체적인 실체
    • 즉, 객체를 소프트웨어에 실체화 하면 그것을 인스턴스라고 부른다.
    • 실체화된 인스턴스는 메모리에 할당된다.
  • 인스턴스 특징
    • 인스턴스는 객체에 포함된다고 볼 수 있다.
    • oop의 관점에서 객체가 메모리에 할당되어 실제 사용될 때, ‘인스턴스’라고 부른다.
    • 추상적 개념과 구체적 객체 사이의 관계에 초점을 맞출 경우에 사용한다.
      • ‘~의 인스턴스’ 의 형태로 사용된다.
      • 객체는 클래스의 인스턴스다.
      • 객체 간의 링크는 클래스 간의 연관 관계의 인스턴스다.
      • 실행 프로세스는 프로그램의 인스턴스다.

 

클래스, 객체, 인스턴스의 차이

  • 클래스(Class) vs 객체(Objective)
    • 클래스는 ‘설계도’, 객체는 ‘설계도로 구현한 모든 대상’을 의미한다.
  • 객체(Objective) vs 인스턴스(Instance)
    • 클래스의 타입으로 선언되었을 때 → 객체 → 그 객체가 메모리에 할당되어 실제 사용될 때 → 인스턴스