5/1

justyoon·2023년 5월 1일
0

문제

강의를 듣고 강의 내용대로만 따라한다면 실질적인 발전이 이뤄지지 않는다는 걸 체감하게 되었다. 하지만 체력이 달리는게 느껴진다. 그래도 양적으로 코드를 많이 작성하는 건 큰 도움이 되었으니 알고리즘도 개념정리도 놓칠 수는 없다.
또한 실질적인 팀 커뮤니케이션에 있어서 방법적으로 도움이 되는 부분을 많이 배우고 있다.
하지만 협업툴을 더 적극적으로 활용하려면 사용법을 익히고 팀원에게 공유할 수 있어야겠다 생각했다.


시도

get_area는 면적을 프린트 대신 리턴으로 반환하게 짜주셔야 제 기분이 더 좋습니다. 
메소드 이름이 get이기 때문에 리턴이 되야 마음이 편합니다.
- 강박증이 있어요😅 - oo튜터님


해결

Github


알게된

Object-Oriented Programming

Object-oriented programming OOP 객체 지향 프로그래밍
🟰 추상화, 상속, 다형성, 캡슐화 특성을 활용하여 프로그래밍을 설계할 때 역할구현을 구분, 객체들 간의 직접적인 결합을 피하고, 느슨한 관계 설정을 통해 보다 유연하고 변경이 용이한 프로그램 설계를 가능하게 만들었습니다.


💡 Abstraction : 추상화

추상이라는 용어의 사전적 의미를 보면

“사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는 것”

이라 정의하고 있는데요 여기서 핵심이 되는 개념은 “공통성과 본질을 모아 추출”한다는 것입니다.

  • 예를 들면, 서울의 지하철 노선도는 서울의 지리를 추상화시켜서 보여주는 대표적인 예라 할 수 있습니다.

  • 중요한 부분을 강조하기 위해 불필요한 세부 사항들은 제거하고 가장 본질적이고 공통적인 부분만을 추출하여 표현하는 것과 관련이 있습니다.

  • 즉 객체 지향 프로그래밍에서 의미하는 추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는것이라 할 수 있습니다.

  • 추상화를 구현할 수 있는 문법 요소로는 추상 클래스(abstract class)인터페이스(interface)가 있습니다.

    Abstract class : 추상 클래스

    • 구체적인 구현 없이 인터페이스(interface)만을 정의한 클래스를 의미합니다.
    • 구현을 갖지 않는 메서드(추상 메서드)를 포함할 수 있습니다.
    • 자식 클래스에서 구체적인 구현을 제공하기 위해 사용됩니다.
    • 구현되어 있지 않으며, 추상 클래스를 상속받은 자식 클래스에서 구체적인 구현을 제공해야 합니다.
    • 자식 클래스에서 구체적인 구현을 제공함으로써 코드의 재사용성유지보수성을 향상시킬 수 있습니다.

    Interface : 인터페이스

    • 컴퓨터 프로그래밍에서 인터페이스란 “서로 다른 두 시스템, 장치, 소프트웨어 따위를 서로 이어주는 부분 또는 그런 접속 장치”로 정의할 수 있는데,
    • 객체 지향적 설계에 있어서 인터페이스는 어떤 객체의 역할만을 정의하여 객체들 간의 관계를 보다 유연하게 연결하는 역할을 담당합니다.
    • 즉, 인터페이스에는 추상 메서드나 상수(Constant)를 통해서 어떤 객체가 수행해야 하는 핵심적인 역할만을 규정해두고, 실제적인 구현은 해당 인터페이스를 구현하는 각각의 객체들에서 하도록 프로그램을 설계하는 것을 의미합니다.

💡 Inheritance : 상속

  • 상속은 이미 정의된 클래스에서 속성과 메서드를 물려받아 새로운 클래스를 생성하는 것을 말합니다.

  • 상속을 통해 코드 재사용성을 높일 수 있으며, 계층적인 구조를 만들 수 있습니다.

    Multiple inheritance : 다중상속 📌내용 추가 필요📌

    Method Resolution Order, MRO : 메서드 탐색 순서

    많은 프로그래밍 언어들이 다이아몬드 상속에 대한 해결책을 제시하고 있는데 파이썬에서는 메서드 탐색 순서(Method Resolution Order, MRO)를 따릅니다.

    다음과 같이 클래스 D에 메서드 mro를 사용해보면 메서드 탐색 순서가 나옵니다(클래스.mro 형식도 같은 내용).

    # 클래스.mro()
    >>> D.mro()
    [<class '__main__.D'>, <class '__main__.B'>,   <class '__main__.C'>, <class '__main__.A'>, <class   'object'>]

    MRO에 따르면 D의 메서드 호출 순서는 자기 자신 D, 그 다음이 B입니다. 따라서 D로 인스턴스를 만들고 greeting을 호출하면 B의 greeting이 호출됩니다( D는 greeting 메서드가 없으므로).

    x = D()
    x.greeting()    # 안녕하세요. B입니다.

    파이썬은 다중 상속을 한다면 class D(B, C):의 클래스 목록 중 왼쪽에서 오른쪽 순서로 메서드를 찾습니다. 그러므로 같은 메서드가 있다면 B가 우선합니다. 만약 상속 관계가 복잡하게 얽혀 있다면 MRO를 살펴보는 것이 편리합니다.

    참고 | object 클래스
    파이썬에서 object는 모든 클래스의 조상입니다. 그래서 int의 MRO를 출력해보면 int 자기 자신과 object가 출력됩니다.

    >>> int.mro()
    [<class 'int'>, <class 'object'>]

    파이썬 3에서 모든 클래스는 object 클래스를 상속받으므로 기본적으로 object를 생략합니다. 다음과 같이 클래스를 정의한다면

    class X:
        pass

    괄호 안에 object를 넣은 것과 같습니다.

    class X(object):
        pass

    파이썬 2에서는 class X:가 old-style 클래스를 만들고, class X(object):가 new-style 클래스를 만들었습니다. 그래서 파이썬 2에서는 이 둘을 구분해서 사용해야 했지만, 파이썬 3에서는 old-style 클래스가 삭제되었고 class X:와 class X(object): 모두 new-style 클래스를 만듭니다. 따라서 파이썬 3에서는 괄호 안에 object를 넣어도 되고 넣지 않아도 됩니다.


