낙서장[2]: 22개의 글

[코딩&디버깅] 생성(5), 구조(7), 행위(11) 패턴 특징

Posted by nkjok
2025. 3. 24. 22:10 낙서장[2]/코딩&디버깅
반응형

---

## **생성 패턴 (Creational Patterns)**  
객체 생성 관련 문제를 해결하며, 객체 생성 과정을 유연하고 효율적으로 만듭니다.

1. **빌더 (Builder)**  
   - **특징**: 복잡한 객체를 단계별로 생성하고, 최종적으로 일관된 객체를 생성.
   - **사용 사례**: 생성 과정이 복잡한 객체의 생성.
   - **예시**: 다양한 속성을 가진 자동차 조립.

2. **프로토타입 (Prototype)**  
   - **특징**: 기존 객체를 복제하여 새로운 객체 생성.
   - **사용 사례**: 객체 생성 비용이 비쌀 때 복제를 통해 성능 향상.
   - **예시**: 게임 캐릭터를 복제해 여러 캐릭터 생성.

3. **팩토리 메서드 (Factory Method)**  
   - **특징**: 객체 생성을 서브클래스에서 정의, 객체 생성의 세부사항을 캡슐화.
   - **사용 사례**: 구체적인 클래스를 알 필요 없이 객체 생성.
   - **예시**: 다양한 데이터베이스 연결 객체 생성.

4. **앱스트랙 팩토리 (Abstract Factory)**  
   - **특징**: 관련 객체를 그룹으로 묶어 생성.
   - **사용 사례**: 계열화된 객체 생성 (윈도우/맥 UI).
   - **예시**: 여러 GUI 테마에서 버튼과 스크롤바 생성.

5. **싱글톤 (Singleton)**  
   - **특징**: 객체를 하나만 생성, 전역 접근을 제공.
   - **사용 사례**: 설정 관리 클래스.
   - **예시**: 애플리케이션 설정이나 로깅 클래스.

---

## **구조 패턴 (Structural Patterns)**  
클래스와 객체의 관계를 정의하며, 시스템 구조를 최적화합니다.

1. **브리지 (Bridge)**  
   - **특징**: 구현과 인터페이스를 분리하여 독립적으로 확장 가능.
   - **사용 사례**: 플랫폼 간 호환성.
   - **예시**: TV와 리모컨의 독립적 설계.

2. **데코레이터 (Decorator)**  
   - **특징**: 객체에 동적으로 새로운 기능을 추가.
   - **사용 사례**: 확장 가능한 기능 추가.
   - **예시**: 메시지 암호화 기능 추가.

3. **퍼사드 (Facade)**  
   - **특징**: 복잡한 서브시스템을 단순한 인터페이스로 제공합니다.
   - **사용 사례**: 라이브러리 사용 단순화.
   - **예시**: 호텔 예약 시스템의 단일 API.

4. **플라이웨이트 (Flyweight)**  
   - **특징**: 공유를 통해 메모리 사용을 줄임.
   - **사용 사례**: 대량의 유사 객체 생성.
   - **예시**: 게임에서 동일한 적 객체 공유.

5. **프록시 (Proxy)**  
   - **특징**: 다른 객체에 대한 접근을 제어.
   - **사용 사례**: 네트워크 요청 최소화.
   - **예시**: 가상 프록시로 이미지 로드 지연 처리.

6. **컴포지트 (Composite)**  
   - **특징**: 객체들을 트리 구조로 구성하여 단일 객체처럼 다룸.
   - **사용 사례**: 계층 구조 데이터 처리.
   - **예시**: 파일 시스템 구조.

7. **어댑터 (Adapter)**  
   - **특징**: 인터페이스 변환을 통해 호환성을 제공.
   - **사용 사례**: 서로 다른 시스템 간의 연결.
   - **예시**: 전압 변환기.

---

## **행위 패턴 (Behavioral Patterns)**  
객체 간의 상호작용 및 책임 분배에 중점을 둡니다.

1. **미디에이터 (Mediator)**  
   - **특징**: 객체 간 통신을 중앙 집중화.
   - **사용 사례**: 복잡한 객체 네트워크 조율.
   - **예시**: 채팅 애플리케이션의 메시지 라우팅.

2. **인터프리터 (Interpreter)**  
   - **특징**: 언어의 문법을 정의하고 해석.
   - **사용 사례**: DSL(도메인 특화 언어) 처리.
   - **예시**: 정규식 해석기.

3. **이터레이터 (Iterator)**  
   - **특징**: 컬렉션 요소를 순차적으로 접근.
   - **사용 사례**: 리스트 반복 작업.
   - **예시**: 데이터베이스 레코드 순회.

