728x90

1.1 오라클을 배우기 전에

오라클 데이터베이스는 기업에서 가장 널리 사용되는 RDBMS 중 하나로, 안정성과 성능, 확장성을 기반으로 다양한 산업군에서 활용되고 있다. 오라클을 제대로 배우기 위해서는 단순히 SQL을 실행하는 수준을 넘어, 내부 구조와 아키텍처를 이해하는 것이 중요하다. 이 장에서는 오라클의 핵심 구성 요소들과 이들이 어떤 원리로 작동하는지에 대해 직관적으로 설명한다.


1.2 오라클 아키텍처 개요

오라클 데이터베이스는 크게 두 가지 구성 요소로 이루어진다:

  • 오라클 인스턴스: 메모리 구조(SGA 등)와 백그라운드 프로세스
  • 오라클 데이터베이스: 실제 데이터가 저장되는 파일들의 집합

🔹 인스턴스 = SGA + 백그라운드 프로세스


1.3 SGA(System Global Area)

SGA는 오라클 인스턴스가 작동하기 위해 사용하는 공유 메모리 공간으로, 여러 세션이 동시에 접근하며 SQL 실행, 데이터 캐시, 트랜잭션 처리를 돕는다.

주요 구성 요소:

  • Database Buffer Cache: 디스크에서 읽어온 데이터 블록을 임시로 저장. 반복 조회 시 성능 향상.
  • Redo Log Buffer: 트랜잭션의 변경 내역을 일시 저장. 복구에 사용됨.
  • Shared Pool: SQL 실행 계획, PL/SQL 코드 등을 캐싱하여 파싱 부담 줄임.
  • Large/Java Pool: 병렬 처리, Java 실행을 위한 메모리.

💡 Dirty Buffer란? Buffer Cache 내에서 변경되었지만 아직 디스크에 반영되지 않은 블록을 의미. DBWR 프로세스가 디스크로 플러시할 때까지 메모리에 존재.


1.4 Lock 메커니즘

여러 사용자가 동시에 같은 데이터를 사용할 수 있기 때문에, 오라클은 Lock을 통해 데이터 일관성과 무결성을 보장한다.

주요 Lock 종류:

  • TX Lock: 행 단위 락. DML 트랜잭션 시 발생.
  • TM Lock: 테이블 락. DDL 또는 제약 조건 관련.
  • UL Lock: 사용자 정의 락 (DBMS_LOCK 사용).

💥 Deadlock: 서로 상대방의 락을 기다리는 교착 상태. 오라클은 이를 감지하고 하나의 세션을 종료함으로써 해결한다.


1.5 RAC(Real Application Clusters)

RAC는 여러 대의 서버가 하나의 데이터베이스를 동시에 접근할 수 있도록 구성된 클러스터 구조이다. 고가용성과 확장성이 필요한 엔터프라이즈 환경에서 자주 사용된다.

RAC의 장점:

  • 고가용성: 한 노드 장애 시 다른 노드로 자동 전환 가능
  • 수평 확장성: 서버를 추가하여 성능 향상 가능
  • 로드 밸런싱: 요청을 여러 인스턴스로 분산 처리

핵심 기술 - Cache Fusion:

  • 각 노드의 SGA를 네트워크로 연결해 메모리 블록을 공유. 데이터 일관성을 유지하면서도 빠른 처리 가능.

1.6 커넥션 풀의 필요성

애플리케이션이 DB와 통신할 때, 매번 새로 커넥션을 만드는 것은 성능적으로 비효율적이다. 커넥션 풀은 일정 수의 DB 커넥션을 미리 만들어 두고 재사용함으로써 다음과 같은 장점을 제공한다:

  • 커넥션 생성/소멸 오버헤드 제거
  • DB 자원 사용 제한 및 보호
  • 다수 사용자 처리 능력 향상

💡 실무에서는 HikariCP(Spring Boot), QueuePool(SQLAlchemy) 등을 통해 커넥션 풀을 관리한다.


1.7 요약

구성 요소설명

