TIL: OOP관련 블로그 글을 읽고 정리하기

Jungwon Lee(Jenny)·2021년 8월 30일
0
post-thumbnail

https://evan-moon.github.io/2019/08/24/what-is-object-oriented-programming/

해당 글을 읽고 정리한다

객체 지향 프로그래밍을 왜 알아야 할까?

최근 OOP의 단점을 얘기하며 함수형 프로그래밍이 대두되는 상황이다. 하지만 결국 OOP나 함수형 프로그래밍이나 둘 다 프로그램을 어떻게 설계할 것인가? 에 대한 방법이기에, 내가 둘 중 왜 해당 기술을 선택하여 사용하고 있는지, 어떤 것을 왜 더 선호 하는지를 알아야 한다. 그러기 위해선 둘 다 어떤 개념을 가지고 있는지 알아야 한다.

OOP란 무엇인가?

현실 세계를 프로그램의 설계에 반영하는 것

클래스란?

  • 일종의 설계도이고 이것을 사용하여 우리가 사용할 실제 물건으로 만드는 행위가 필요하다.
  • 객체는 클래스를 사용하여 생성한 실제 물건이다.

추상화란?

  • 그 존재가 가지는 가장 특징적인 속성들을 파악해나가는 것
  • 상위 개념 아이폰: 애플에서 만든 iOS 기반의 스마트폰
  • 아이폰 클래스 기반의 하위 개념
    • 아이폰X: 애플에서 만든 iOS 기반의 스마트폰이며, 홈 버튼이 없고 베젤리스 디자인이 적용된 아이폰
    • 아이폰7: 애플에서 만든 iOS 기반의 스마트폰이며, 햅틱 엔진이 내장된 홈 버튼을 가지고 있는 아이폰.
    • 아이폰 SE: 애플에서 만든 iOS 기반의 스마트폰이며, 사이즈가 작아서 한 손에 잡을 수 있는 아이폰.
    • 즉 다 manufacturer은 애플이고, os는 ios라는 추상적인 속성을 가지고 있다.

상속

class IPhone {
    String manufacturer = "apple";
    String os = "iOS";
}
  
class IPhone7 extends IPhone {
    int version = 7;
}
  
class Main {
    public static void main (String[] args) {
        IPhone7 myIPhone7 = new IPhone7();

        System.out.println(myIPhone7.manufacturer);
        System.out.println(myIPhone7.os);
        System.out.println(myIPhone7.version);
    }
}
  • 부모 입장에서 보면 extends는 자신의 속성들이 하위 개념으로 넘어가면서 확장되는 것이고

  • 자식 입장에서는 상위 개념의 속성을 물려받는 것이다

  • 위와 같이 추상화가 잘 된 클래스를 하나만 만들어 놓는다면 그와 비슷한 속성이 필요한 다른 클래스를 생성할 때 그대로 재사용할 수 있다

  • super메소드를 통한 오버라이딩

class SmartPhone {
    SmartPhone (String manufacturer, String os) {
        this.manufacturer = manufacturer;
        this.os = os;
    }
}

class IPhone extends SmartPhone {
    IPhone () {
        super("apple", "iOS");
    }
}
class Galaxy extends SmartPhone {
    Galaxy () {
        super("samsung", "android");
    }
}

overriding: 부모클래스의 속성을 덮어쓰게 하는 것.

super 메소드: 부모 클래스의 생성자를 호출하는 메소드

지금까지만 봐도 클래스의 재사용성을 엄청 높여주는 특징들인데, 개발자가 확실한 의도를 가지고 적당한 선에서 상속관계를 설계하는 것이 중요하다. 왜냐하면 너무 상속 관계가 복잡해지면 전체 구조를 파악하기 힘들어진다.

캡슐화

  • 정보 은닉: 클래스 내부의 데이터를 감추는 것
    • public, private, protected
    • 변수나 메소드가 클래스 외부로 노출되는 것을 방어햐여 보안도 챙길 수 있다
    • 내부 로직에 대해 밖에서 알지 못하도록 분리/감추는 기법
  • private: 클래스 내부에서만 사용 가능. 밖에서는 아예 직접 접근 불가
  • protected: 같은 패키지 내에서 접근하면 가능
  • public: 그냥 다 접근 가능

다형성 (난 왜 얘가 제일 헷갈릴까)

  • 하나의 변수명, 함수명이 상황에 따라 다르게 해석될 수 있는 것
  • 추상클래스: 어떤 클래스의 기능을 그대로 사용하면서 그 기능을 확장하고 싶을 때 사용하는 것
  • 인터페이스: 아무런 구현체가 없는 그냥 껍데기만 구현하는 것
abstract class Hero {
    public String name;
    Hero (String name) {
        this.name = name;
    }

    // 내부 구현체가 없는 추상 메소드를 선언한다.
    public abstract void ultimate ();
}

class Reinhardt extends Hero {
    Reinhardt () {
        super("reinhardt");
    }

