컴퓨터 라는 세상이 있으면, 그 컴퓨터 안에 아바다 대상을 프로세스라고 하고, process를 keyboard 및 mouse로 조작하게됨. 그리고 그 프로세스에 접속하기위해 Login 이라는 과정을 거침.로그인 프로세스는 아이디 및 패스워드를 검증하여 쉘(탐색기) 프로세스를 실행시켜 줌. 이때, 관리자 권한을 가진 id로 로그인을 할 경우 방금 쉘 프로세스에 그에 맞는 권한을 부여해준다. 쉘을 통해 명령을 입력하여 실행할 경우, 또 하나의 프로세스를 생성 및 실행하게되는데,이때, 해당 프로세스를 자식 프로세스라 하며, 자식 프로세스는 특별한 이유가 없다면, 권한을 부모로부터 상속받는다.즉, 나로 식별되는 프로세스로 시스템 내부에 각종 프로세스며 관리자 권한까지 있을 경우, 데몬 및 서비스 그리고 각종 ..
32bit App -> VMS: 4GB -> User: 2GB(0.2xx: OS, 실사용: 1.7xxx), Kernal: 2GB 데이터 영역: stack(rw-)/heap(rw-)/정적(rw-: 전역 변수 / r-- : 문자열 상수) -> 실행 권한 없음코드 영역: r-x"Hello world" 이런 문자열 상수가 기록될 때는 실행파일 소관으로 들어감. -> .exe 파일에 기재가 되고 문자열이 저장되는 읽기 전용 정적 공간 메모리 공간에 저장됨. 물론 기본적으로 권한이 저렇게 설정되어있지만, 본인이 개발한 것이라면 권한을 변경할 수도 있다. 데이터 영역의 권한에 실행 권한을 추가한다거나, 코드 영역에 쓰기 권한을 추가한다는 등 말이다. 그러나 데이터 영역이 실행권한이 생겨 버리면 보안 사고가 일어날 ..
VMS: 각 배열 요소의 크기가 1바이트 크기인 42.9..억 개의 선형 배열이라고 생각하면 편함페이지가 뭔지 간단하게 말하면, 32비트 및 windows 운영체제 기준으로 할 때 0번지부터 시작해서 0xFFFFFFFF 까지 주소 번호를 가진 메모리 공간이 있을텐데, 0번지부터 4095번까지의 4KB 크기 공간이 보통 page 하나이다. 딱히 뭔가를 건드리지 않다면 말이다. 이러한 페이지 단위로 가상 주소 공간을 나누과, 물리 주소 공간을 각 프레임 단위에 동일한 크기로서 매핑하게 된다. 이 또한 크게 뭔가를 건드리지 않는 조건에서 말이다. 그리고 특정 페이지 단위에서 얼만큼 떨어진 곳에서의 메모리 값이 특정 물리 메모리의 프레임에서의 특정 얼만큼 떨어진 곳을 가리킨 곳이 매핑 되게끔 한다. 얼만큼 떨어..
컴퓨터에서 말하는 메모리란 크게 2가지 종류가 있다. RAM 그리고 HDD(SSD) 이다. 1차적으로 RAM 메모리를 주로 사용하고, HDD(SSD) 를 swap 형태로 이용하여 2차적인 메모리로 활용을 한다. 그런데 만약 sw 를 구현할 때 이 메모리들 자체에 의존성을 갖게된다면, 어떻게 될까 제품마다 혹은 크기에 따라서 코드를 그때마다 바꿔줘야한다. 그러나 범용 OS 라는게 등장하면서 가상화된 체계 위에서 SW를 돌리다 보니 그럴 필요성이 많이 줄어들었고,이때 필요한 것이 바로 가상 메모리이다.가상 메모리 덕분에 위에서 말한 장치적 의존성 특히나, 메모리 의존성을 없애준다는 것도 한 몫하지만, 관리적 차원에서 높은 추상성을 제공해줌으로써 접근 제어 측면에서 보안성 또한 챙길 수 있게된다.메모리의 관리..
정의부모 클래스에서 구현해야할 객체의 단계를 전체적으로 정의한다음, 자식 클래스마다 달라지는 단계에 대해서만 부모 클래스단에서 추상 메서드로 정의하여 자식클래스가 해당 메서드를 오버라이드할 수 있게 하는 패턴목적비슷한 개념을 가진 객체들의 중복되는 코드는 부모클래스에서 정의하기에 코드 길이가 줄어들며, 관리하기가 용이하다.해당 패턴을 사용하지 않을 경우class Coffee { fun make(): List { val result = mutableListOf() result.add("물을 끓입니다.") result.add("커피 원두를 내립니다.") result.add("컵에 따릅니다.") result.add("설탕과 우유를 넣습니다."..
정의 상태를 관리하는 Subject 객체가 자신을 구독한 Observer 객체들의 참조를 보관하고 있다가, 상태가 변경되면 등록된 Observer들의 공통 알림 메서드를 호출하여 변경 사실이나 변경된 데이터를 전달하는 행동 패턴목적Observer 패턴을 씀으로서 알림을 주는 객체는 마치 구독자 관리 시스템처럼 알림을 받는 대상의 참조값과 알림 기능의 호출 method만 가지만 된다.알림을 받는 객체는 알림을 주는 객체에게 알림을 받겠다고 요청만 하면, 알림을 주는 객체는 알림을 받겠다는 객체의 참조값만을 저장하고 관리하여 해당 객체들에게만 알림을 주는 함수를 호출하면 알림을 받는 객체들에게만 알림을 줄 수 있다. 코드전체 코드package designpatterninterface Observer { ..
정의프로그램 전체 관점에서 특정 클래스의 객체를 하나만 생성하고 그 하나의 객체를 여러곳에서 공통으로 사용하도록 하는 패턴해당 패턴은 특히 예외적으로 특정 언어 플랫폼에 따라서 구현법이 달라진다. 목적설정관리자, 로그 관리자, 캐시 관리자처럼 여러 객체를 두어 따로 존재할 필요없이 한 곳에서만 집중 관리가 필요한 경우생성자 호출하여 객체를 여러개 생성하여 필수 설정 내용이 각 객체마다 따로 관리되어 달라진다.프로그램 전체에서 동일한 설정을 요한다면 문제가 된다. 코드object ConfigManager { var timeout = 30 fun printConfig() { println(timeout) }}코틀린에서는 보통 object 문법을 활용하여 싱글톤 패턴을 구현한다.코..
정의빌더 패턴은 최종 객체 생성에 필요한 여러 설정값을 Builder 객체에 임시로 저장한 뒤, 그 설정값을 바탕으로 최종 목적 객체를 생성하는 패턴이다. 필요한 이유class Computer( val cpu: String, val ram: Int, val storage: Int, val gpu: String?, val wifi: Boolean, val bluetooth: Boolean)val computer = Computer("Intel i7", 32, 1000, "RTX 5070", true, true)각 값이 무엇인지 코드만 보고 바로 구분하기 힘들며, 매개 변수 순서도 틀릴 가능성 존재한다.(가독성 문제)선택항목이 많아지면 필요없는 값까지 어쩔 수 없이 null,..
정의공통된 업무 흐름은 부모 클래스에 두고, 해당 공통 업무 흐름 부분에서 객체 종류에 따라 달라지는 생성 부분은 자식 클래스가 부모의 팩토리 메서드를 오버라이하여 결정하는 디자인 패턴이다 필요한 이유abstract class Logistics { abstract fun deliverSequence()}class RoadLogistics : Logistics() { override fun deliverSequence() { checkOrder() prepareCargo() Truck().deliver() sendNotification() }}class SeaLogistics : Logistics() { override fun deli..
Git 이란분산 제어 버전 시스템이다.분사 제어 버전 시스템이란 전체 저장소의 로컬 복사본을 모든 팀 구성원의 컴퓨터에 저장한 다음, 로컬에서 커밋 분기 병합할 수 있도록 한 시스템이다.그래서 서버와 클라이언트간 동기화 한다는 느낌이고, 물리적 파일들 모두 동기화할 때 해당 파일들을 object 폴더 아래 저장 관리한다. Branch(분기)코드를 통쨰로 복사하고 원래 코드와는 상관없이 독립적으로 개발을 진행하는 것을 말한다.예를 들어, 개발자 2가 파일 2와 파일 4에 기능 추가 기능 및 수정한다고 하면 마스터 브랜치에서 새로운 브랜치를 생성한 다음 파일 2와 4를 추가 및 수정한다.(파란색 부분 Feature-2) 이때, 개발자 2이 건드는 작업은 서버에 저장된 원래 코드에 아직 반영되지 않았다.보라색..

