TIL- 프로젝트 구조

TIL19 키오스크 프로젝트

creator7087 2025. 3. 13. 21:42

📚 TIL: 객체지향 프로그래밍 (OOP)

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

객체지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그래밍 패러다임 중 하나로, 현실 세계의 개념을 프로그래밍에 적용하여 더 직관적이고 유지보수가 쉬운 소프트웨어를 개발하는 방법론입니다.

객체지향 프로그래밍에서는 프로그램을 여러 개의 독립적인 단위, 즉 객체(Object)로 구성합니다. 이 객체들은 특정한 속성(데이터)과 동작(메서드)을 가지며, 서로 상호작용을 통해 프로그램을 동작하게 합니다.

객체지향 프로그래밍의 핵심 목표는 코드의 재사용성, 확장성, 유지보수성을 높이는 것입니다. 마치 레고 블록을 조립하듯이 객체를 조합하여 프로그램을 만들 수 있으며, 이를 통해 복잡한 소프트웨어를 쉽게 개발하고 관리할 수 있습니다.


객체(Object)란?

객체는 현실 세계에서 특정한 역할을 하는 독립적인 개체를 의미합니다. 프로그래밍에서 객체는 다음 두 가지 요소로 구성됩니다:

  1. 속성(Attributes): 객체가 가지는 데이터(변수)
  2. 행동(Behavior): 객체가 수행할 수 있는 기능(메서드)

예를 들어, "자동차"라는 객체를 생각해봅시다.

  • 속성: 색상, 브랜드, 속도, 연료량 등
  • 행동: 가속하기, 브레이크 밟기, 방향 전환하기 등

이러한 개념을 프로그래밍에 적용하면, 객체를 설계하고 조합하여 프로그램을 만들 수 있습니다.


객체지향 프로그래밍의 4가지 특징

1. 추상화(Abstraction)

추상화는 불필요한 부분을 숨기고, 중요한 정보만 표현하는 개념입니다. 이를 통해 프로그램의 복잡성을 줄이고, 더 간결하고 효율적인 코드를 작성할 수 있습니다.

✔️ 예시:

  • 우리는 자동차를 운전할 때 엔진 내부 구조를 알 필요 없이 가속 페달을 밟으면 속도가 올라간다는 원리만 이해하면 됩니다.
  • 마찬가지로, 객체지향 프로그래밍에서도 사용자는 내부 구현을 몰라도 필요한 기능만 사용할 수 있도록 설계됩니다.

2. 다형성(Polymorphism)

다형성이란 같은 인터페이스(메서드, 함수)를 사용하지만, 상황에 따라 다르게 동작할 수 있는 것을 의미합니다. 즉, 하나의 기능이 여러 가지 형태로 동작할 수 있는 능력입니다.

✔️ 다형성의 주요 형태:

  • 오버로딩(Overloading): 같은 이름의 메서드를 매개변수(인자)의 타입이나 개수만 다르게 하여 여러 개 정의하는 것
  • 오버라이딩(Overriding): 부모 클래스의 메서드를 자식 클래스에서 재정의하여 다른 동작을 하도록 만드는 것

✔️ 예시:

class Animal {
    void makeSound() {
        System.out.println("동물이 소리를 냅니다.");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("멍멍!");
    }
}

이처럼 makeSound()라는 메서드는 Animal 클래스에서는 기본적인 동물 소리를 내지만, Dog 클래스에서는 "멍멍!" 소리를 내도록 다르게 동작할 수 있습니다.

3. 캡슐화(Encapsulation)

캡슐화는 객체 내부의 데이터를 외부에서 직접 접근하지 못하도록 보호하는 개념입니다.

✔️ 캡슐화를 적용하는 이유:

  • 데이터를 보호하여 무결성을 유지할 수 있음
  • 내부 구현을 숨기고 객체 간 결합도를 낮출 수 있음

✔️ 예시:

class Person {
    private String name; // private으로 데이터 보호

    public String getName() {  // getter 메서드 제공
        return name;
    }

    public void setName(String name) {  // setter 메서드 제공
        this.name = name;
    }
}

이렇게 private 키워드를 사용하면 name 변수에 직접 접근할 수 없고, getName() 및 setName() 메서드를 통해서만 값을 설정하거나 가져올 수 있습니다.

4. 상속(Inheritance)

상속이란 기존 클래스(부모 클래스)의 속성과 기능을 새로운 클래스(자식 클래스)가 물려받는 것을 의미합니다.

✔️ 장점:

  • 코드 재사용이 가능하여 중복을 줄일 수 있음
  • 유지보수가 용이해짐

✔️ 예시:

class Animal {
    void eat() {
        System.out.println("음식을 먹습니다.");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("멍멍!");
    }
}

위 코드에서 Dog 클래스는 Animal 클래스를 상속받았기 때문에, eat() 메서드를 따로 구현하지 않아도 사용할 수 있습니다.


SOLID 원칙 (객체지향 설계 5대 원칙)