SGA SQL 실행, 캐시, 트랜잭션 관리를 위한 공유 메모리 공간
Dirty Buffer 수정된 상태이지만 디스크에 반영되지 않은 데이터 블록
Lock 데이터 일관성을 위한 동시성 제어 메커니즘
RAC 다중 서버가 하나의 DB를 공유해 고가용성과 확장성 제공
커넥션 풀 DB 커넥션을 미리 만들어 재사용함으로써 성능 최적화

이제 오라클의 기본 구조를 이해했으니, 다음 장에서는 SQL 실행 흐름과 옵티마이저에 대해 배워보자.

728x90
728x90

멀티센서 융합 기반 품질 이상 판별 (Sensor Fusion + 이상 탐지 AI)

🎯 목표

정전용량 센서, 광센서, 유량센서 등 여러 센서를 통해 제품의 상태를 감지하고,
그 데이터를 AI 모델이 학습해 불량품을 자동 감지하는 시스템을 Unity에서 구현합니다.


🧩 사용 기술

  • Unity (센서 동작 시뮬레이션, 제품 상태 구현)
  • Python (이상 탐지 모델: Autoencoder / Isolation Forest)
  • C# (센서값 로깅, 판별 결과 반영)
  • 머신러닝 기반 이상 분류기
  • 선택: ONNX 모델 로딩 (Unity 추론 적용 시)

🖼️ 시뮬레이션 화면 예시

제품이 센서를 통과하면서 각 센서가 값을 수집하고, AI가 이 데이터를 분석해 불량 여부를 판단


🛠 Unity 구현 단계

1️⃣ 구성 요소 설계

오브젝트 설명
Product 감지 대상 물체 (Cube, Sphere 등 불량 포함)
CapacitiveSensor 재질 감지 (예: 금속 vs 비금속)
LightSensor 위치/정렬 상태 감지
FlowSensor 내부 유량 감지 시뮬레이션 (예: 정해진 액체 통과 여부)
InspectionManager 모든 센서 값을 종합하고 AI 호출
 

2️⃣ 센서 감지 스크립트 (C#)

public class SensorReader : MonoBehaviour
{
    public float sensorValue;

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Product"))
        {
            sensorValue = Random.Range(0.8f, 1.2f); // 간단한 센서값 시뮬
        }
    }
}

3️⃣ 멀티센서 데이터 수집 및 라벨링

public class InspectionManager : MonoBehaviour
{
    public SensorReader capacitive;
    public SensorReader light;
    public SensorReader flow;
    public Text resultText;

    void Inspect()
    {
        float[] features = new float[]
        {
            capacitive.sensorValue,
            light.sensorValue,
            flow.sensorValue
        };

        bool isDefective = RunMLModel(features);
        resultText.text = isDefective ? "❌ 불량" : "✅ 정상품";
    }

    bool RunMLModel(float[] input)
    {
        // 예: 평균과 편차 기반 간단 판별
        float avg = input.Average();
        return avg < 0.85f || avg > 1.15f;
    }
}

※ 초기에는 간단한 수치 판별 사용 → 추후 Python 학습 모델 적용 가능


🧠 Python AI 모델 학습 (이상 탐지)

Isolation Forest 사용 예시

from sklearn.ensemble import IsolationForest
import pandas as pd

df = pd.read_csv("sensor_dataset.csv")  # 컬럼: Capacitive, Light, Flow
model = IsolationForest()
model.fit(df[['Capacitive', 'Light', 'Flow']])
df['Anomaly'] = model.predict(df[['Capacitive', 'Light', 'Flow']])  # 1 = 정상, -1 = 불량

# 저장
import joblib
joblib.dump(model, 'sensor_model.pkl')

Unity ↔ Python 연결 방법 (선택)

  • Flask 서버 구성 후 Unity에서 HTTP GET으로 예측 요청
  • 또는 ONNX로 모델 변환 후 Unity 내 ONNX 추론 적용 (고급)

🎁 기대 결과

  • 센서 3개 이상을 융합한 품질 검사 가능
  • AI 기반으로 불량 자동 감지 → 검사 속도 향상
  • Unity에서 품질 판별 시뮬레이션까지 시각화 완료

📈 확장 아이디어

