Study/기타

Clean Architecture 클린아키텍처, 객체와객체지향 프로그래밍[4부]

코딩 잘 할거얌:) 2024. 3. 20. 23:30
반응형

이번에는 객체와 객체지향 프로그래밍에 대해 알아보도록 하자.

원래 포스팅의 순서는 Folder구조를 잡고, 각 폴더안에 들어가는 파일 class들의 예시를 보여주려고 했다. 하지만 객체지향 디자인 5원칙을 설명하지 않고는 작성하기가 힘들고, 객체지향프로그래밍에 대해서 설명이 부족하면 객체지향 디자인 5원칙이 작성하기 힘들다. 우선 객체와 객체지향 프로그래밍에 대해서 알아보도록 하자.


객체, 객체지향 프로그래밍이란

 

객체(Object)라는 것은 클래스(Class)에서 정의한 것을 토대로 메모리에 할당된 것으로 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며, 변수 자료 구조, 함수 또는 메소드가 될 수 있다. 

좀더 쉽게 설명을 해보자.

객체지향 프로그레밍에서 객체(Object)는 데이터와 해당 데이터를 처리하는 메소드(Method)의 결합체이다. 객체라는것은 현실세계에서의 실체나 개념을 모델링하는 프로그래밍 구성요소로 작용한다고 볼 수 있다.

예를들어 자동차의 객체라는게 있다고 가정해보자. 자동차의 객체의 속성으로는 브랜드, 색상, 마력 등을 가지고있고, 메소드로는 가속, 감속, 정지 등이 있을 수 있다.

// 자동차 클래스 정의
class Car {
  // 속성(멤버 변수)
  String brand;
  String color;
  int speed;

  // 생성자
  Car(String brand, String color) {
    this.brand = brand;
    this.color = color;
    this.speed = 0; // 초기 속도는 0으로 설정
  }

  // 메서드
  void accelerate(int increment) {
    speed += increment;
    print('$brand 자동차가 $increment 만큼 가속하여 현재 속도는 $speed 입니다.');
  }

  void brake(int decrement) {
    speed -= decrement;
    print('$brand 자동차가 $decrement 만큼 감속하여 현재 속도는 $speed 입니다.');
  }
}

void main() {
  // Car 클래스의 인스턴스 생성
  Car myCar = Car('BMW', 'Blue');

  // 자동차 동작
  myCar.accelerate(50); // 가속
  myCar.brake(20);      // 감속
}

그렇다면, 우리가 종종 혼동하는 클래스(class), 객체(Object)그리고 인스턴스(Instance)차이점이 뭘까?

  1. 클래스(Class):
    • 클래스는 객체를 만들기 위한 설계도 또는 틀이다
    • 객체들이 가져야 할 속성(데이터)과 행동(메서드)을 정의한다.
    • 클래스는 추상적인 개념으로, 실제로 메모리에 할당되지 않는다.
    • 예를 들어, 자동차 클래스는 자동차의 속성(브랜드, 색상 등)과 메서드(가속, 감속 등)를 정의한다.
  2. 객체(Object):
    • 객체는 클래스의 인스턴스(instance)이다.
    • 클래스를 바탕으로 실제로 메모리에 할당된 것으로, 데이터와 메서드를 포함한다.
    • 객체는 클래스의 속성과 메서드에 대한 실제 값이나 동작을 갖는다.
    • 예를 들어, 자동차 클래스를 기반으로 생성된 특정 자동차 객체는 실제 자동차라고 할 수 있다.
  3. 인스턴스(Instance):
    • 인스턴스는 클래스를 기반으로 생성된 개별 객체를 가리킨다.
    • 클래스의 구조를 가지고 있지만 고유한 데이터를 가질 수 있다.
    • 한 클래스로부터 여러 개의 인스턴스를 생성할 수 있다.
    • 예를 들어, "bmw"와 "audi"는 자동차 클래스의 인스턴스. "bmw"와 "audi"는 모두 자동차 클래스의 특정 객체들이다.

간단히 말하면, 클래스는 객체를 만들기 위한 설계도이고, 객체는 실제로 클래스에 의해 만들어진 것이며, 인스턴스는 클래스로부터 생성된 개별 객체를 의미한다.

