Post

01 프로그래밍

01 프로그래밍

1. 절차지향 (Procedural Programming)

1. 정의

  • 프로그램을 순차적인 절차(Procedure)함수(Function)의 흐름으로 구성하는 전통적인 프로그래밍 패러다임
  • 데이터를 중심으로 여러 절차(로직)가 그 데이터를 처리하는 구조로 되어 있음

2. 핵심 개념

항목절차지향 프로그래밍 설명
중심 단위
(Unit of Composition)
함수(Function)
프로그램은 기능 단위(절차)로 구성됨
데이터 관리 방식
(Data Handling)
전역 변수(Global Variable)와 지역 변수(Local Variable) 중심
데이터는 함수와 분리되어 존재함
행동 정의 방식
(Behavior Definition)
함수 호출(Call by Value/Reference)을 통해 명령 실행
상태(state)는 함수 호출 시 인자로 전달
구성 원리
(Design Principle)
Top-Down 설계
상위 기능부터 정의한 후 세부 구현으로 분해 (Divide and Conquer)
설계 원칙
(Design Philosophy)
명령 기반(Command-based), 상태 변화 중심(State Mutation), 순차적 처리(Sequential Logic)
관계 구성
(Component Relationship)
함수들이 전역 상태를 공유하며 명시적 호출(Explicit Call)로 흐름을 제어
함수 간 결합(Coupling) 가능성 높음

2. 객체지향 (Procedural Programming)

1. 정의

  • 프로그램을 객체(Object) 단위로 구성하고, 객체가 데이터(State)동작(Method)를 함께 포함하며, 객체 간 메시지 전달(Message Passing)을 통해 협력하여 문제를 해결하는 프로그래밍 패러다임
  • 현실 세계의 개념을 추상화(Abstraction) 하여 소프트웨어 구조에 적용함.

2. 핵심 개념

항목객체지향 프로그래밍 설명
중심 단위
(Unit of Composition)
객체(Object)
상태(State)와 행위(Behavior)를 함께 가지는 단위로 구성됨
데이터 관리 방식
(Data Handling)
객체 내부의 필드(Field)로 상태를 보존
접근제어자(Access Modifier)로 외부 접근을 제어 (ex. private, protected)
행동 정의 방식
(Behavior Definition)
객체 내부의 메서드(Method)를 통해 행위 정의
메시지(Message) 전달을 통해 객체 간 협력
구성 원리
(Design Principle)
역할 기반 설계(Role-based Design)
객체는 책임(Responsibility)을 가지며 상호 협력으로 문제 해결
설계 원칙
(Design Philosophy)
캡슐화(Encapsulation), 추상화(Abstraction), 상속(Inheritance), 다형성(Polymorphism)
→ SRP, OCP 등 SOLID 원칙과 밀접
관계 구성
(Component Relationship)
객체 간 메시지 전달(Message Passing)을 통한 느슨한 결합(Loose Coupling)
인터페이스(Interface)를 통한 의존성 역전 및 추상화 수준 유지

3. 객체지향의 특징

1. 객체지향 프로그래밍의 특징

개념설명CS 용어 설명
추상화(Abstraction)복잡한 현실을 단순한 모델로 표현필요한 정보만 노출하고, 나머지는 숨김
캡슐화(Encapsulation)데이터와 메서드를 하나로 묶고 보호객체 내부 상태 보호, 인터페이스를 통한 접근 제한
상속(Inheritance)기존 클래스를 확장해 재사용코드 중복 감소, ‘IS-A’ 관계 표현
다형성(Polymorphism)같은 메시지에 다른 동작 수행인터페이스/메서드 오버라이딩으로 유연성 제공

2. 캡슐화 (Encapsulation)

1. 특징

  • 데이터 보호 및 객체의 일관성 유지를 위함.
  • 객체의 데이터(속성)와 기능(메서드)을 하나로 묶고, 내부 상태는 숨기며 외부에는 필요한 기능만 노출함.
  • Java에서는 private 필드 + public getter/setter 메서드
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    public class ScoreBoard {
      private int score; // private로 외부에서는 접근불가
    
      public int getScore() {
          return score; // 스코어보드(객체)의 점수를 확인하기 위한 방법
      }
    
      public void addScore(int points) {
          if (points > 0) {
              score += points; //스코어보드(객체)의 점수를 추가하는 방법
          }
      }
    }
    

2. Check 🔍

  • 절차지향 프로그래밍에서는 전역 변수 또는 공용 데이터를 여러 함수가 공유하게 되며, 이로 인해 한 함수가 데이터를 의도치 않게 변경하거나 초기화할 경우, 전체 시스템의 동작에 예상치 못한 상황이 발생할 수 있음.
  • OOP는 필드와 해당 데이터를 조작하는 메서드 하나의 객체 단위로 캡슐화(Encapsulation)하고, 외부에서는 내부 상태에 직접 접근하지 못하도록 접근제어자를 사용하여 객체가 자율성과 독립성을 가지도록함.