4. **스테이트 (State)**  
   - **특징**: 상태에 따라 객체의 동작을 변경.
   - **사용 사례**: 상태 기반 전환.
   - **예시**: 문서 편집기의 상태(편집/읽기).

5. **비지터 (Visitor)**  
   - **특징**: 연산을 객체 구조에서 분리.
   - **사용 사례**: 복잡한 객체 구조에 동작 추가.
   - **예시**: 파일 시스템 탐색.

6. **커맨드 (Command)**  
   - **특징**: 요청을 객체로 캡슐화.
   - **사용 사례**: 실행 취소, 재실행 기능.
   - **예시**: 리모컨 버튼 명령.

7. **전략 (Strategy)**  
   - **특징**: 알고리즘을 캡슐화하여 교환 가능.
   - **사용 사례**: 동적으로 알고리즘 선택.
   - **예시**: 정렬 알고리즘 선택.

8. **메멘토 (Memento)**  
   - **특징**: 객체 상태를 저장하고 복원.
   - **사용 사례**: 이전 상태 복구.
   - **예시**: 문서 복구 기능.

9. **체인 오브 리스폰서빌리티 (Chain of Responsibility)**  
   - **특징**: 요청을 처리할 기회를 여러 객체에 제공.
   - **사용 사례**: 이벤트 처리 체인.
   - **예시**: 권한 검증 체인.

---

**요약 및 차이점 구분**  
- **생성 패턴**: 객체 생성 및 초기화에 초점. (예: 싱글톤, 빌더)
- **구조 패턴**: 시스템 구조 및 관계를 개선. (예: 데코레이터, 어댑터)
- **행위 패턴**: 객체 간 상호작용 및 책임 분배. (예: 전략, 스테이트)

반응형

[코딩&디버깅] 도커 MYSQL 설치

Posted by nkjok
2025. 3. 3. 16:35 낙서장[2]/코딩&디버깅
반응형

docker run -d -it --name mysql1 -p 12000:3306 -e MYSQL_ROOT_PASSWORD=1234 mysql:8.0.41

 

반응형

[코딩&디버깅] C/Java/Python <-> 도커 <-> VSCode 설치

Posted by nkjok
2025. 3. 2. 15:22 낙서장[2]/코딩&디버깅
반응형

개인확인용도로 작성한 글 입니다

docker run -d -it --name u2204_c -h u2204_c -v u2204_c:/home/user1/var/lib/u2204_c ubuntu:22.04 
docker run -d -it --name u2204_java -h u2204_java -v u2204_java:/home/user1/var/lib/u2204_java ubuntu:22.04
docker run -d -it --name u2204_python -h u2204_python -v u2204_python:/home/user1/var/lib/u2204_python ubuntu:22.04





C: https://nkjok.tistory.com/326 게시글 참조

자바: apt install openjdk-17-jdk> 
$ vim .bashrc 
# 환경 설정에 가장 밑에 아래 내용을 추가하고 저장한 후 다시 접속한다.
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin
$ source .bashrc
$ echo $JAVA_HOME
$ echo $PATH 

파이썬: vscode에서 파이썬설치> 확장설치> 쉘에서 apt -y install python3.10-dbg 설치

반응형

[코딩&디버깅] C언어 환경구성 (VM 우분투22.04 <-> 윈도우 VSCODE)

Posted by nkjok
2025. 2. 23. 01:27 낙서장[2]/코딩&디버깅
반응형

자바, 파이썬은 VM으로 우분투 설치하고 VSCODE로 SSH 연결만 성공하면 확장 설치로 쉽게 구성됬다
자바: 우분투설치 => VSCODE연결 => 자바확장설치 => JDK설치 => 환경변수설정 => IntelliSense 작동하는 자바 사용 가능
파이썬: 우분투설치 => VSCODE연결 => 파이썬확장설치 => IntelliSense 작동하는 파이썬 사용 가능
C: 시행착오 끝에 겨우 성공해서 기록을 남긴다, 정확히 어떻게 해결 된건지 모르겠다 그래서 설정파일을 다올린다 
 
1. 우분투에서 설치했다 
sudo apt -y install build-essential
sudo apt -y install gdb
 
2. 윈도우 VSCODE에서 C확장 설치했다, IntelliSense 작동하는 C 를 작성할 수 있었지만 디버깅이 불가능했다
 
3. 여러 시행착오 끝에 제이슨 확장자 설정 파일들 3개를 이리저리 수정하고 gdb 설치 이후 디버깅이 가능했다
※ 정확한 문제 원인은 모르겠다, 다음에 다시 설치해봐야겠다

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/g++",
            "cStandard": "c17",
            "cppStandard": "gnu++17",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}
