객체지향 프로그래밍(OOP)의 주요 개념 정리

Sheryl Yun·2023년 5월 11일
0

객체지향 프로그래밍에 대해 정리해본다.

객체지향 프로그래밍 🏰

IT기업 신입사원 기술면접에서 면접자들 긴장을 풀어줄 겸 워밍업으로 자주 나오는 가장 기본 질문 개념이라고 하는데 정말...? 😭

개념

컴퓨터 프로그래밍 패러다임 중 하나이다.

  • 필요한 데이터를 추상화시켜
  • 상태행위를 가진 객체로 만들고
  • 객체들 간의 유기적 상호 작용을 통해 로직을 구성

하는 프로그래밍 방법

장점

▶ 코드 재사용성 높음

  • 남이 만든 클래스를 가져와서 이용 가능
  • 상속을 통해 확장해서도 사용 가능

▶ 유지 보수가 쉬움

  • 수정해야 할 부분이 클래스 내부에 멤버 변수 혹은 메서드로 존재하여
  • 해당 부분을 쉽게 찾아 수정 가능

절차지향 프로그래밍 (반대 개념)
수정해야 할 코드를 흐르는 코드 속에서(?) 찾아 수정해야 함

▶ 모듈화 개발 가능 -> 대형 프로젝트에 적합

  • 클래스 단위로 모듈화시켜서 개발 가능
  • 대형 프로젝트처럼 개발 인원이나 회사가 많을 때 업무 분장 쉬움

단점

▶ 처리 속도가 상대적으로 느림

▶ 객체가 많으면 용량이 커질 수 있음

▶ 설계 시 많은 시간과 노력 필요

추상화 🌠

  • 각각의 객체가 반드시 자신을 사용하는
  • 하나의 상위 개념 동작 방식(mechanism)에만 노출되는 것
  • 내부 구현 상세 내용은 숨기는 것

예: 커피 머신 생각해보기 ☕
기계 안에서는 많은 일이 일어나고 소리가 시끄럽지만
사람이 해야 할 일은 커피를 넣고 버튼을 누르는 것이 전부

  • 동작 방법은 사용하기 쉬워야 하고
  • 시간이 지나도 거의 바뀌지 않아야 한다.
  • 즉, 해당 클래스가 어떻게 일하는지 "알지" 못하는 채로
  • 해당 클래스의 퍼블릭 메소드만 호출해서 사용하는 것

즉, 객체지향 프로그래밍이란 추상화된 집합들이 모여 만들어진 것

  • 구현 상세 내용은 숨겨져 있고
  • 알아야 할 것은 짧은 동작 집합뿐

상속 👨‍👧‍👧

개념

  • 부모 클래스의 속성과 기능을 자식 클래스에서 그대로 이어받아 사용할 수 있는 것
  • 기능의 일부분을 변경해야 할 경우,
  • 자식 클래스에서 해당 기능만 다시 수정(정의)하여 사용 가능

즉, 자녀 클래스는 부모 클래스의 모든 필드와 메소드(= 공통되는 부분)를 재사용하고, 자체적인 것(= 독립 부분)만 자신 쪽에 구현해서 사용

다중 상속은 불가

  • 클래스의 상속 관계에서 혼란을 줄 수 있기 때문에
  • 상속은 반드시 하나만 가능
  • 필요에 따라 인터페이스를 사용하도록 함

2. 캡슐화 💊

개념

  • 각각의 객체들이 클래스 안에서 자신의 상태를 private하게 유지하는 것
  • 다른 객체들이 그 상태에 대한 직접 접근할 수 없고,
  • 대신 메소드라고 불리는 퍼블릭(public)한 함수를 호출

즉, 객체는 자신의 상태를 메소드를 통해 관리한다.
어떤 다른 클래스라도 (예외적으로 허용되지 않는 이상) 상태를 직접 변경할 수 없음

  • 해당 객체와 전달을 주고받고 싶다면 제공된 메소드를 사용해야 한다.

2가지 목적