즉, 객체지향프로그래밍(Object-Oriented Programming, OOP)은 소프트웨어 개발에서 사용되는 중요한 프로그래밍 패러다임 중 하나로, 이 접근 방식은 현실 세계의 객체들을 소프트웨어적으로 모델링하고, 이러한 객체들 간의 상호 작용을 기반으로 프로그램을 구성한다.

객체지향 프로그래밍에서 사용되는 주요개념들을 알아보자.

1. 객체(Object): 현실 세계에서 식별 가능한 것. 예를 들어, 자동차, 사람, 주문 등이 객체가 될 수 있습니다. 각 객체는 특징과 동작을 가지고 있다.

2. 클래스(Class): 객체를 생성하기 위한 설계 도면이며, 객체의 특징과 동작을 정의한다. 클래스는 객체들이 공통으로 가지는 속성과 메서드를 정의한다.

3. 상속(Inheritance): 클래스들 간의 관계를 정의할 때 사용된다. 한 클래스가 다른 클래스의 특성과 동작을 상속받아 확장할 수 있다. 이를 통해 코드 재사용성과 계층적 구조를 구현할 수 있다.

4. 다형성(Polymorphism): 다형성은 같은 이름의 메서드나 함수가 서로 다른 동작을 할 수 있는 능력을 의미한다. 상속과 밀접하게 연관이 되어있고, 같은 인터페이스를 가진 다양한 구현을 한다. 

5. 캡슐화(Encapsulation): 객체의 상태와 동작을 외부로부터 감추는 것을 의미하며. 이는 정보 은닉의 개념과도 관련이 있으며, 객체의 내부 상태는 외부에서 직접 접근할 수 없도록 보호가 된다.

이 다섯가지를 dart언어로 구현해보았다.

// 다형성을 위한 추상 클래스 (Abstract Class)

abstract class Product {
  // 추상 메서드 (Abstract Method)
  void displayInfo(); // 제품 정보를 출력하는 메서드
}

// 부모 클래스 (Parent Class)
class Car implements Product {
  // 속성(멤버 변수)
  String brand; // 객체 속성: 자동차의 브랜드
  String color; // 객체 속성: 자동차의 색상
  late int speed; // 객체 속성: 자동차의 속도

  // 생성자
  Car(this.brand, this.color) {
    // 클래스의 생성자

    speed = 0; // 초기 속도는 0으로 설정
  }

  // 메서드
  void accelerate(int increment) {
    // 메서드: 자동차를 가속시키는 행동
    speed += increment;
    print('$brand 자동차가 $increment 만큼 가속하여 현재 속도는 $speed 입니다.');
  }

  void brake(int decrement) {
    // 메서드: 자동차를 감속시키는 행동
    speed -= decrement;
    if (speed < 0) {
      speed = 0; // 음수 속도를 허용하지 않음
    }
    print('$brand 자동차가 $decrement 만큼 감속하여 현재 속도는 $speed 입니다.');
  }

  // Product 클래스의 메서드 구현
  @override
  void displayInfo() {
    print('제품 정보: $brand 자동차, 색상: $color');
  }
}

// 상속을 받기 위한 자식 클래스 (Child Class)
class ElectricCar extends Car {
  // 생성자
  ElectricCar(super.brand, super.color); // 생성자: 부모 클래스의 생성자를 호출하여 상속받은 속성 초기화

  // 추가적인 동작
  void charge() {
    // 메서드: 전기차를 충전하는 행동
    print('$brand 전기차가 충전 중입니다.');
  }
}

void main() {
  // Car 클래스의 인스턴스 생성
  Car myCar = Car('BMW', 'Blue');

  myCar.accelerate(50); // 가속
  myCar.brake(20); // 감속

  // Product 클래스의 메서드 호출
  myCar.displayInfo(); // 제품 정보 출력

  // ElectricCar 클래스의 인스턴스 생성
  ElectricCar myElectricCar = ElectricCar('Tesla', 'Red');

  // 부모 클래스의 메서드 호출
  myElectricCar.accelerate(50); // 가속
  myElectricCar.brake(20); // 감속

  // Product 클래스의 메서드 호출
  myElectricCar.displayInfo(); // 제품 정보 출력

  // 자식 클래스의 메서드 호출
  myElectricCar.charge(); // 객체의 메서드 호출
}

객체지향 프로그래밍을 최대한 dart언어로 구현해보았다. 너무 어려운건 없다. 익숙해지면 쉬운내용이므로 개발하면서 최대한 적용해보면서 코딩하도록 하자!

728x90