내가 생각하는 객체 지향이란?(2024.04.11)

YJ·2024년 4월 11일
post-thumbnail

블로그 작성법
목표 > 공부한 내용 > 얻었고, 앞으로 이걸 해봐야지 적기

✋ 수업 목표

객체 지향 프로그래밍(OOP)의 4특징 5원칙에 대해 배우자

🤔 공부한 내용

10. 자바 심화

재사용을 위해 나온, 4 특징 5 원칙

4 특징

캡상추다?
이는 객체 지향 프로그래밍의 4 특징을 말한다.
아래에서 각 특징에 대해 알아보고, 내가 생각하는 객체 지향 프로그래밍은 무엇인지 서술해보고자 한다.

캡슐화란?
객체를 까보지 않아도 사용할 수 있다는 것.
객체라는 덩어리 안에 있는 내용을 알지 못한다 하더라도 사용을 할 수 있게 하는 것이다.
하지만, 다들 기본서를 보면 대부분 캡슐화 == private 이라고만 알고 있다. 나도 그랬던 것 같다. 그러나 본질을 생각해보자.
캡슐화는 객체 안에 있는 내용을 모르더라도 사용을 할 수 있게 하는 특징 으로 알고 내 코드에 적용해보자.
이러한 캡슐화를 사용하기 위해서 private, interface 등을 사용할 수 있을 것 같다.

상속이란?
쿠팡을 생각해보자.
예를 들어 노트북을 사려고 하면, 노트북 카테고리로 이동을 한 후에
구체적인 노트북들을 고를 수 있다. 갤럭시북, 맥북 등 ...
여기서 상속 개념을 떠올릴 수 있다.
상속이란 공통적인 기능이 있는 것에서 구체적인 객체를 만들어 낼 수 있는 개념이다.

추상화란?
본질을 뽑아낸다!
추상화를 생각할 때는 구체화 랑 같이 생각해보자.

다형성이란?
말 그대로 많을 다, 형태 형, 성질 성을 생각해보자.
다형성은 둘 중 하나를 생각해보면 된다.
1. 하나의 객체가 여러 타입에 담길 것인가?
2. 하나의 타입으로 여러 개의 객체를 담아서 사용할 수 있는 것인가?

개인적으로 하나의 타입에 여러 개의 객체를 가질 수 있는 말을 선호한다.

나랑 직접 대화하지 말고, 위에 있는 상위 클래스나 인터페이스랑 대화해.
이런 것을 다형성이라고 일단 생각하자.

인터페이스에 담는 순간, 자식 클래스에서 구현한 추가적인 기능들은 접어야 한다.
그러나, 인터페이스를 사용하는 용도는
뒤에 있는 애들은 나만 있으면 다 사용할 수 있어야하는 것이다.
만약에 자식 클래스에서 추가적인 기능들을 구현할 경우에는 인터페이스를 사용할 이유가 없다.

위 4가지 특징의 예시 코드를 작성해보았다.

public interface Car {
    void goForward(int velocity);
}
public class HyundaiCar implements Car{
    @Override
    public void goForward(int velocity) {
        System.out.print(String.format("%s의 속력으로 직진합니다", velocity));
        System.out.println("출발~~~~");
    }
}
public class BenzCar implements Car {
    @Override
    public void goForward(int velocity) {
        System.out.println("벤츠 달린다~~");
    }
}
class Driver {
//    HyundaiCar car;
//      BenzCar car;
    Car car;
    public void drive(int velocity) {
        car.goForward(velocity);
    }

    public void changeCar(Car car) {
        this.car = car;
    }
}

위 코드에서 4가지 특징을 살펴보자.

캡슐화
캡슐화는 Driver 클래스에서 drive 메서드에 잘 나타난 것 같다.
Driver 클래스는 Car 객체의 goForward 메서드의 세부 동작을 잘 알지 못한다 하더라도 goForward 메서드를 사용할 수 있다.

상속
상속은 Car 인터페이스를 구현한 HyundaiCar, BenzCar를 통해 알 수 있다. 인터페이스 Car에 대한 공통적인 기능들을 명시해놓고,
구현 클래스에서 공통적인 기능을 Override하여 사용하고 있다.

추상화
추상화는 Car 인터페이스를 통해 확인할 수 있다. HyundaiCar, BenzCar의 공통적인 기능들을 상위 인터페이스에 본질을 뽑아내어 선언해놓았다.

다형성
Driver 클래스 내에서 Car라는 인터페이스를 필드로 사용하는 부분에서 확인할 수 있다. HyundaiCar, BenzCar 타입을 필드로 사용하는 것이 아니라, Car라는 인터페이스를 필드로 사용함으로써, Car 인터페이스를 통해 추가적으로 구현한 클래스 들도, Driver 객체에서 사용할 수 있다.

내가 생각하는 객체 지향 프로그래밍이란
객체 지향 프로그래밍을 할 때, 4가지 특징이 다 중요하지만 개인적으로는 객체 = 사물로 생각하고 프로그래밍을 하기에,
추상화 를 가장 중요시 생각하는 것 같다.
클래스나 인터페이스를 구현할 때,
정말로 이것이 이 객체가 가지는 본질인가
얘는 태어날때 이것들을 가지고 있을까?
얘는 이걸로 다른 것들과 상호 작용을 할 수 있을까?
이런 것들을 생각하는 것 같다.
이러한 개념은 4 특징 중 추상화에 가장 가까운 개념인 것 같다.