1. 코드를 수정 없이 재활용
2. 접근 제어자를 통한 정보 은닉

절차 지향 프로그래밍에서도 변수와 함수 재활용이 가능하지만, 코드의 수정이 일어났을 때 영향 범위를 예상하기 어렵다.

객체 지향 프로그래밍에서는 캡슐화를 통해 객체가 외부에 노출하지 않아야 할 정보나 기능을 접근 제어자를 통해 제어 권한이 있는 객체에서만 접근하도록 할 수 있다.
따라서 코드의 수정이 일어났을 때 책임이 있는 객체만 수정하면 되어서 영향의 범위를 예측하는데 수월하고 재사용도 쉬워졌다.

즉, 기능과 특성을 "클래스"라는 "캡슐"에 분류해서 넣는 것

=> 객체가 맡은 역할을 수행하기 위해 하나의 목적을 한데 묶음 (SRP)

getter와 setter 를 사용하는 이유

멤버 변수에 직접 접근할 수 없도록
private으로 접근 지정자를 설정(= 캡슐화)하고
getter, setter 메서드는 public으로 만든다.

🤔 public 메서드면 아무나 접근 가능할텐데 왜 private?
=> getter, setter를 사용하여 메서드를 통해서 접근하는 과정에서
잘못된 매개변수와 같은 올바르지 않은 입력에 대해
메서드 내부에서 사전에 처리(제한 및 조절)가 가능하기 때문

다형성

개념

하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것

부모 클래스부터 상속된 몇 개의 자녀 클래스가 있다고 가정해보자.

이러한 클래스들이 모두 혼합되어 담겨있는 컬렉션(예: 리스트)를 사용하고 싶거나
부모 클래스를 위해 구현된 메소드를 자녀 클래스를 통해서도 사용하고 싶을 때

=> 다형성을 사용하여 해결 가능

어떤 클래스를 부모 클래스와 정확히 동일하게 사용하여
혼합된 타입에 대한 혼란이 발생하지 않도록 함

  • 각자의 자녀 클래스들은 그 자체로 자신의 메소드를 유지

그림 예시가 있었다 😊

  • 도형들은 면적과 둘레를 계산하기 위해 일반 인터페이스를 재사용

  • 삼각형과 원, 사각형 도형이 모여 각자 Figure 인터페이스를 참조

  • 부모 Figure Interface를 가지고 triangles, circles, rectangles 등의 도형을 생성 가능

  • 이 도형들의 면적을 계산하려 하면 인터페이스에서 올바른 메소드가 찾아지고 실행됨

  • 구성 요소가 삼각형이라면 삼각형의 CalculateSurface()가 호출되고 원이라면 원의 CalculateSurface()가 호출되는 식

  • 도형이 자신의 매개 변수(parameter)를 이용하여 동작하는 함수를 상위(인터페이스)에서 사용할 수 있음
    => 같은 함수를 세 번(삼각형, 원, 사각형 각각) 정의할 필요가 없음

정의는 Figure를 인터페이스에서 한 번만 하고
삼각형, 원, 사각형 어떤 것이든 해당 함수를 필요로 하는 객체를 만들 수 있다.

예: 오버라이딩(Overriding), 오버로딩(Overloading)

  • 오버라이딩
    부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는것

  • 오버로딩
    같은 이름의 함수를 여러 개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것

다형성을 쓰는 이유

[ 프리온보딩 수업 내용 👸 ]

  • if문에 else가 있으면 2가지를 생각해야 한다.
  • 다형성은 if문(분기)을 없애기 위한 방법
  • 분기를 없애야 하는 이유:
    • 코드를 linear하게 읽기 위해
  • 다형성을 사용해도 if문을 포함하지만
    • if문이 드러나있지 않고 추상화 안에 숨겨져있다.

참고 자료 📒

객체 지향 프로그래밍이 뭔가요?
6살 아이에게(😘) 객체 지향 프로그래밍 개념 설명하는 방법

profile
데이터 분석가 준비 중입니다 (티스토리에 기록: https://cherylog.tistory.com/)

0개의 댓글