확장 주제 설명
제품 회전/정렬 불량 감지 3D 위치 기반 센서 추가
센서 간 상관관계 분석 PCA, SHAP 등으로 중요도 분석
강화학습과 결합 검사 타이밍 최적화
728x90
728x90

강화학습 기반 공정 최적화 (Unity + ML-Agents)

🎯 목표

Unity에서 공정 시뮬레이터를 만들고, 강화학습을 통해 AI가 자동으로 공정을 최적화하도록 훈련합니다.
예: 서보모터 속도 조절, 물체 이송 타이밍, 실린더 동작 간격 등을 AI가 스스로 최적화합니다.


🧩 사용 기술

  • Unity (시뮬레이션 + 제어 환경)
  • ML-Agents Toolkit (강화학습 훈련)
  • PPO (Proximal Policy Optimization) 알고리즘
  • Python (훈련 파이프라인)

🖼️ 시뮬레이션 예시 화면

AI 에이전트가 공정 조건(속도, 타이밍)을 스스로 조정하며 목표 시간과 품질을 만족시키는 방향으로 학습


🛠 Unity 구현 과정

1️⃣ 공정 시나리오 설정 예시

 

구성 요소 설명
Item 이송할 물체 (Cube 등)
Conveyor 벨트, 속도 조절 가능
Cylinder 물체를 밀어주는 역할
Sensor 감지 위치, 도달 시간 측정
Agent 공정을 제어하는 AI 에이전트
 

2️⃣ ML-Agent 설치 및 설정

✅ 설치 (Python)

pip install mlagents

✅ Unity 패키지 설치


3️⃣ AI Agent 스크립트 작성

