WIL-1_Java(3)

신경연·2023년 1월 31일
0

WIL

목록 보기
4/6

일단 글에 앞서 워낙 개념적인 내용이기에,
제대로 이해한 것이 맞는지 불명확하지만 최대한 이해한 바를 바탕으로 작성하였습니다.

객체 지향

객체 지향은 '우리가 주변 사물들을 인지하는 것 처럼 프로그래밍을 할 수 있지 않을까?' 라는 생각에서 시작한, 기존의 절차적 프로그래밍의 틀에서 벗어난 프로그래밍 방법론입니다.
프로그램의 일부에 해당하는 객체를 먼저 만들고 이 객체를 중심으로 만들어진 여러 객체간의 결합과 연결을 통해 하나의 완성된 프로그램을 만드는 프로그래밍 방법론을 뜻합니다.

4대 특성

  • 캡슐화 : 정보의 은닉, 보호
  • 추상화 : 모델링
  • 상속 : 재사용, 일관성
  • 다형성 : 사용의 편의

1) 캡슐화

  • 접근제어자 + getter/setter 메서드

항상 의문이었다. 속성값을 private으로 보호한들, getter/setter를 통해 자유롭게 꺼내고 수정이 가능한데 이러한 구조가 왜 필요한지.
-> 속성값의 직접적인 접근을 막고, getter/setter 메서드에서 접근과 수정에 대한 조건과 로직을 구현한다면 이것이 보호로 이루어지는 것이었다.

  • 은닉적 측면

    이것은 예시를 가져와야 설명이 가능할 것 같다.
  class Driver {
      Private Car car;

      public void drive() {
          car.startEngine();
          car.moveForward();
          car.openWindow();
      }
   }


    class Driver {
      Private Car car;

      public void drive(){
          car.operate();
      }
    }

위쪽 예시를 보면 Driver라는 클래스에서 Car의 행동에 관한 메서드를 사용하고 있다.
이는 Driver 클래스가 Car 클래스 의 세부적인 내부 로직을 속속히 너무 잘 알고 있는데, 이를 아래처럼 간단하게 Car 클래스를 호출하는 문장으로 바꾸고 수행 메서드들을 Car 클래스로 옮김으로써 로직을 은닉할 수 있다.

이러한 과정을 통해 얻는 효과는 아래와 같습니다.
1. 위에 쓴대로 로직의 은닉
2. Car 메서드의 수정에 Driver까지 수정해야 하는 상황이 오는 것을 막을 수 있다. 이를 객체간 결합도를 낮춘다고 표현한다고 합니다.
각 객체에 대한 책임은 해당 객체만 가지게 하는 것이 좋다고 합니다.

2) 추상화

저는 사전적 의미로 풀어나가는 방법이 이해가 수월했습니다.
“사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는 것”
즉 객체지향에서의 추상화는 불필요한 세부 사항들은 제거하고 가장 본질적이고 공통적인 부분만을 추출하여 표현하는 것입니다.

여기서부터는 저의 견해인데,
가장 공통적이고 근원적인만큼 많은 객체들을 포괄하여, 객체지향의 다형성 이라는 특성과 연결되어 유연함으로 이어지는 프로그램 설계법이라고 이해했습니다.

3) 상속

상속이란 앞서 봤었던 추상화의 연장선에서, 클래스 간 공유될 수 있는 속성과 기능들을 상위 클래스로 추상화 시켜 하위 클래스들이 모두 상위 클래스의 속성과 기능들을 간편하게 사용할 수 있도록 합니다.

  • 이를 통해 클래스들 간 공유하는 속성과 기능들을 간편하게 재사용할 수 있어 반복적인 코드를 최소화할 수 있습니다.
  • 데이터와 메서드를 변경할 때 상위에 있는 것만 수정하여 전체적으로 일관성을 유지시킬 수 있습니다.

4) 다형성

다형성은 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 의미합니다.

상속의 상황을 가정하여 생각해 보면, 다형성의 대표적인 예인 메서드 오버로딩과 오버라이딩을 생각할 수 있습니다. 그런데 이러한 다형성이 없었다면, 그만큼 객체간의 융통성이 부족해져 상속은 오히려 족쇄로 작용하고, 부모클래스에 담을 수 있는 공통 속성과 기능도 줄어들어 코드가 길어지게 될 것입니다.

위에서는 작게 상황을 예시로 들었지만, 사실 중요한 것은 이것이라고 합니다.

객체 지향 프로그래밍에서 다형성이란 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것을 의미합니다. 좀 더 구체적으로, 상위 클래스 타입의 참조변수로 하위 클래스의 객체를 참조할 수 있도록 하는 것입니다.

위의 효과는 아래 코드로 설명하는 게 편할 것 같습니다.

  class Driver {

      void drive(Car car){
          car.operation();
      }

      void drive(Bike bike){
          bike.operation();
      }

      void drive(Bus bus){
          bus.operation();
      }

  //    이하 생략
  }
  

  class Driver {

      void drive(Vehicle vehicle){
          vehicle.operation();
      }
  }

아래쪽 코드처럼 상위 클래스로 참조변수를 받을 수 있게 됨으로써 코드도 간결해지고 사용이 간편해졌으며, 전에 이야기 했던 것처럼 Driver 클래스와 각종 운송기구들과의 결합도가 감소한 모습을 볼 수 있습니다.

이처럼 다형성은 느슨한 관계 설정을 가능하게 하여, 보다 유연하고 변경이 용이한 프로그램 설계로 이어지게 되는데 아주 중요한 특징입니다.

profile
반갑습니다

0개의 댓글