2026/04 13

[컴퓨터네트워크/Computer Network] 파일 분배 : client-server vs. P2P

이번 글에서는 client-server 와 P2P의 파일 분배에 대해서 알아보고자 한다.어려운 개념은 아니지만 컴퓨터 네트워크 과목을 수강하면서 이 부분이 은근히 이해가 안 갔다. 이 글에서 핵심 질문은 다음과 같다.인터넷에서 파일을 다운로드할 때, 사람이 많아지면 느려지는 게 당연할까? 네크워크의 client-server와 P2P(Peer-to-Peer) 방식의 차이에 대해 알아보고자 한다."누가 일을 도와주는가" 가 핵심이다. 비유를 통해 알아보자.여기서 사용할 단위는 다음과 같다. F (File): 나눠줄 파일의 크기 (피자 한 판)u (Upload): 파일을 보내는 속도 (서빙 속도)d (Download): 파일을 받는 속도 (먹는 속도)N (Number): 파일을 받으려는 사람 수 (손님 수)C..

CS/Computer Network 2026.04.20

[프로그래밍 언어론/Programming Language] 정규 표현식(Regex)이란?

정규 표현식을 정리한 글은 굉장히 많지만, 공부한 것을 쉽게 정리해보려고 한다. 정규 표현식(Regular Expression)정규 표현식은 검색에서 문자열을 일치시키는 데 사용되는 특수 문자 패턴을 말한다.UNIX 환경의 편집기나 각종 유틸리티(grep, sed, awk 등)에서 텍스트를 효율적으로 다루기 위해 필수적인 개념이다. 정규 표현식은 메타문자(Metacharacters)라고 불리는 기호들을 조합하여 복잡한 문자열 규칙을 정의하는 것이다.규칙을 정의한 것인데 사용하는 환경에 따라서 표기법 버전이 다를 수 있어서 사용 전 확인이 불가피하다. 우리는 정규 표현식을 쉽게 찾아볼 수 있다.가장 대표적인 활용 사례는 이메일 검증 정규식이다.^[a-zA-Z0-9_.±]+@[a-zA-Z0-9-]+\.[a-..

[소프트웨어공학/Software Engineering] 형상 관리(CM: Configuration Management)란?

이번 글에서는 소프트웨어 공학에서 말하는 형상 관리에 대해 알아보고자 한다. 소프트웨어 시스템은 개발과 사용 중에 끊임없이 변경된다. 시스템 요구사항이 변경되고 시스템의 새로운 버저네서 이런 변경이 구현되어야 한다는 것이다. 하드웨어가 변경되면 소프트웨어가 변경되어야 한다. 경쟁사가 새로운 기능을 도입하면 그것에 대응해야 하는 것도 포함이다. 그렇기 때문에 대부분의 시스템은 버전들의 집합(set)으로 생각될 수 있으며, 각각의 버전들은 유지되고 관리되어야 한다.형상 관리형상 관리(CM : Configuration Management)는 변화하는 소프트웨어 시스템을 관리하기 위한 정책, 프로세스, 그리고 도구들과 관련된다. 각각의 시스템 버전에 어떤 변경들이 있고 컴포넌트 버전들이 포함되어 있는지를 놓치기..

[컴퓨터네트워크/Computer Network] DNS란?

지난 글에서는 애플리케이션 계층의 TCP와 UDP의 소켓 프로그래밍에 대해 정리하였다.이번에는 Domain Name System이라고 알려져있는 DNS에 대해 정리해보고자 한다. DNS (Domain Name System)우리는 DNS를 익히 알고 있다. DNS라는 명칭은 몰라도 매일 마주한다.예를 들어서 우리는 브라우저에 google.com 같은 주소를 입력한다.하지만 컴퓨터는 0과 1로 이루어진 형태만 이해할 수 있지 이러한 문자 형태의 주소는 이해할 수 없다. 컴퓨터는 IP 주소라고 하는 형태만 이해 가능하다.그렇다면 우리는 아래와 같은 의문이 생기게 된다.사람이 이해하는 주소를, 컴퓨터가 이해하는 주소로 누가 바꿔주는 걸까? 이 역할을 하는 것이 DNS이다. DNS(Domain Name Syste..

CS/Computer Network 2026.04.14

[컴퓨터네트워크/Computer Network] 소켓 프로그래밍이란?

이번 글에서는 Application Layer에서 이루어지는 소켓 프로그래밍(Socket Programming)에 대해서 알아보고자 한다.소켓을 이용하여 커뮤니케이션 하는 클라이언트와 서버 애플리케이션을 어떻게 만들 수 있는지에 대해 집중적으로 공부하고자 한다. Socket (소켓)소켓이란 애플리케이션 프로세스와 end-end transport 프로토콜 사이의 문(door)이다.즉, 네트워크상에서 프로세스 간 데이터를 주고받기 위한 실제적인 창구(해당 글에서는 door라고 함)라고 볼 수 있다. Socket programming소켓 프로그래밍에는 두 가지 유형이 있다.TCP : 신뢰할 수 있는 바이트 스트림(byte stream) 지향UDP : 신뢰할 수 없는 데이터그램(datagram)응용 예시:1...

CS/Computer Network 2026.04.12

[소프트웨어공학/Software Engineering] 객체지향과 인터페이스

지난 글에서는 다형성에 대해 예제 코드와 함께 알아보았다.이번에는 객체지향에 관한 마지막 내용을 정리해보고자 한다. 객체지향의 장점1. 비용 절감재사용 가능한 컴포넌트를 활용하여 개발 시간 감소2. 소프트웨어 품질 향상캡슐화 + 다형성 을 통한 높은 모듈화시스템 간 결합도 감소3. 유지보수 용이성변경이 필요한 부분이 제한된다.확장과 수정이 쉽다.4. 설계와 구현의 연결성분석 → 설계 → 코드로 자연스럽게 이어진다.Abstract Class vs. InterfacePure Virtual Functionvirtual int getSalary() const = 0;구현이 없는 함수반드시 subclass에서 구현해야 함Abstract Class (C++)하나 이상의 pure virtual function 포함객..

[소프트웨어공학/Software Engineering] Polymorphism 다형성

지난 글에서 밝혔던 바와 같이 이번 시간에는 polymorphism에 대해서 알아보려고 한다. Polymorphism다형성이라고 하며, 하난의 메시지에 대해 서로 다른 객체가 서로 다른 방식으로 응답할 수 있는 기능이다.메시지를 보내는 객체는 어느 객체가 받을지 알 필요가 없다.one interface, multiple implementations연산 오버라이딩(상속) + 동적 바인딩 을 통해 구현된다.클래스 차원의 encapsulation(캡슐화)를 구현한 구조이다.superclass가 subclass들을 encapsulation 한다.메시지를 보내는 객체는 그 component 중에서 superclass의 interface만 알고 있으면 된다.내부의 상속 구조에 대해 전혀 알 필요가 없다. (누가 누..

[소프트웨어공학/Software Engineering] 객체 지향이란?

이번 글에서는 객체지향의 개념에 대해서 정리하고자 한다.객체지향의 개념에는 Abstraction(추상화), Encapsulation(캡슐화), Inheritance(상속), Polymorphism(다형성) 이 있다, 다형성 같은 경우는 예시 코드와 함께 다음 글에서 살펴보도록 하자. 객체 지향의 등장 배경 및 목적SW modulization (소프트웨어 모듈화)HW의 부품처럼 SW도 모듈화해서 각 모듈이 서로 독립적으로 동작하도록 설계하였다.개발과정전체 기능을 모듈 단위로 분해 → 각 모듈의 인터페이스 정의 → 각 모듈 독립적 개발 → 통합서로 간의 의존성을 획기적으로 감소시킨다.재사용, 유지보수 및 코드 분석이 용이하다.여기서 말하는 module(모듈)은 SW 설계에서 독립적인 기능 및 개발 단위를 말..

[프로그래밍 언어론/Programming Language] flex & bison 으로 파서 만들기

프로그래밍 언어를 처리하는 과정에서 가장 중요한 단계 중 하나는 입력을 분석하는 것이다.이때 입력을 의미 있는 단위로 나누고, 문법에 맞게 해석하는 과정이 필요하다.이벌 글에서는 flex와 bison을 활용한 파서 생성 과정을 단계별로 정리해보고자 한다. 1. flex란 무엇인가?flex는 어휘 분석기(Lexical Analyzer)를 생성하는 도구이다.즉, 입력 문자열을 읽어서 다음과 같은 과정을 수행한다.문자열을 lexeme(어휘 단위)로 분해각 lexeme을 토큰(token)으로 변환예를 들어:input: a = b + 3 → 토큰 단위로 분해ID(a), ASSIGN, ID(b), PLUS, NUMBER(3) 이 과정이 바로 lexical analysis이다. 2. flex 파일 구조 (.l)fle..

[소프트웨어공학/Software Engineering] 애자일 소프트웨어 개발

이번 글에서는 애자일 소프트웨어 개발에 대해서 정리하고자 한다. 우선 다루는 주제는 아래와 같다.Agile development (애자일 개발)Extreme Programming (XP)Aglie vs. Plan-driven올바른 소프트웨어 프로세스 모델 선택애자일 개발배경소프트웨어 프로세스의 과도한 오버헤드에 대한 불만이 있었다.목표과도한 재작업 없이 변화하는 요구사항에 빠르게 대응하여 시스템 전달 시간을 줄이는 것을 목표로 둔다.아래는 Plan-driven과 Agile development 방식에 대한 도식화 그림이다.Agile 개발특징점진적 개발여러 버전/증분으로 개발소규모.빈번한 릴리즈반복적 접근고객 참여팀과의 지속적 협업문서화로 프로세스 오버헤드 감소적용성소규모, 한 장소에 모인 팀맞춤형 개발에..