🎮 공정 최적화용 Agent 스크립트 (C#)

using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;

public class FactoryAgent : Agent
{
    public Transform item;
    public Transform sensor;
    public float conveyorSpeed = 1.0f;

    private float timer;

    public override void OnEpisodeBegin()
    {
        item.position = new Vector3(-2f, 0.5f, 0f);
        timer = 0;
    }

    public override void CollectObservations(VectorSensor sensor)
    {
        sensor.AddObservation(item.position.x);
        sensor.AddObservation(conveyorSpeed);
    }

    public override void OnActionReceived(ActionBuffers actions)
    {
        float speedAction = actions.ContinuousActions[0];
        conveyorSpeed = Mathf.Clamp(speedAction, 0.5f, 3.0f);
        item.Translate(Vector3.right * conveyorSpeed * Time.deltaTime);

        timer += Time.deltaTime;

        // 성공: 센서 위치 도달
        if (item.position.x >= sensor.position.x)
        {
            float reward = 1.0f - Mathf.Abs(timer - 2.0f); // 목표 시간 2초
            SetReward(reward);
            EndEpisode();
        }

        if (timer > 4.0f) // 제한 시간 초과
        {
            SetReward(-1.0f);
            EndEpisode();
        }
    }

    public override void Heuristic(in ActionBuffers actionsOut)
    {
        actionsOut.ContinuousActions.Array[0] = 1.0f; // 테스트용 속도
    }
}

 


4️⃣ Python 훈련 설정 (config 파일)

behaviors:
  FactoryAgent:
    trainer_type: ppo
    hyperparameters:
      batch_size: 64
      buffer_size: 1024
      learning_rate: 0.0003
      beta: 0.005
      num_epoch: 3
    network_settings:
      normalize: true
      hidden_units: 128
      num_layers: 2
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0
    max_steps: 100000
    time_horizon: 64
    summary_freq: 1000

5️⃣ 학습 시작 명령어

mlagents-learn config/ppo_factory.yaml --run-id=factory_run_01 --train

Unity 실행 상태에서 에이전트가 스스로 공정 타이밍을 조절하며 최적화 학습을 진행합니다.


🧠 보상 설계 팁 (강화학습 핵심)

행동 결과
정확히 목표 시간 도달 (2.0s ± 0.2s) +1.0
너무 빠르거나 느림 -0.3 ~ -1.0
실패 (타겟 미도달 or 충돌) -1.0
연속 성공 +0.2 (보너스)
 

🎁 기대 결과

  • AI가 자율적으로 공정 속도 조절 전략 학습
  • 실제로 이송 거리, 목표 시간이 바뀌어도 스스로 조정
  • 튜닝 없이 강건한 공정 제어 자동화 구현

📌 확장 아이디어

확장 주제 설명
실린더+벨트 조합 최적화 동시 제어
강화학습 + 예측 모델 결합 Hybrid 제어
다중 에이전트 협업 공정 간 AI 협력 제어
 

🏷️ 태그 (4편 전용)

강화학습, UnityMLAgents, PPO, 공정강화학습, AI자율제어, 스마트팩토리AI, 공정최적화, 강화학습시뮬레이션, UnityAI, 스마트제조

▶️ 다음 편 예고 (5편)

멀티센서 융합 기반 품질 이상 판별 – AI가 다양한 센서 데이터를 조합해 불량 자동 감지

728x90
728x90

예측 기반 실린더 속도 제어 (LSTM + Unity)

🎯 목표

실린더의 이동 거리, 속도, 환경 조건을 기반으로 도착 시간을 AI가 예측하고, 예측 결과에 따라 속도 또는 입력 값을 실시간 보정하는 Unity 시뮬레이터를 제작합니다.


🧩 활용 기술

  • Unity (물리 기반 이동 시뮬레이션)
  • Python (LSTM 예측 모델 학습)
  • C# (속도 제어 및 보정 로직 구현)
  • ML.NET (선택: Unity 내 ML 추론 가능)

🖼️ 시뮬레이션 화면 예시

실린더가 이동 거리에 따라 도착 시간을 AI가 예측 → 속도 자동 보정 → 일정한 도착 시간 유지


🛠 Unity 구현 과정

1️⃣ 실린더 + 거리 기반 제어 스크립트

public class PredictiveCylinder : MonoBehaviour
{
    public Transform target;
    public float speed = 2f;
    private float moveStartTime;
    private float predictedTime;

    public void StartMove(float predictedTime)
    {
        this.predictedTime = predictedTime;
        moveStartTime = Time.time;
        StartCoroutine(MoveRoutine());
    }

    IEnumerator MoveRoutine()
    {
        Vector3 start = transform.position;
        Vector3 end = target.position;

        while (Vector3.Distance(transform.position, end) > 0.01f)
        {
            float distance = Vector3.Distance(start, end);
            speed = distance / predictedTime;
            transform.position = Vector3.MoveTowards(transform.position, end, speed * Time.deltaTime);
            yield return null;
        }

        Debug.Log("🟢 실린더 도착! 실제 시간: " + (Time.time - moveStartTime));
    }
}

 


2️⃣ 데이터 수집 (거리, 속도, 도착 시간)

public class TimeLogger : MonoBehaviour
{
    public Transform start;
    public Transform target;
    public float speed;
    private float startTime;

    void Start()
    {
        float distance = Vector3.Distance(start.position, target.position);
        startTime = Time.time;

        float estimatedTime = distance / speed;
        float actualTime = SimulateMovement(distance, speed); // 추후 구현

        Debug.Log($"{distance},{speed},{actualTime}");
    }
}

📁 CSV 예시:

 
Distance,Speed,ActualTime
0.5,2.0,0.24
0.8,2.0,0.38
1.0,2.5,0.40

🧠 AI 모델 학습 (Python - LSTM)

import pandas as pd
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

df = pd.read_csv("cylinder_data.csv")
X = df[['Distance', 'Speed']].values
y = df['ActualTime'].values

X = X.reshape((X.shape[0], 1, X.shape[1]))  # LSTM 입력 형태

model = Sequential()
model.add(LSTM(32, input_shape=(1, 2)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
model.fit(X, y, epochs=100, verbose=1)

model.save("lstm_predictor.h5")

 


🎯 예측 결과를 Unity에서 사용하는 방법

💡 옵션 1: 예측값 CSV로 저장 → Unity에서 로딩

float predictedTime = PredictTimeFromCSV(distance, speed);
cylinder.StartMove(predictedTime);

💡 옵션 2: Unity에서 Python 서버 호출 (Flask)

UnityWebRequest www = UnityWebRequest.Get("http://localhost:5000/predict?d=0.5&s=2.0");
yield return www.SendWebRequest();
float predictedTime = float.Parse(www.downloadHandler.text);

💡 옵션 3: ML.NET or ONNX 모델 로딩 (고급)


📢 보정 로직 개념

 

거리 예측 시간 속도 보정
0.8m 0.4s 0.8 / 0.4 = 2.0 m/s
1.2m 0.6s 1.2 / 0.6 = 2.0 m/s
1.2m 0.9s (부하 ↑) 1.2 / 0.9 = 1.33 m/s
 

→ AI가 예측한 시간에 맞춰 속도 보정


🎁 기대 결과

  • 실린더가 항상 일정한 시간에 도달
  • 공기압 변화, 부하 변화가 있어도 예측 기반으로 자동 보정
  • Unity 기반 시뮬레이션 + 제어 최적화 모델 완성

🧪 확장 아이디어

화장 설명
센서 피드백 추가 정전용량 센서로 도달 여부 검증
온도/공기압 영향 변수 추가 예측 정확도 개선
PID 보정 병행 AI+전통 제어 융합 가능
 

 


📌 태그 

#예측제어 #속도자동조절 #LSTM예측 #UnityAI #스마트팩토리제어 #공정시간보정 #AI제어최적화 #C샵유니티 #Unity시뮬레이션

 


▶️ 다음 편 예고 (4편)

강화학습 기반 공정 최적화 – Unity ML-Agents로 서보모터와 공정 순서를 스스로 학습하는 AI 만들기

728x90
728x90

실린더 외란 감지 + 알람 시스템 (Unity + AI)

🎯 목표

Unity에서 실린더의 동작을 시뮬레이션하고, 외란(지연, 위치 오차, 튀는 현상 등)을 감지하는 AI 모델을 적용하여 알람 시스템을 만들자.


🧩 사용 기술

  • Unity 2021+ (시뮬레이터 제작)
  • C# (센서/실린더 제어, 로그 저장)
  • Python (Autoencoder 또는 이상탐지 모델)
  • 머신러닝: 이상 탐지 기반 분류 모델 (Isolation Forest / Autoencoder)

🖼️ 시뮬레이션 화면 예시

💬 실린더가 동작할 때, 예상 위치에 도달하지 않거나 도달 시간이 지연되면 AI가 외란 상태로 판단하고 알림 발생


🛠 Unity 구현 단계

1️⃣ 실린더 제어 시뮬레이션

🎮 오브젝트 구성

 

오브젝트 설명
Cylinder 실린더 역할, 위치 이동
Target 목표 위치
LightSensor 도착 여부 판단
AlarmPanel 경고 UI 표시
 

🎮 이동 스크립트 (C#)

public class CylinderMover : MonoBehaviour
{
    public Transform target;
    public float speed = 2.0f;
    public float moveStartTime;
    public bool isMoving = false;

    void Update()
    {
        if (isMoving)
        {
            transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
            if (Vector3.Distance(transform.position, target.position) < 0.01f)
            {
                isMoving = false;
                float arrivalTime = Time.time - moveStartTime;
                Debug.Log("도착 시간: " + arrivalTime);
                CylinderLogger.Instance.LogArrival(arrivalTime);
            }
        }
    }

    public void StartMove()
    {
        moveStartTime = Time.time;
        isMoving = true;
    }
}

2️⃣ 외란 기준 데이터 로깅

public class CylinderLogger : MonoBehaviour
{
    public static CylinderLogger Instance;
    public List<float> log = new List<float>();

    void Awake() => Instance = this;

    public void LogArrival(float time)
    {
        log.Add(time);
        // 예: time > 2.5초면 외란으로 라벨링 가능
    }
}

3️⃣ 외란 라벨링 기준 예시

도착 시간 (sec) 외란 여부
1.5 정상
2.7 외란 (지연)
1.6 정상
3.2 외란
 

이 데이터를 Python으로 Export (CSV)해서 학습에 사용합니다.


🧠 AI 모델 학습 (Python 예시)

Autoencoder 기반 이상 탐지

from sklearn.ensemble import IsolationForest
import pandas as pd

df = pd.read_csv("cylinder_data.csv")
model = IsolationForest()
model.fit(df[['arrival_time']])
df['anomaly'] = model.predict(df[['arrival_time']])
  • 1 → 정상, -1 → 외란
  • 모델을 Pickle 파일로 저장하여 Unity와 연동하거나, threshold 기반으로 Unity 내에서 직접 분류 가능

🖥 Unity 내 이상 감지 및 알람 출력

알람 표시 스크립트

public class AlarmController : MonoBehaviour
{
    public GameObject alarmUI;

    public void CheckForAnomaly(float arrivalTime)
    {
        if (arrivalTime > 2.5f) // 기준 시간 설정
        {
            alarmUI.SetActive(true);
            Debug.Log("⚠️ 외란 감지됨! 알람 발생");
        }
        else
        {
            alarmUI.SetActive(false);
        }
    }
}
  • 외란이 발생하면 빨간 경고창 (AlarmPanel) 활성화

🎮 UI 구성 추천

UI 요소 설명
TextMeshPro "정상 동작" / "외란 발생" 표시
LED Light (빨강) 외란 시 점등
Reset 버튼 다시 테스트 가능
Chart 버튼 로그 기반 도착 시간 시각화 (선택 사항)
 

🎁 기대 결과

  • 실린더 동작의 정상/비정상 판단 가능
  • 외란 발생 시 즉각 경고 → 공정 품질 확보
  • AI 기반 판단으로 휴먼 에러 감소

📊 실습 요약

 

항목 설명
센서 시뮬레이션 실린더 위치/도착 감지
외란 기준 정의 도착 시간, 위치 오차
AI 모델 적용 이상 탐지 기반 분류
알람 출력 Unity UI로 알림 표시
 

🔖 사용 태그

#Unity공정제어 #실린더제어 #AI이상탐지 #Autoencoder #IsolationForest #스마트팩토리 #외란감지 #산업자동화

📌 다음 편 예고

3편. 예측 기반 실린더 속도 제어 – LSTM으로 도착 시간 예측하고 제어 자동화하기

728x90
728x90

📘 개념 요약

C# 8.0부터 참조형 변수에도 nullable을 명시적으로 설정할 수 있습니다. 이는 NullReferenceException을 컴파일 타임에 예방할 수 있게 해줍니다.


🧠 용어 설명

용어 설명
string? null 허용 참조형
#nullable enable 해당 파일에서 null 검사 기능 켜기
NullReferenceException null 값을 접근 시 발생하는 런타임 예외
 

💻 코드 예제

#nullable enable
class User
{
    public string? Name { get; set; }  // null 허용
    public string Email { get; set; } = "default@site.com";  // non-null
}

class Program
{
    static void Main()
    {
        User u = new User();
        if (u.Name != null)
        {
            Console.WriteLine(u.Name.Length); // null 체크 후 안전하게 사용
        }
    }
}

🔧 사용법 정리

  • string? 은 null 허용, string은 허용하지 않음
  • null 상태를 컴파일러가 경고로 알려줌
  • 안정성 높은 코드 작성 가능

🏷 추천 태그

C# 8.0, nullable, null 참조 방지, NRE 방지, 프로그래밍 안정성, 참조형, 컴파일러 경고

728x90
728x90

📘 개념 요약

개념 설명
Thread 저수준 병렬 처리 방식으로, 개발자가 직접 스레드 생성/관리
Task .NET에서 제공하는 고수준 병렬 처리 방식으로, 스레드 풀 기반
Parallel 반복 작업을 병렬로 쉽게 수행하기 위한 고급 API (내부적으로 Task 사용)
 

💻 실제 코드 성능 비교 예제

// Thread 방식
for (int i = 0; i < 5; i++)
{
    new Thread(() =>
    {
        Console.WriteLine($"[Thread] 작업 {i} - ID: {Thread.CurrentThread.ManagedThreadId}");
        Thread.Sleep(200);
    }).Start();
}

// Task 방식
for (int i = 0; i < 5; i++)
{
    Task.Run(() =>
    {
        Console.WriteLine($"[Task] 작업 {i} - ID: {Thread.CurrentThread.ManagedThreadId}");
        Thread.Sleep(200);
    });
}

// Parallel 방식
Parallel.For(0, 5, i =>
{
    Console.WriteLine($"[Parallel] 작업 {i} - ID: {Thread.CurrentThread.ManagedThreadId}");
    Thread.Sleep(200);
});

🧠 성능 비교 (정량적 요약)

항목 Thread Task Parallel.For
생성 속도 느림 (새 스레드 생성) 빠름 (스레드풀 재사용) 매우 빠름 (Task 활용 최적화)
메모리 사용 상대적으로 높음 적음 적음
스케줄링 개발자가 직접 관리 .NET이 자동 관리 자동 병렬 분할
예외 처리 try-catch 직접 필요 간편 (await, ContinueWith) 약간 복잡함
컨트롤 높음 (우선순위 등) 중간 (제한적 컨트롤) 낮음 (고정된 패턴)
확장성 낮음 (스레드 과다 시 시스템 부하) 높음 높음 (병렬 루프 자동 분배)
 

🧪 실제 성능 차이 실험 (예시 시나리오)

작업 수: 1000개, 각각 50ms 대기

  • Thread:
    • 생성 비용 ↑
    • 컨텍스트 스위칭 많음 → CPU 부하 증가
    • 스레드 개수 많아지면 성능 급하락
  • Task:
    • 스레드 풀 기반이라 리소스 절약
    • 처리 속도 일정, 확장성 우수
  • Parallel:
    • CPU 코어 수만큼 자동 분할 실행
    • 단순 반복문에서는 최강 성능

🔧 사용법 요약

사용 상황 추천 도구
스레드 우선순위 제어, 백그라운드 스레드 필요 Thread 직접 사용
병렬 연산, 백그라운드 API 호출 Task, Task.Run
대량 반복 작업, 빠른 계산 Parallel.For, Parallel.ForEach
 

📝 결론 요약

  • Thread는 지금은 거의 특수 상황에만 사용됨 (직접 스레드 제어 필요할 때)
  • Task는 범용 병렬 처리 및 비동기 처리의 기본
  • Parallel은 반복 작업의 병렬 최적화에 최적

💡 실무에서는 대부분 Task와 Parallel을 사용하며, Thread는 병렬 제어가 필요한 특수 케이스에서만 권장됩니다.


🏷 추천 태그

C#, Thread, Task, Parallel, 스레드 풀, 병렬처리, 멀티스레딩, 성능 비교, 비동기, Concurrency, 스레드 최적화


🎯 실전 팁

  • async/await 기반 Task는 비동기 I/O 작업에 최적
  • Parallel.For는 CPU 바운드 작업에 최적
  • 병렬 작업 수가 많고 짧을수록 Task 또는 Parallel을,
    작업 시간이 길고 독립적일수록 Thread를 사용하면 됩니다.
728x90
728x90

📘 개념 요약

람다식은 C#에서 익명 메서드를 간단하게 표현하는 방식입니다. 특히 LINQ, delegate, 이벤트, 비동기 콜백 등에서 많이 사용되며, 코드를 간결하게 만들어줍니다.


🧠 용어 설명

용어 의미
람다식 입력 => 결과 형태의 간결한 함수 표현
익명 함수 이름이 없는 함수, 한 번만 쓰일 때 사용
Predicate<T> bool을 반환하는 델리게이트
Func<T, TResult> 입력/출력 타입이 있는 일반 함수 형식
Action<T> 반환값 없이 동작만 수행하는 함수 형식
 

💻 기본 형식

입력 => 식 or 블록
x => x > 10       // 하나의 입력, 조건 필터링
(x, y) => x + y   // 두 개의 입력, 계산 결과 반환
() => Console.WriteLine("Hello")  // 입력 없음

💡 LINQ에서의 예제

var numbers = new List<int> { 1, 2, 3, 4, 5 };

// 짝수만 필터링
var evens = numbers.Where(n => n % 2 == 0);

foreach (var n in evens)
    Console.WriteLine(n);  // 출력: 2, 4

n => n % 2 == 0 은 n이라는 입력을 받아서, 짝수인지 검사하여 true/false 반환하는 Predicate<int> 형식입니다.


🔧 다양한 람다식 예시

 

목적 코드 예제 설명
필터링 list.Where(x => x > 10) 10보다 큰 값만 선택
매핑 list.Select(x => x * 2) 값을 2배로 변환
정렬 list.OrderBy(x => x.Name) 이름 기준 정렬
조건 검색 list.Any(x => x == 5) 값이 포함되어 있는지
집계 list.Sum(x => x.Price) 가격 합산
 

🛑 주의사항

  • 블록이 여러 줄일 경우 {} 중괄호와 return 필수:
Func<int, int> square = x =>
{
    int result = x * x;
    return result;
};
  • 람다식 안에서 외부 변수 참조 시 캡처됨 (클로저):
int baseNum = 10;
var result = numbers.Select(n => n + baseNum);

 


📝 정리

 

항목 설명
람다식 구조 (매개변수) => 표현식 또는 { 코드블록 }
자주 사용되는 위치 LINQ, 콜백, 이벤트, 비동기
대표 함수 형식 Func<T, TResult>, Predicate<T>, Action<T>
장점 코드 간결, 가독성 향상
주의 복잡한 로직은 블록 사용, 클로저 주의
 

🏷 추천 태그

C#, 람다식, LINQ, 익명 함수, Predicate, Func, Action, delegate, 콜백, 클로저

728x90
728x90

📘 개념 요약

인터페이스와 의존성 주입(DI)은 객체 지향 설계의 핵심으로, 결합도를 낮추고, 확장 가능하고 테스트 가능한 구조를 만드는 데 필수입니다.


🧠 용어 설명

용어 설명
Interface 동작만 정의, 구현은 별도 클래스
DI (Dependency Injection) 외부에서 필요한 객체를 주입
Loose Coupling 모듈 간 결합도 최소화
IoC Container DI 자동 관리 도구 (ASP.NET Core 기본 제공)
 

💻 코드 예제

 
public interface ILogger
{
    void Log(string message);
}

public class ConsoleLogger : ILogger
{
    public void Log(string message)
    {
        Console.WriteLine($"[로그]: {message}");
    }
}

public class App
{
    private readonly ILogger _logger;
    public App(ILogger logger)
    {
        _logger = logger;
    }

    public void Run()
    {
        _logger.Log("프로그램 시작됨.");
    }
}

🔧 사용법 정리

  • 테스트 시 FakeLogger 등으로 쉽게 교체 가능
  • ASP.NET Core에서는 생성자 기반 DI 기본 제공
  • 유지보수성과 모듈화 향상

🏷 추천 태그

C#, DI, 의존성 주입, 인터페이스, 객체지향 설계, 테스트 가능 코드, SOLID, IoC, 유지보수

728x90
728x90

📘 개념 요약

LINQ는 C# 컬렉션을 SQL처럼 다루는 문법으로, 데이터를 필터링하고 가공하는 강력한 도구입니다. 리스트, 배열, DB, XML, JSON 등 다양한 소스에 적용할 수 있습니다.


🧠 용어 설명

용어 설명
Where() 조건에 맞는 요소 필터링
Select() 변환 및 항목 추출
OrderBy() 정렬
GroupBy() 그룹화
Join() 두 컬렉션 연결 (조인)
 

💻 코드 예제

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

        // 짝수 필터링
        var evens = numbers.Where(n => n % 2 == 0);

        Console.WriteLine("짝수 목록:");
        foreach (var n in evens)
            Console.WriteLine(n);
    }
}

🔧 사용법 정리

  • 람다식 (n => 조건): 간결하게 필터링
  • IEnumerable<T>: LINQ 결과는 지연 평가(lazy evaluation)
  • ToList() 사용 시 즉시 평가

🏷 추천 태그

C#, LINQ, 람다, 데이터 처리, Where, Select, 프로그래밍, 컬렉션 처리, IEnumerable

728x90

+ Recent posts