💡 Polymorphism : 다형성

  • 여러(poly) 모습(morph)을 가지는 것.

  • 객체 지향에서는 여러 동작을 수행하는 단일 객체를 의미한다.
    일반적으로 부모 객체를 자식 객체가 상속하는 방식으로 다형성을 구현하는데, 동일한 이름의 부모 객체 메서드를 자식 객체 특성에 따라 같은 이름이지만 다른 동작 방식으로 구현할 수 있습니다.

  • 다형성은 그 관계를 보다 유연하고 확장이 용이한 설계가 가능하도록 핵심적인 역할을 하지만, 추상화가 있어야 각 객체들의 역할 정의가 가능하고, 인터페이스는 📌상위 클래스-하위 클래스를 전제 내용 추가 필요📌하기 때문에 상속에서 배웠던 개념들이 함께 필요합니다.

  • 즉, 다형성을 제대로 활용하기 위해서는 추상화와 상속에 대한 내용들이 함께 존재해야 합니다

    Method Overriding : 메서드 재정의 📌내용 추가 필요📌

    부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의, 자식 클래스에서 원하는 방식으로 동작하도록 합니다. 자식 클래스에서는 부모 클래스에서 정의된 메서드의 기능을 유지하면서도, 필요한 부분만 기능을 추가하거나 수정하여 원하는 특정 기능을 구현할 수 있습니다.
    즉, 특정 클래스의 객체가 갖고 있는 정보만 변경 시키거나, 다른 객체와 상호작용할 수 있도록 합니다.

    Method Overloading : 메서드 오버로드 📌내용 추가 필요📌

    두 개 이상의 메서드가 이름은 같지만 매개변수 수가 다르거나 매개변수 유형이 다르거나 둘 다 다른경우, 이러한 메서드를 오버로드된 메서드라고 하며 이를 메서드 오버로드 한다고 합니다.

    dependency : 의존성 📌내용 추가 필요📌


💡 Encapsulation : 캡슐화

  • OOP에서는 데이터와 데이터를 다루는 메서드들을 하나로 묶어 캡슐화 합니다.

  • 객체 내부에 있는 데이터나 메서드에 직접 접근하지 않고, 외부 인터페이스를 통해서 접근하도록 제한함으로써 보안성과 안정성을 높일 수 있습니다. 캡슐화된 객체는 메서드를 통해서만 데이터 조작이 가능합니다.

  • 또한 캡슐화를 통해 하나의 객체가 해당 객체의 속성과 기능에 대한 독점적인 책임을 담당하도록 자율성을 부여할 수 있습니다. 이를 통해 객체 간의 의존성이나 결합도를 낮게 유지할 수 있습니다.

    Getter & Setter method

    • 객체의 상태 중 하나를 반환하는 메서드를 의미합니다.

    • 일반적으로 외부에서 객체의 상태를 확인하기 위해 사용하며 객체 내부에서 상태값을 직접적으로 노출하지 않고, 인터페이스를 통해 접근토록 하여 캡슐화를 구현할 수 있습니다.

    • 외부에서 상태값을 확인할 수 있지만, 객체 내부의 상태값을 변경 할 수는 없습니다.

    • 객체 내부의 중요한 데이터는 외부에서 직접 접근하지 못하도록 제한하고 getter와 setter를 이용해 안전하게 접근하도록 하는 것이 좋습니다.

    • 하지만 객체 내부의 일부 데이터는 외부에서 직접적으로 접근이 필요하지 않을 수 있으며, 이러한 경우에는 getter와 setter를 만들 필요가 없습니다.

    • 예를 들어, 다른 클래스나 모듈에서 사용하지 않는 데이터인 경우에는 getter와 setter를 만들 필요가 없습니다. 또한, 객체의 속성 중 일부는 한 번 설정되면 바뀌지 않아야 하는 경우가 있을 수 있습니다. 이 경우에도 setter를 만들 필요가 없습니다.


참고자료

wikipedia : Area of a circle
wikipedia : Multiple inheritance
w3resource : Python: Calculate area of a circle
Kihyeon Kwon : OOP 객체 지향 특강 자료
codestates : 객체 지향 프로그래밍 특징
github.com/beo202202
dojang.io : 다중 상속 사용하기

추가내용 참고할 부분

https://www.geeksforgeeks.org/method-overriding-in-python/
https://www.geeksforgeeks.org/python-method-overloading/

profile
with gratitude, optimism is sustainable

0개의 댓글