3. 상속 (Inheritance)

1. 특징

  • 코드 재사용과 계층적 관계 표현
  • 기존 클래스(부모)의 속성과 기능을 물려받아 새로운 클래스를 만듬.
  • Java에서는 extends 키워드 사용
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    class Animal {
      void eat() { System.out.println("먹는다"); } 
    }
     
    class Dog extends Animal {
      void bark() { System.out.println("멍멍"); }   
    }
    
    // 사용
    Dog dog = new Dog();
    dog.eat();   // → "먹는다" ← 상속된 부모의 기능
    dog.bark();  // → "멍멍"
    

2. check 🔍

  • 절차지향에서는 함수가 사용하는 변수들이 전역 또는 외부 상태에 의존하고, 함수의 실행이 전체 로직의 특정 위치에 고정되어 있어, 해당 함수를 다른 상황에서 독립적으로 재사용하기 힘듬.
  • 객체지향은 상속을 통해 공통 기능을 일반화하고, 각 객체가 자신의 문맥에 맞게 해당 기능을 확장하거나 재정의함으로써, 유지보수성과 재사용성을 높임.

4. 추상화 (Abstraction)

1. 특징

  • 복잡한 내부는 숨기고, 외부에는 필요한 인터페이스(사용 방법)만 보여주는 것
  • ‘복잡한 것은 감추고 간단하게 다루자’는 원리
  • Java에서는 abstract class, interface ``` // 동물 인터페이스 public interface Animal { public void sound(); }

public class Dog implements Animal{ @Override public void sound() { System.out.println(“강아지는 멍멍”); } }

1
2
3
4
5
6
7
8
9
### 2. check 🔍
- 절차지향 프로그래밍에서는 함수의 역할과 사용 목적을 이해하려면 전체 프로그램의 흐름과 맥락(전후 호출 관계, 데이터 흐름)을 파악해야함. 이는 코드가 커질수록 복잡도가 증가하고 유지보수가 어려워지는 원인
- 객체지향 프로그래밍에서는 인터페이스나 추상 클래스를 통해 각 객체의 역할과 계약을 명확하게 정의하고, 외부에 불필요한 구현 세부사항을 은닉(정보 은닉)함으로써 시스템의 구조를 단순하게 이해하고 유연하게 확장할 수 있도록 함.

## 5. 다형성 (Polymorphism)
### 1. 특징
- 인터페이스를 통일하여 공통으로 필요한 기능을 정의하고 유연한 설계함.
- 하나의 메서드나 객체가 여러 형태로 동작함.
- 자바에서는 `extends` + `Override`, `interface` 등으로 구현

class Animal { void speak() { System.out.println(“동물 소리”); } }

class Cat extends Animal { @Override void speak() { System.out.println(“야옹”); } }

// 사용 Animal animal = new Cat(); animal.speak(); // → “야옹” ← 다형성 ```

2. Check 🔍

  • 절차지향 프로그래밍에서는 타입 개념이 부족하거나 명확하지 않아, 기능 분기나 조건에 따른 동작 변경을 위해 if/else, switch 같은 제어문을 많이 사용함. 이로 인해 기능이 추가되거나 변경될 때마다 코드 전반에 영향을 미쳐 유지보수가 어려워짐.
  • 객체지향 프로그래밍은 인터페이스와 클래스라는 ‘타입’ 개념을 도입하여, 클라이언트는 구체적인 구현체가 아닌 타입(인터페이스)에 의존함. 따라서 내부 구현을 바꾸거나 새로운 기능을 추가할 때도 기존 코드를 수정하지 않고, 새로운 구현체를 만들어 쉽게 확장할 수 있도록 설계 가능함.

4. 절차지향 VS 객체지향 🔍

  • 절차지향은 소프트웨어 개발 초기 패러다임으로, 특정한 문제를 정해진 순서대로 빠르고 정확하게 처리하는 데 최적화되어 있음. 이는 하드웨어 성능이 제한적이고, 상대적으로 단순한 문제를 해결하는 데 적합함.

  • 객체지향은 하드웨어 성능 향상과 시스템 복잡도 증가에 대응하여 등장함. 복잡하고 다양한 요구사항을 가진 대규모 시스템을 ‘객체’라는 단위로 분리하여 관리하고 유지보수, 확장성을 높이는 데 목적을 둔 패러다임, 이를 통해 객체를 수정함으로써 빠른 수정과 개발을 가능하게함.

This post is licensed under CC BY 4.0 by the author.