SOLID 원칙은 객체지향 설계를 더 견고하고 유지보수하기 쉽게 만들기 위한 다섯 가지 원칙입니다.

  1. SRP (단일 책임 원칙) - 클래스는 단 하나의 책임만 가져야 한다.
  2. OCP (개방-폐쇄 원칙) - 확장에는 열려 있고, 수정에는 닫혀 있어야 한다. 즉, 기존 코드를 변경하지 않고 기능을 추가할 수 있어야 한다
  3. LSP (리스코프 치환 원칙) - 상위 타입의 객체를 하위 타입의 객체로 치환해도 동작해 전혀 문제가 없어야 한다. 예로 들면 자식 클래스는 부모 클래스를 대체할 수 있어야 한다.
  4. ISP (인터페이스 분리 원칙) - 클라이언트가 필요하지 않는 기능에 의존하지 않도록 인터페이스를 분리해야 한다.
  5. DIP (의존성 역전 원칙) - 변화가 적은 추상화된 요소에 의존해야 한다.

정리

객체는 데이터와 동작을 하나로 묶은 독립적인 단위이며, 이러한 객체를 조합하여 프로그램을 만드는 것이 객체지향 프로그래밍(OOP)이다.
✅ OOP의 4가지 주요 특징(추상화, 다형성, 캡슐화, 상속)을 활용하면 유지보수성과 재사용성이 높은 소프트웨어를 만들 수 있다.
SOLID 원칙을 따르면 유지보수가 쉬운 객체지향 설계를 할 수 있다.

 

_______________________________________________________________________________________________

🎯 객체 지향 설계의 중요성

이번 과제에서 객체 지향이 핵심 개념이라는 것은 알았지만, 각 클래스의 역할과 필요성을 명확히 설명하기 어려웠다. 이를 개선하기 위해 설계를 다시 고민했고, 역할을 분리하여 정리했다.

_______________________________________________________________________________________________

🏗️ 클래스 역할 및 필요성 정리

1️⃣ Menu 클래스의 역할과 필요성

책임 분리

  • 기존에는 Kiosk가 List<MenuItem>을 직접 관리했지만, 메뉴 관리는 Kiosk가 아닌 Menu가 담당하는 것이 적절하다. 왜냐하면 분류 전 Kiosk역할은  UI, 메뉴저장,카테고리 분류라는 점을 고려한다면 유지보수가 힘들다는 점을 예측할 수 있기 때문이다. 즉 하나의 클래스엔 하나의 역할만 부여하는 것이 적절하다.
  • Kiosk는 UI를 관리하고, Menu는 특정 메뉴 카테고리(Burgers, Drinks, Desserts)를 관리한다.

확장성 증가

  • MenuItem을 단순 리스트로 관리하면 메뉴가 추가될수록 복잡해진다.
  • Menu 클래스를 도입하면, 각 카테고리를 쉽게 분리하여 관리할 수 있다.

데이터 관리의 체계화

  • MenuItem이 개별 아이템이라면, Menu는 이를 그룹화하는 상위 개념이다.
  • Menu 객체가 자체적으로 List<MenuItem>을 관리하므로, 데이터가 더 명확하게 정리된다.

📝 정리

Menu 클래스는 MenuItem들을 그룹화하여 카테고리별 관리를 담당한다.
이렇게 하면 Kiosk는 전체 흐름을, Menu는 특정 카테고리의 메뉴를 관리하도록 역할이 명확히 분리된다.


2️⃣ Database 클래스를 추가하는 이유

현재 Kiosk가 여러 Menu 객체를 직접 관리하는 방식인데,
Database 클래스를 도입하면 모든 메뉴 데이터를 중앙에서 관리할 수 있다.

Database 클래스의 역할

클래스역할
Database 모든 메뉴 데이터를 저장하고 관리
Menu 특정 카테고리(Burgers, Drinks, Desserts)의 메뉴 관리
MenuItem 개별 메뉴 아이템 관리
Kiosk 사용자 입력을 받아 메뉴를 선택하고 흐름을 제어

Database 도입의 장점

  • 중앙 집중식 데이터 관리
    → 메뉴 데이터를 한 곳(Database)에서 관리하여 유지보수가 쉬워짐
  • 역할 분리
    → Kiosk는 메뉴 데이터를 직접 다루지 않고, Database에서 가져와 사용

_______________________________________________________________________________________________

ps 이 개념이 잡히지 않아서 이 프로젝트만 3~4개정도를 LV6까지를 만들어 지워서 정리한거다. 잊지말자

 

https://jja2han.tistory.com/330

 

객체 지향 프로그래밍(OOP)의 개념과 4가지 특징

우선 객체지향을 설명하기 전에 객체지향의 반대말인 절차적 프로그래밍에 대해서 설명하겠습니다. 그러는 편이 왜 객체지향을 사용하는지 이해하기 편할것입니다. 📕절차적 프로그래밍 📗

jja2han.tistory.com

https://velog.io/@jx7789/JAVA-%EA%B8%B0%EC%B4%88-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%9D%B4%EB%9E%80

 

[JAVA 기초] 객체지향이란?

객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나로, 복잡한 문제를 해결하기 위해 개발된 방법론이다. 객체 지향의 기본적인 사상은 실제 세계를 모델

velog.io

https://jongminfire.dev/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80