ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • OOP에 관해서
    TIL 2021. 1. 16. 14:05

    oop에 대해 공부하기 위해 자료를 찾던 중 재밌는 글을 봐서 공유한다.

    rinae.dev/posts/the-faster-you-unlearn-oop-the-better-for-you-and-your-software-kr

     

    [번역] OOP를 빨리 잊을 수록 여러분과 여러분의 소프트웨어에 좋습니다

    OOP를 향한 신랄한 비판(?) 번역 (not about functional programming) - 비판적으로 읽어주세요

    rinae.dev

    중간에 '나는 바나나를 원했는데 결과는 바나나를 들고 있는 고릴라와 정글을 얻었다.'라는 글이 있는데 이번에 코드를 작성하면서 본인이 느낀 점에 딱 맞았던 거 같다.

    설계자에게 중요한 것은 어디까지 세분화할 것인지 같다. 인간을 오장육부로 분리할 건지, 세포단위까지 분리할 것인지가 중요한 거 같다. 

    의존 관계도 위가 식도를 의존하고 장이 위를 의존할 때 의존 관계를 최대한 줄이면 확장과 교체가 쉬워진다.

     

    클래스, 오브젝트 인스턴스에 대한 정의

    객체지향을 이야기하면 빠질 수 없는 클래스 이야기 이다. 일단 클래스는 객체를 만들기 위한 하나의 방법일 뿐이다. 자바스크립트는 객체는 있지만 클래스가 없다는 것을 보면 쉽게 이해가 갈 거다.

     

    그럼 인스턴스는 무엇일까? 클래스를 통해 만들어낸 참조 변수라고 생각하자. 참조 변수를 통해 클래스의 상태, 행동을 사용할 수 있다.

     

    그럼 객체는? 이 부분은 굉장히 애매모호한 거 같다. 인스턴스와 같은 역할을 하는 거 같은데.. 인스턴스는 클래스를 통해 만든 거고 객체는 뭐랄까 인스턴스보다는 추상화된 개념? 이런 행동도 해야 하고, 이런 상태도 가지고 있어야 하고.. 를 하나의 물체로 정의한 개념 같다.

    인스턴스는 그 개념을 메모리에 올려서 실제로 사용할 수 있고,

    객체는 추상적으로 만든 개념이라 설계를 할 떄 사용한다. 

    그 설계를 구현하는 것은 클래스 이고..

     

    확실한 것은 객체지향적으로 설계할 때의 순서다.

    메시지를 생각하고 객체를 만들고 객체를 구현할 방법을 클래스로 정한 거

     

     

    상속과 다형성

     

     

     

     

    상속을 이야기하면 다형성을 빼놓을 수 없다.

    다형성이란? 같은 코드로 다른 결과를 얻을 수 있다고 정의한다.

    java에서는 여러 형태로 다형성을 찾아볼 수 있는데 

    • 메서드의 다형성 (오버 로딩, 오버 라이딩)
    • 상속의 다형성

    메서드의 다형성은 오버 로딩과 오버 라이딩으로 설명이 가능하고,

    상속의 다형성은 부모의 타입이나 다른 타입으로 대체 가능할 때 다형성을 구현했다고 말한다.

     

    this와 super는?

    this는 해당 클래스의 내부를 접근할 때 사용한다. 해당 클래스 본인?이라고 생각하자. 

    this는 도트(.)를 통해 본인 인스턴스 내부를 사용할 수 있다. 

    this는 2가지 사용법이 있다. 다른 사용법은 다른 생성자를 사용할 수 있다는 거다. 

    생성자는 오버 로딩이 가능한데 그때 this()를 통해 다른 생성자를 호출할 수 있다.

     

    그럼 super는?

    모든 객체는 생성되기 전에 부모를 생성해야 한다. super()라는 키워드를 통해 부모의 생성자를 호출한다. 

    숨겨져 있지만 명시할 수도 있다.

    super도 2가지로 사용이 가능한데 위와 같이 부모 생성자를 생성할 때와 super에 다가 도트(.)를 추가해서 

    부모의 내부에 접근이 가능하다. 오버 라이딩했지만 부모의 메서드를 사용하고 싶을 때 유용하다. 

    객체 인스턴스 비교 방법은?

    객체는 ==(참조값 비교) 비교 시에는 기본적으로 false가 나온다.

    하지만 우리는 객체 내부의 값을 비교해서 같은지 같지 않은지 비교하고 싶을 때가 많기 때문에

    그때는 class 내부에 equals와 hashcode를 오버 라이딩해서 재정의 해주면 된다.

    요즘 ide는 자동완성 기능이 있어서 제공해주는 것을 사용하면 된다. 내부를 보면 객체를 타고 들어가서 들어있는 값을 비교하는 형식이다. 

     

     

    우아한 객체지향

    www.youtube.com/watch?v=dJ5C4qRqAgA

    이번 미션을 하면서 가장 중점을 둔것은 다형성이 였다. 대체 가능해야 하고 쉽게 확장 할 수 있어야 된다고 생각했다.

    위의 영상에서 강조하는 것은 의존성 문제이다. 객체간의 의존성을 줄여야 확장과 변경에 용이하다라고 설명한다.

    내 생각에는 둘 다 추구하는 바가 같은거 같다. 의존성을 줄여야 다형성이 빛을 낼 수 있다고 생각한다. 

     

    위 영상에서는 객체간의 연결을 4개로 설명한다.

    연관 관계는 A클래스에 B를 인스턴스로 가지고 있는 경우 이다. 가장 강하게 결합되어 있는 관계

    A는 B를 탐색할 수 있는 관계

     

    의존 관계는 일시적인 관계일 때 , 파라미터,리턴타입,지역변수로 사용할 때

    상속과 실체화 관계는 뭐 보이는데로..

     

    의존관계를 설정할 때 생각 해야 할 것

    양방향 관계는 피하라

    연관관계 일때는 최대한 다중성이 적은 쪽이 인스턴스로 가지고 있게 하라

    필요하다면 연관관계를 제거

    패키지 사이에는 의존성 사이클 x

     

    양방향 관계를 끊기 위해서는 

    1. 중간객체를 만든다.

    2. 리포지토리를 이용한다 -> 인스턴스로 바로 참조하는 것이 아닌 id값을 가지고 있고 그 id값을 리포지토리에 넘겨 한 단계 분리한다.

    -> 리포지토리로 분리하면 참조할때 사용했던 메소드에서 문제가 발생한다 -> 객체 참조 로직을 객체로 분리한다.

     

    'TIL' 카테고리의 다른 글

    Solid 란  (0) 2021.01.17
    2021.01.17 기록장  (0) 2021.01.16
    2021.01.16 기록장  (0) 2021.01.15
    2021.01.15 기록장  (0) 2021.01.14
    2021.01.14 기록장  (0) 2021.01.13

    댓글

Designed by Tistory.