추상화는 복잡한 실제 세계를 단순화하는 과정이라고 생각한다.
이것은 객체가 가지고 있는 속성과 행위를 중요도에 따라서 간추려 내는 것을 의미한다.
즉, 필요한 정보만을 추려내 객체의 복잡성을 줄이는 것이다.
위 생각들은 객체를 설계할 때 어떤 속성과 행위를 객체의 필드와 메서드로 포함시킬지를 결정하는 과정, 즉 추상화 과정이라고 생각한다.
따라서, 이 과정을 통해 객체의 본질적인 특성만을 추려내어 정의될 수 있을 것이다.

5 원칙

단일 책임 원칙이란?
하나의 클래스는 하나의 일만 해야 한다.
모든 클래스는 하나의 액터/역할에 대한 책임난 가지며,
클래스는 그 책임을 완전히 캡슐화 해야한다.

하나의 클래스를 변경하는 이유는 하나의 액터 때문이다.
클래스의 한 줄을 변경하는 것은 프로그램 전 범위라는 것을 생각하자.
왜냐하면, 클래스 한 줄을 고치면 모든 클래스 통틀어서 수정 범위에 들어가기 때문이다.

이게 무슨 말일까?
하나의 클래스 안에 존재하는 것은
같은 필드, 생성자, 메서드를 사용하는 것이다.

단일 책임 원칙 장점
변경이 필요할 때, 해당하는 하나의 클래스만 수정

  • 수정할 대상이 명확하다.
  • 변화/수정에 굉장히 빠르고 안전하게 대응할 수 있다.
    코드 변경 범위를 생각해봅시다.

단일 책임 원칙 단점

  • 코드 수정 범위가 줄어든다.

개방 폐쇄 원칙이란?
확장에 대해 열려있고, 수정에 대해서는 닫혀있어야 한다.
객체를 사용하는 코드의 수정에는 닫혀 있어야 한다는 것이다.

개방 폐쇄 원칙 장점

  • 재사용성
  • 유연성
  • 유지보수성

리스코프 치환 원칙이란?
인터페이스를 쓸거면, 팔다리를 접을 생각을 하는 것이 아니라 팔다리를 인터페이스에 맞게 작성해야하는 것 이다.
자식 클래스는 상위 타입을 대체할 수 있어야 한다.
단순히, 메소드 틀을 맞추는 것이 아니라 기능 도 맞춰야 한다.
예를 들어, Car라는 인터페이스의 goForward 라는 메서드를
하위 타입의 Hyundai에서 오버라이드 하는데,
메서드를 '후진해라' 이렇게 작성을 하면 안된다.

인터페이스 분리 원칙이란?
인터페이스는 각자 관심에 맞는 작은 인터페이스로 분리하자.
일단 쪼갤 수 있으면 쪼개고 나중에 합치자.

인터페이스 A,B 두 개다 implements 하더라도,
리스코프 치환 원칙 에 따라 A 인터페이스의 기능은 정확성에 맞게 담당하고, B 인터페이스의 기능도 정확성에 맞게 담당해야 한다.

의존 역전의 법칙이란?
추상화에 의존하자.
인터페이스/추상클래스/부모 클래스에 의존하라 vs 일반 클래스에 의존하자.

우리가 하고 싶었던 것

결국은 분리하고, 조립하고 하기 위해 위 내용들을 배운 것이다...

왜 재사용 재사용 하는 것일까?

재사용 은 여러 장점이 많다.
재사용 하면 빠르게 짤 수 있다.
당연하다.
예를 들어 자바에서 HashMap을 사용하려고 하는데,
이를 사용할 때마다 매번 직접 구현하려고 한다?
엄청 힘든 일일 것이다.

😉 앞으로 이걸 해봐야지

앞으로 Java로 개발을 진행하면서 4특징 5원칙을 지키고자 한다.
그리고 옆에 분과 말씀을 나눠보며 의존 역전 원칙가 적용된 JPA라는 것에 대해 배우게 되었다.

우리가 앞으로 Java라는 언어를 배우고,
Spring이라는 프레임워크로 서버를 구축해볼 것이다.

서버를 구축하면 역시 중요한 기능이 DB와의 연동이다.
전에 Express.js로 DB와 연결을 할 때는
두 가지의 ORM 을 사용해보았다.

MongoDBMongoose
MySQLmysql2

그런데, Spring Framework에서는
JPA라는 하나의 통합된 ORM 인터페이스 모음으로 대부분의 RDBMS를 관리 할 수 있다는 것이었다.

그 말인즉, MySQL, MariaDB, Postgresql 등 여러 RDBMS 들을
하나의 ORM으로 서버와 연동하여 쿼리를 보낼 수 있다는 것이다.

아직 JPA를 사용하지 못해봤기에 지금까지 생각나는 것들을 한 번 그려보았다.

지금까지는 이런 느낌으로 RDB를 관리한다는 의미인 것 같다.
여기서 의존 역전의 법칙 이 사용된다는 것이다.
우리는 MySQL, MariaDB, Postgresql의 세부적인 로직은 알 필요가 없이, JPA라는 인터페이스만을 사용할 줄 안다면 DB를 사용할 수 있다는 것이다.
하루빨리 JPA를 사용해보고자 하는 마음이 커지는 것 같다!

추천해주신 책
: 객체지향의 사실과 오해(역할, 책임, 협력 관점에서 본 객체 지향)

profile
dev

0개의 댓글