c_cpp_properties.json

 

{
    "version": "0.2.0",
    "configurations": [
      {
        "name": "g++ build and debug active file",
        "type": "cppdbg",
        "request": "launch",
        "program": "${fileDirname}/${fileBasenameNoExtension}",
        "args": [],
        "stopAtEntry": false,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": false,
        "MIMode": "gdb",
        "setupCommands": [
          {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
          }
        ],
        "preLaunchTask": "g++ build active file",
        "miDebuggerPath": "/usr/bin/gdb"
      }
    ]
  }
launch.json

 

{
    "version": "2.0.0",
    "tasks": [
      {
        "type": "shell",
        "label": "g++ build active file",
        "command": "/usr/bin/g++",
        "args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"],
        "options": {
          "cwd": "/usr/bin"
        },
        "problemMatcher": ["$gcc"],
        "group": {
          "kind": "build",
          "isDefault": true
        }
      }
    ]
  }
tasks.json

 
 

디버깅 화면
반응형

[코딩&디버깅] 모의고사01회 6번

Posted by nkjok
2025. 2. 13. 19:16 낙서장[2]/코딩&디버깅
반응형
#include <stdio.h>

int add(int i, int j) {
    return i + j;
}

int sub(int i, int j) {
    return i - j;
}

int main() {
    int (*pf)(int, int);
   
    pf = add;
    printf("%d", pf(5, 4));  // add 함수 호출 결과: 9
   
    pf = sub;
    printf("%d", pf(5, 4));  // sub 함수 호출 결과: 1
   
    return 0;
}

디버깅 과정

먼저 작성하신 코드는 두 개의 함수와 하나의 함수 포인터를 사용하여 두 개의 정수를 더하고 빼는 작업을 수행합니다.

  • add 함수는 두 정수를 더합니다.
  • sub 함수는 두 정수를 뺍니다.
  • main 함수에서는 함수 포인터 pf를 사용하여 add 함수와 sub 함수를 호출하고, 그 결과를 출력합니다.

 

디버깅 단계

  1. 헤더 파일 포함이 줄은 표준 입출력 함수를 사용하기 위해 필요한 헤더 파일을 포함합니다.
    #include <stdio.h>
    
  2. 함수 정의두 함수를 정의합니다. add 함수는 두 정수를 더하고, sub 함수는 두 정수를 뺍니다.
    int add(int i, int j) {
        return i + j;
    }
    
    int sub(int i, int j) {
        return i - j;
    }
    
  3. 메인 함수
    • int (*pf)(int, int)는 함수 포인터 pf를 선언합니다. 이 포인터는 두 개의 int 인수를 받아들이고 int를 반환하는 함수들을 가리킬 수 있습니다.
    • pf = add;를 통해 pf가 add 함수를 가리키도록 합니다.
    • printf("%d", pf(5, 4));를 통해 pf가 가리키는 add 함수를 호출하고 그 결과를 출력합니다. 이 경우 결과는 9입니다.
    • pf = sub;를 통해 pf가 sub 함수를 가리키도록 합니다.
    • printf("%d", pf(5, 4));를 통해 pf가 가리키는 sub 함수를 호출하고 그 결과를 출력합니다. 이 경우 결과는 1입니다.
       
      int main() {
          int (*pf)(int, int);
          
          pf = add;
          printf("%d", pf(5, 4));  // add 함수 호출 결과: 9
          
          pf = sub;
          printf("%d", pf(5, 4));  // sub 함수 호출 결과: 1
          
          return 0;
      }
      

3. 디버깅 포인트

  • 함수 포인터 pf가 올바르게 설정되었는지 확인합니다.
  • 각 함수 호출 결과가 의도한 대로 출력되는지 확인합니다.
  • 프로그램이 성공적으로 종료되는지 확인합니다.

출력 결과

위 코드의 실행 결과는 다음과 같습니다:

 
91

첫 번째 printf 문에서 add 함수가 호출되어 9가 출력되고, 두 번째 printf 문에서 sub 함수가 호출되어 1이 출력됩니다. 따라서 최종 출력은 91이 됩니다.

 

코드 전체

다시 한 번 전체 코드를 참고하세요:

c
#include <stdio.h>

int add(int i, int j) {
    return i + j;
}

int sub(int i, int j) {
    return i - j;
}

int main() {
    int (*pf)(int, int);
    
    pf = add;
    printf("%d", pf(5, 4));  // add 함수 호출 결과: 9
    
    pf = sub;
    printf("%d", pf(5, 4));  // sub 함수 호출 결과: 1
    
    return 0;
}
반응형