일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Flutter
- 자바
- JavaScript
- 알고리즘
- pintos
- Vue.js
- 핀토스
- 나만무
- 자바스크립트
- HTML
- 모션비트
- CSS
- 큐
- 크래프톤정글
- 소켓
- userprog
- 코드트리
- 사이드프로젝트
- 4기
- 스택
- 크래프톤 정글
- defee
- 정보처리기사
- 시스템콜
- 프로그래머스
- 리액트
- TiL
- Java
- 백준
- corou
- Today
- Total
문미새 개발일지
정처기 공부 04/04 본문
자바 싱글톤 출력
public class Connection {
private static Connection _inst = null;
private int count = 0;
private Connection() {}
public static Connection getInstance() {
if (_inst == null) {
_inst = new Connection();
}
return _inst;
}
public void count() {
count++;
}
public int getCount() {
return count;
}
public static void main(String[] args) {
Connection conn1 = Connection.getInstance();
conn1.count();
Connection conn2 = Connection.getInstance();
conn2.count();
Connection conn3 = Connection.getInstance();
conn3.count();
conn1.count();
System.out.print(conn1.getCount());
}
}
클래스 안에서 Connection _inst를 선언하고 선언 값이 null인 초기에만 새 객체를 생성한다.
Connection conn1 = Connection.getInstance();
conn1.count();
- inst값이 null인 첫 선언이라 새 객체를 생성하고 객체의 count() 메소드를 실행한다.
- count()메소드는 count 변수를 1증가시킨다. count는 1이 된다.
Connection conn2 = Connection.getInstance();
conn2.count();
- 이미 객체가 있기 때문에, 생성되지 않고 기존 inst객체를 반환하여 count() 메소드를 실행한다.
- 기존 1에서 1증가되어 count는 2가 된다.
Connection conn3 = Connection.getInstance();
conn3.count();
- 이미 객체가 있기 때문에, 생성되지 않고 기존 inst객체를 반환하여 count() 메소드를 실행한다.
- 기존 2에서 1증가되어 count는 3이 된다.
conn1.count();
- count()를 한 번더 실행하여 기존 3에서 1증가되어 count는 4가 된다.
C언어 출력
#include <stdio.h>
int main() {
int v1= 0, v2= 35, v3= 29;
if(v1>v2 ? v2:v1) {
v2= v2 << 2;
} else {
v3= v3 << 2;
}
printf("%d", v2+v3);
return 0;
}
if문의 삼항연산자를 통해 0>35는 false로 v1(0)값이 되어 else문이 실행된다.
v3 = v3 << 2는 시프트 연산으로 v3값인 29를 2진수로 변경하고 0을 2개 채운다.
011101(29) => 01110100(116)
출력값은 116이 된다.
응집도 높은 순
ㄱ. 기능
ㄴ. 교환
ㄷ. 우연
ㄹ. 시간
ㅁ. 순차
ㅂ. 논리
ㅅ. 절차
결과
ㄱ - ㅁ - ㄴ - ㅅ - ㄹ - ㅂ - ㄷ
기능 - 순차 - 교환 - 절차 - 시간 - 논리 - 우연
허니팟(Honeypot)
허니팟은 사이버 보안에서 사용되는 기술로, 침입자를 유인하기 위해 공격당하는 것처럼 보여주며, 공격 기법을 조사하는 기술이다.
기능
- 공격자의 행동을 관찰하여 패턴을 분석
- 취약점을 연구하여 보안 강화에 활용
예시
- 외부에서 접근 가능한 가짜 로그인 페이지를 만들어, 침입자가 입력을 시도하면 행위를 기록하여 데이터 수집이 가능
테스팅 기법
블랙박스 테스트(BlackBox Testing)
- 내부 코드와 구조는 모른 채, 입출력만 보고 테스트하는 기법
- 사용자 입장에서 테스트
- 예시: 로그인 페이지에서 아이디와 비밀번호를 입력 시 정상적으로 로그인되는지 확인
회귀 테스트(Regression Testing)
- 기존 기능이 새로운 코드를 추가한 후에도 작동하는지 확인하는 블랙박스 테스트 기법
- 예시: 새로운 기능 추가 후, 로그인/회원가입 등의 기존 기능이 작동이 잘 되는지 확인
경계값 분석(Boundary Value Analysis)
- 최소값, 최대값, 경계 근처의 값을 이용해 확인하는 블랙박스 테스트 기법
- 예시: 입력 가능한 범위가 1~100일 때, 0, 1, 100, 101 등을 테스트
동등 분할 테스트(Equivalence Partitioning)
- 입력 값을 유효/무효 그룹으로 나누고 각 그룹을 대표하는 값만 확인하는 블랙박스 테스트 기법
- 예시: 입력값이 1~100일 때, 하나는 정상값(25), 하나는 -1(비정상)만 테스트
탐색적 테스트(Exploratory Testing)
- 정해진 테스트 케이스 없이, 경험을 바탕으로 자유롭게 탐색하면서 확인하는 블랙박스 테스트 기법
- 예시: 서비스를 직접 사용해보면서 예상 못한 오류나 버그가 있는지 테스트
시스템 테스트(System Testing)
- 전체 시스템이 요구사항대로 작동하는지 확인하는 블랙박스 테스트 기법
- 예시: 어플리케이션을 실제 사용 환경처럼 실행하여 전체 기능을 확인
사용자 수용 테스트(UAT, User Acceptance Testing)
- 실제 사용자가 고객이 테스트해서 제품이 목적에 맞는지 확인하는 블랙박스 테스트 기법
- 예시: 클라이언트가 어플리케이션을 테스트하고 "이대로 배포해도 괜찮다"고 승인
스트레스 테스트(Stress Testing)
- 시스템이 정상적인 한계를 넘었을 때 어떻게 동작하는지 확인하는 블랙박스 테스트 기법
- 예시: 서버에 동시에 수천 명이 접속했을 때, 시스템이 느려지는지, 터지는지 확인
- 한계 상황에서의 안정성을 확인하는 것이 목적
스파이크 테스트(Spike Testing)
- 짧은 시간 동안 갑자기 부하가 급증할 때 시스템이 버틸 수 있는지 확인하는 블랙박스 테스트 기법
- 예시: 기사 시험을 위해 큐넷에 유저가 동시에 들어올 때의 반응을 확인
- 스트레스 테스트와 유사하지만, 부하가 순간적으로 급격하게 증가하는 것이 핵심
복구 테스트(Recovery Testing)
- 시스템이 장애나 오류 발생 후 얼마나 빠르게 복구되는지 확인하는 블랙박스 테스트 기법
- 예시: 서버가 다운된 후에 백업으로 몇 초만에 복구되는지 확인
보안 테스트(Security Testing)
- 시스템이 데이터 유출이나 해킹 등의 외부 공격이나 침입에 대해 안전한지 확인하는 블랙박스 테스트 기법
- 예시: XSS, SQL Injection 등이 가능한지 확인
화이트박스 테스트(WhiteBox Testing)
- 내부 코드와 구조를 알고, 로직의 흐름을 따라 테스트하는 기법
- 개발 입장에서 테스트
- 예시: 조건문, 반복문 등의 로직들이 정상적으로 진행되는지 확인
구조 테스트(Structure Testing)
- 소스 코드의 내부 구조(흐름, 조건 등)를 기반으로 확인하는 화이트박스 테스트 기법
- 예시: 조건문, 반복문 등 코드의 모든 경로를 확인
유닛 테스트(Unit Testing)
- 하나의 함수 또는 모듈 단위로 테스트하는 화이트박스 테스트 기법
- 예시: add(a, b) 함수가 정확히 두 수를 더하는지 확인
통합 테스트(Integration Testing)
- 여러 모듈 간 연결이 올바르게 작동하는지 테스트하는 화이트박스 테스트 기법
- 예시: 회원가입 후 자동 로그인 기능이 잘 연결되어 있는지 확인
디지털 저작권 관리(DRM, Digital Rights Management)
디지털 컨텐츠나 창작물을 합법적으로 보호하고 사용할 수 있도록 하는 전반적인 저작권 보호 프로세스이다.
컨텐츠 제공자(Content Provider)
- 컨텐츠 생성 및 등록
- 저작물을 제작하고, DRM 시스템에 등록한다.
패키저(Packager)
- 컨텐츠 암호화 및 포맷 변환
- 컨텐츠를 암호화하고, 플랫폼/기기별 포맷으로 패키징한다.
인증 시스템(Authentication System)
- 사용자 인증
- 컨텐츠 접근 전 사용자나 기기의 신원을 확인한다.
권한 관리 시스템(Authorization Server)
- 사용 조건 제어
- 구매/대여 여부, 시청 가능 시간, 복사 가능 여부 등 권한을 설정한다.
라이센스 서버(License Server)
- 사용 권한 발급
- 사용자가 컨텐츠 접근 요청 시, 암호 해독 키와 권한을 발급한다.
키 서버(Key Server)
- 암호 키 관리 및 분배
- 컨텐츠 복호화에 필요한 암호 키를 안전하게 저장하고 제공한다.
컨텐츠 배포 시스템(Distribution Server)
- 컨텐츠 전달
- 스트리밍 서버나 CDN 등, 암호화된 컨텐츠를 사용자에게 전송한다.
사용자 클라이언트(DRM Player)
- 복호화 및 재생
- 사용자 단말기에서 컨텐츠를 복호화하고 재생한다.(권한 조건에 따라 제한 적용)
추적 및 로깅 시스템(Tracking/Logging)
- 사용 모니터링
- 컨텐츠 사용 패턴과 이력 기록, 불법 복제를 탐지한다.
보안 모듈(Secure Module, TEE 등)
- 로컬 보안
- PlayReady나 Widevine 등, 디바이스 내에서 복호화 및 권한 검증을 위한 보안 실행 환경을 제공한다.
클리어링 하우스(Clearing House)
- 저작권 사용 내역 기록 및 정산
- 사용 내역을 수집해 과금하고, 저작권자에게 수익을 분배한다.
DRM의 흐름
- 컨텐츠 제작자가 컨텐츠를 등록
- 패키저가 암호화 및 포맷 변환
- 컨텐츠 서버에 업로드
- 사용자가 접근 시, 인증/권한 확인 후에 라이센스 서버/키 서버로부터 해독 키를 받음
- DRM 클라이언트에서 복호화 및 재생
- 사용 이력은 클리어링 하우스로 전송되어 과금/정산을 처리
도커(Docker)
어플리케이션의 실행 환경을 하나의 박스로 포장해서 어떤 기기에서든 동일하게 실행할 수 있게 해주는 도구이다.
개념
- 이미지(Image): 실행할 앱과 환경이 담긴 설치 패키지
- 컨테이너(Container): 이미지가 실제로 실행되는 격리된 실행 환경
- 도커 파일(Docker File): 이미지를 만들기 위한 설정 파일(레시피)
- 도커 허브(Docker Hub): 이미지들을 공유하는 공식 저장소
장점
- 특정 기기에서만 실행되는 환경 차이를 제거
- 기존 가상 머신보다 훨씬 빠르고 자원을 적게 사용
- 리눅스, 윈도우, 맥 등 어디서나 동일하게 실행
- CI/CD 파이프라인에 용이
스크레파이(Scrapy)
웹사이트에서 데이터를 자동으로 크롤링하고, 구조화된 데이터를 수집하는 파이썬 기반 프레임워크이다.
특징
- 파이썬으로 작성되어 학습이 쉽고 활용도가 높다.
- 비동기 처리로 여러 페이지를 동시에 요청 가능
- 텍스트, 이미지, 링크 등 정형화된 데이터를 추출 가능
- 수집 => 정제 => 저장까지 한번에 처리 가능
- 프로젝트 단위로 크롤러를 만들어 재사용 가능한 구조를 띔
IPC(Inter-Process Communication)
운영체제에서 여러 프로세스가 서로 데이터를 주고 받기 위해 사용하는 방법이다.
주로 백엔드 서버와 브라우저가 서로 데이터를 주고 받거나, 고속 계산 시스템에서 병렬로 작업할 때 사용된다.
방식
- 파이프(Pipe): 한쪽에서 쓰고, 한쪽에서 읽는 단방향 통신이다.
- 익명 파이프(FIFO): 명명된 파이프는 파일처럼 경로가 있어 다른 프로세스 간 통신이 가능하다.
- 메세지 큐(Message Queue): 메세지를 큐 형태로 저장해서 순서대로 주고받는다.
- 공유 메모리(Shared Memory): 프로세스들이 같은 메모리 공간을 공유해서 가장 빠르게 통신이 가능하다.
- 소켓(Socket): 네트워크를 통해 여러 기기와 통신이 가능하다.
- 세마포어(Semaphore): 자원 접근을 제어하는 동기화 도구이다.
C언어 출력 문제
#include <stdio.h>
void main() {
int i, j;
int a[3][2] = {{1, 2}, {3, 4}, {5, 6}};
int sum = 0;
for (i = 0; i < 3; i++) {
for (j = 0; j < 2; j++) {
sum += a[i][j];
}
}
printf("%.2f", (float)sum / (3 * 2));
}
이중 for문을 사용해 [0][0]부터 마지막 인덱스인 [3][2]까지 모든 값을 더하는 문제이다.
1+2+3+4+5+6 = 21로 sum값은 21이지만 출력 값에 sum을 6으로 나눈 값을 소수 2자리까지 작성해야 한다.
21/6은 3.5이며 2자리까지 작성하면 3.50이 된다.
'정보처리기사' 카테고리의 다른 글
정처기 공부 04/07 (2) | 2025.04.08 |
---|---|
정처기 공부 04/06 (0) | 2025.04.06 |
정처기 공부 04/03 (0) | 2025.04.04 |
프로그래머스 간단한 논리 연산, 정처기 학습 (0) | 2025.03.29 |
정처기 공부 (0) | 2025.02.08 |