땃지
ing
땃지
전체 방문자
오늘
어제
  • 분류 전체보기 (100)
    • 공부 (37)
      • Java (4)
      • Spring Boot (4)
      • 자료구조 (4)
      • CS (18)
      • JSP (6)
      • Git (1)
    • 문제 해결 (60)
      • 백준 (51)
      • 프로그래머스 (9)
    • 프로젝트 (3)
      • 당신의 안목 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Contact

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
땃지
객체지향 프로그래밍(OOP)
공부/CS

객체지향 프로그래밍(OOP)

2022. 10. 6. 16:46

객체

객체 지향 프로그램이 정확히 무엇인지 알기 전에 우선 객체의 의미를 알아보자.

객체 지향 프로그래밍에서 객체란 데이터와 기능이 클래스로 캡슐화 된 컴퓨터 자원의 묶음이다. 쉽게 말하면 변수와 메소드를 그룹핑한 개념으로 볼 수 있다.


 

객체 지향 프로그래밍 이전의 패러다임

객체 지향 프로그래밍이 등장하기 전까지의 패러다임들에 대해 알면 객체 지향 프로그래밍이 등장하게 된 이유를 이해하기 더 쉽다.

 

1. 순차적 프로그래밍 (비구조적 프로그래밍)

순차적 프로그래밍은 정의한 기능의 흐름에 따라 순서대로 동작을 추가하며 프로그램을 완성하는 방식이다. 이 방식은 코드의 흐름이 눈에 보여서 매우 직관적이지만 프로그램의 규모가 커지면 적합하지 않아진다.

a→b→c의 순서로 개발하다가 a로 돌아가야 할 때 goto문을 활용해야 하는데 goto문을 무분별하게 사용하면 스파게티 코드가 되고 순차적 프로그래밍의 장점인 직관성마저 잃게 된다.

 

2. 절차적 프로그래밍 (구조적 프로그래밍)

절차적 프로그래밍에서 ‘절차’는 ‘함수’이다. 반복되는 동작을 함수 및 프로시저 형태로 모듈화하여 사용하는 방식이다. 프로시저란 리턴값이 없는 함수를 말한다. 반복되는 동작을 모듈화하기 때문에 코드의 양을 줄일 수 있지만 프로시저가 추상적이라는 단점이 있다.

  • ‘책’이라는 자료형 구현
  • 책에 대한 함수 구현

이렇게 책은 책이고 책에 대한 함수는 따로인 구조여서 이 둘의 연관 여부를 알아차리기가 어렵다.

즉, 논리적으로 묶여있을 수 없는 구조이기 때문에 동작이 추상적인 것이다.

이를 보완하기 위해 등작한 것이 ‘객체 지향 프로그래밍’이다.


객체 지향 프로그래밍

위의 책과 책에 대한 함수처럼 어떤 개념에 대한 자료형과 함수를 ‘객체’ 형태로 묶어 관리하기 위해 객체 지향 프로그래밍이 등장하게 되었다. 가능한 모든 요소를 객체로 관리하고, 객체 내부에 자료형 필드와 함수가 함께 존재하는 것이 핵심 포인트이다.

객체 간의 독립성이 뚜렷하게 생기고, 중복되는 코드의 양이 줄어든다. 따라서 유지보수가 용이하게 된다.

 

객체 지향 프로그래밍 특징

1. 추상화 (Abstraction)

추상화란 객체들이 공통적으로 필요로 하는 속성이나 동작을 하나로 추출해내는 작업이다.

세부적인 사물들의 공통적인 특징을 파악해서 하나의 묶음으로 만들어내는 것이다.

 

2. 캡슐화 (Encapsulation)

정보 은닉화를 통해 높은 응집도, 낮은 결합도를 유지할 수 있도록 설계하는 작업이다.

한 곳에서 변화가 일어나도 다른 곳에 미치는 영향을 최소화시키기 위해 어떤 동작에 대한 구현이 어떻게 되었는지 감추는 것이다. 이를 통해 객체의 손상을 방지할 수 있다.

이러한 높은 응집도와 낮은 결합도는 ‘은닉화’를 통해 이루어질 수 있다.

내부 구조는 private, 외부에서 조작할 수 있는 명령어만 public으로 두어 접근에 제한을 두는 것이다.

 

3. 상속

상속은 여러 개체가 가진 공통된 특성을 하나의 개념이나 법칙으로 성립하는 과정이다. 일반화라고 생각하면 쉽다. 상속은 자식 클래스를 외부로부터 은닉하는 캡슐화의 일종이기도 하다. 상위 클래스에서 부터 상속 받아 중복되는 부분을 사용하고 일부 필요한 것들을 추가해 자식 클래스 생성함으로써 코드 재사용이 용이해진다.

하지만, 객체 지향 프로그래밍에서 ‘코드 재사용’을 목적으로 하는 상속은 적절하지 않다.

  1. 부모 클래스의 변경 불편해짐 → 의존하는 자식 클래스들이 영향을 받게 됨
  2. 불필요한 클래스의 증가
  3. 잘못된 상속의 사용

위의 이유로 코드 재사용 목적의 상속은 하지 않는 것이 좋다.

 

4. 다형성 (Polymorphism)

서로 다른 클래스의 객체가 같은 동작 수행 명령을 받았을 때, 각자의 특성에 맞는 방식으로 동작 하는 것이다. 부모 클래스에서 정의된 메소드의 작업이 자식 클래스에서 다른 것으로 override 될 수 있는 것 또한 이 다형성에서 비롯된 특징이다. 이런 다형성 구현을 통해 코드는 간결해지고, 유연해진다.

 


Reference

- https://velog.io/@haero_kim/객체지향-프로그래밍-이해하기

- https://www.youtube.com/watch?v=vrhIxBWSJ04&list=PLE0hRBClSk5Lcgv3c-I3PH-1LGkv96oYN&index=15

저작자표시 비영리 변경금지 (새창열림)
    '공부/CS' 카테고리의 다른 글
    • 서버(세션) 기반 인증, 토큰 기반 인증
    • REST API
    • 프로세스와 스레드
    • 쿠키, 세션, 캐시
    땃지
    땃지

    티스토리툴바