OOP

gnlenfn·2021년 7월 12일
1

얄팍하게 알고있던 객체 지향에 대해서 정리한다.

객체지향프로그래밍

Object-Oriented Programming

1. 클래스, 객체, 인스턴스

객체지향에 대해 이야기할 때 가장 먼저 헷갈리는 부분이라고 생각한다. 세 가지 용어는 궁극적으로 같은 것을 가리킨다고도 할 수 있지만 상황에 따라 달라지는 이름이라고 할 수 있다.

  • 클래스: 만들고자 하는 객체의 설계도
    클래스를 통해 객체를 구성하는 것들에 대해 정의한다.
  • 객체와 인스턴스: 객체와 인스턴스는 모두 클래스를 실체화(?) 시킨 것이다. 코드를 통해 정의된 클래스를 사용하면 객체, 인스턴스가 된다.
Class A:
    pass
    
a = A()
b = A() 
    

이렇게 코드를 쓴다면 ab는 모두 객체이다. 그리고 각각은 인스턴스이다. 그렇다면 둘의 차이는?
객체는 인스턴스를 포함하는 말이다. 실제적으로 메모리에 구현된 실체는 인스턴스다. ab는 인스턴스가 된다. 메모리에 실제로 할당되었기 때문이다. 객체는 이것보다 추상적으로 모든 인스턴스를 통틀어서 객체라고 한다.

     ...
----(전략)---
class B:
    pass
c = A()
d = B()

이렇게 B라는 클래스가 또 있다면, c, d는 모두 객체이고 c는 A의 인스턴스이며, d는 B의 인스턴스가 된다.

2. 객체지향의 장단점

1) 장점

  1. 코드 재사용이 쉽다.
  2. 유지보수가 쉽다

객체지향을 사용하면 남이 만든 클래스를 가져와서 내 코드에 사용하기 쉽고 상속을 통해 쉽게 변형하여 적용할 수 있다. 그리고 수정할 일이 있을때 하나의 클래스로 많은 객체가 만들어졌다면, 클래스 부분만 수정해도 모두 적용되기 때문에 유지보수가 절차지향에 비해 매우 쉽다.
그래서 객체지향이 절차지향에 비해 대형 프로젝트를 만드는데 유리하다.

2) 단점

  1. 처리속도가 상대적으로 느림
  2. 설계 시 많은 노력과 시간이 필요함

3. 객체지향의 키워드

  1. 클래스, 객체, 인스턴스
  2. 추상화
  3. 캡슐화
  4. 상속
  5. 다형성

1) 클래스, 객체, 인스턴스

위에서 이 세 용어에 대해 설명했으므로 pass

2) 추상화

복잡한 내용은 제외하고 중요한 정보만 표현하도록 한다.
객체들의 공통된 속성이나 기능들을 묶어 이름만 붙여놓는다. (추상 클래스)
그리고 자식 클래스에서 추상 클래스를 상속받아 구체적인 기능을 구현한다.

3) 캡슐화

여러곳에 흩어질 수 있는 기능과 특성을 모아 하나의 캡슐로 만들어 묶어주는 것.
클래스를 만들면서 클래스라는 "캡슐"안에 분류하여 모아주는 것이다. 클래스 외부에서 해당 속성 등에 접근하는 것을 막아 세부적인 내용을 숨기기도 한다. (접근제한자)

4) 상속

객체지향의 핵심 기능 중 하나.

위 사진 같이 Vehicle이라는 클래스는 가장 추상적인 형태가 되고 그 자식 클래스들은 부모 클래스의 속성과 기능을 모두 물려받게 된다. 그리고 자식 클래스는 그 안에서 자신만의 기능이나 속성 등을 추가하며 더 구체적인 구현을 할 수 있다. 이러한 계층적 구조는 아래로 내려갈수록 구체화된 클래스가 되고 위로 갈수록 일반적인 모습을 보여 더 많은 클래스에 영향을 끼친다.

5) 다형성(polymorphism)

다형성, 단어 뜻 그대로 여러 형태가 존재한다는 것이다.
객체지향에서는 상황에 따라 다른 의미로 해석될 수 있는 특징 이라고 할 수 있다.

같은 부모 클래스에서 상속을 받았더라도 자식 클래스의 형태가 달라진다는 것이다. 이때 overriding과 overloading이라는 것이 등장한다.

  • overriding: 부모 클래스에서 정의한 메소드를 같은이름으로 자식 클래스에서 변경하여 사용
  • overloading: 하나의 클래스에서 같은 이름의 메소드를 여러개 가질 수 있게 한다.

내가 사용하는 파이썬에서는 overloading은 지원하지 않는다. 그리고 overriding은 overloading에 비해 받아들이기 쉬운 것 같다.
예를들면, move라는 상위 클래스가 있고 movement라는 메소드가 있다고 하자. 이것을 상속받아 cat, car, airplane이라는 클래스를 만들었다. 세 클래스 모두 이동하는 것을 만들기 위한 것이지만 각각 다른 방식으로 이동할 것이고, 이동하는 속도 등 속성이 모두 다를 것이다. 그래서 자식 클래스에서 새롭게 부모 클래스의 메소드를 정의하는 것이 Overriding이다.
따라서 모두 move라는 부모 클래스에서 상속받은 movement메소드를 사용하지만, 자식 클래스에서 사용되는 메소드는 이름만 같고 다른 기능을 하는 메소드를 사용하게 될 것이다.

overloading의 경우 같은 이름을 가진 메소드지만 서로 다른 파라미터를 가지도록 하여 컴파일러가 다른 메소드로 인식할 수 있도록 하는 것이다. 유사한 일을 수행하지만 파라미터만 다른 메소드를 각각 다른 이름으로 만들면 불편하기 때문에 사용한다. 키패드를 만든다 했을 때, 문서용 키패드 따로, 게임용 키패드 따로 모두 구현하면 비효율적이므로 overloading으로 처리하는 것이다.

Reference

0개의 댓글