    public void ultimate () {
        System.out.println("망치 나가신다!");
    }
}

class McCree extends Hero {
    McCree () {
        super("mccree");
    }
    public void ultimate () {
        System.out.println("석양이 진다. 빵야빵야");
    }
}

class Mei extends Hero {
    Mei () {
        super("mei");
    }
    public void ultimate () {
        System.out.println("꼼짝 마! 움직이지 마세요!");
    }
}

이렇게 추상 클래스인 Hero를 상속받은 영웅 클래스들은 무조건 ultimate 메소드를 구현해야한다.

여전히 추상클래스에 대한 이해가 조금 부족해서 다른 블로그 글도 참고해봤다

예를 들어 '키보드'라는 클래스가 있다. '키보드'를 만드는 제조사는 여러개이다. A제조사, B제조사, C제조사는 각 제조사만의 스타일대로 키보드를 제작하고 소비자들에게 제품을 출시한다. 여기서 A제조사는 키보드를 누를때 마다 불빛이 들어온다. B제조사는 키보드를 누를때 딸깍 거리는 소리가 난다. C제조사는 키보드를 누를때 살짝만 눌러도 잘 눌린다. 여기서 이 키보드들 간에 공통점이 있을까? 있다. 바로 키보드를 누른다! 라는 액션! 즉 메서드가 공통적이다. 그럼 이 메서드를 추출해서 추상클래스 안에 두면 된다.

(키보드를 상속받아 탄생한,  A키보드, B키보드, C키보드)

출처: https://limkydev.tistory.com/188

감은 잡힌것같다. 근데 인터페이스는 모르겠다.

또 같은 분의 블로그 글을 살펴봤다.

인터페이스란, 극단적으로 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 것이 바로 인터페이스의 역할이자 개념이다. 조금 더 유식하게 말하면, 자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해 인터페이스를 사용한다

예시를 읽으니 감이 온다.

교수님이 학생들에게 논문을 쓰라고 했다.

A학생은 PPT로 논문을 11일날 제출했다.

B학생은 EXCEL 2016 로 논문을 12일날 제출했다.

C학생은 EXCEL 2019 로 자기만의 색깔을 입혀 표 형식으로 12일날 제출했다.

D학생은 메모장에 '논문'을 쓰고 교수님이 말해준 당일 바로 제출했다.

응?? 논문을 쓰라고 지시했지만, 결과물이 너무 개성이 넘친다....이건 평가할 수 없을 것 같다. 왜 이런일이 일어날까?

가이드 라인 또는 어떠한 규격이 없기 때문에 발생하는 문제이다.

따라서 교수는 다시 명확한 가이드라인 있는 논문을 쓰라고 지시해야한다. 아래처럼...

학생들에게 2019.12.12일 18:00까지 홈페이지 본인 교수 홈페이지 제출란을 통해 논문을 제출해야하고

논문 파일 형식은 .PPT이며 10Page 안에 작성을 해야하고 논문 주제는 '블록체인을 활용한 공인인증서' 이다.

출처: https://limkydev.tistory.com/197

인터페이스: 추상화를 구현하는 하나의 도구.

예를들면 http client는 내부적으로 요청이 어떻게 이루어지고 처리되든 알 필요없이

get post delete put메소드에 대한 요청을 보내고 응답을 Promise로 담을꺼야! 가 http client의 추상이다.

get은 어떻고 post는 어떻고에 대한 내부 로직을 신경쓸 필요 없이 아래와 같이 인터페이스가 짜여있는 것

interface HTTPClient {
  get();
  put();
  post();
  delete();
}

오버로딩

  • 다형성을 구현하는 한 방법
  • 같은 이름의 메소드를 상황에 따라 다르게 사용할 수 있게 해주는 기능
class Overloading {
    public int sum (int a, int b) {
        return a + b;
    }
    public int sum (int a, int b, int c) {
        return a + b + c;
    }
    public String sum (String a, String b) {
        return a + b + "입니다.";
    }
}
class Main {
    public static void main (String[] args) {
        Overloading o = new Overloading();
        System.out.println(o.sum(1, 2));
        System.out.println(o.sum(1, 2, 3));
        System.out.println(o.sum("자", "바"));
    }
}

위의 코드를 아래코드에서 사용한 예시인데

보면, 넘겨주는 값의 형태나(number인지 string인지) 개수(1,2인지 1,2,3인지)에 따라 다른 메소드를 알아서 호출하고, 또 알아서 그 결과값을 내뱉어준다

느낀점

프로젝트를 하면서 Vanilla JS로 구현을 할 때 빼곤 사실 OOP를 제대로 사용해본 적이 없다. 그때마저도 대충 class가 있고 그 안에 그 class가 가질 메소드들을 나열하는 정도로 작성했었는데, JAVA로 구현된 코드들을 보며, 또 해당 글을 읽으며 내가 정말 일부분만 알고 있었구나를 느꼈다.

profile
FE개발자가 되고싶은 말하는 감자

0개의 댓글