글을 쓰기에 앞서 소켓이란 해당 식별자를 가지는 열린 파일이라는 것을 알아두고 가자. Host IT 분야에서는 호스트란 네트워크에 연결되어 있는 컴퓨터들이다. 인터넷은 TCP/IP 프로토콜을 이용하여 통신을 하는데, 통신을 하려고 해도 목적지와 출발지가 없으면 어디로 데이터를 보낼지 받을지 모른다. 따라서 IP라는 고유한 주소를 통해 목적지와 출발지를 구할 수 있으며 , 이때 호스트는 IP 주소를 갖는다. 즉, 호스트는 IP를 가지고 있는 양방향 통신이 가능한 컴퓨터라는 점을 기억하자. URL, URI 결론부터 말하면 URI는 자원의 위치이고, URL은 자원의 식별자이다. 쉽게 얘기하면 우리가 주소창에 입력하는 전체 주소는 사실 URL이 아니고 URI이다. 즉, URI가 더 큰 범주이고, URL은 그 범..
가상 메모리 시스템에서는 각 프로그램이 가상의 주소를 사용하도록 하며, CPU가 메모리 참조를 시도할 때는 MMU(Memory Management Unit)이라는 하드웨어 장치를 이용하여 해당 가상 주소(Virtual Address)를 실제 메인 메모리의 물리 주소로 변환하여 메모리 참조를 진행한다. 그렇다면 가상 메모리 기술은 왜 사용하는 것일까? 그 이유는 크게 3가지로 나눠서 생각해볼 수 있다. (Caching, Memory Management, Memory Protection). 메인 메모리를 효율적으로 사용하기 위해서. 가상 메모리 시스템에서는 각 프로그램이 사용하는 가상 주소 공간을 우선 디스크에 저장해두고, 그 중에서 자주 사용되는 부분만 메인 메모리로 가져와서 사용한다. 즉, 메인 메모리를..
프로세서에서 전력이 공급된 시점부터 전력 공급이 끊기는 시점까지 PC는 다음과 같은 값들을 갖는다. a는 명령어 I의 시작 주소를 의미한다. 이와 같이 실행하는 명령어에 따라 PC의 값이 변해가는 흐름을 제어 흐름(Control Transfer)라고 부른다. 제어 흐름의 양상은 크게 3종류이다. 메모리에 연속적으로 할당되어 있는 명령어들을 순차적으로 실행하는 경우. 이 경우는 가장 기본적이면서 대부분의 시간을 차지하는 제어 흐름에 해당한다. 프로그램 변수로 표현되는 프로그램 상태의 변화에 반응하여 제어 흐름이 갑자기 바뀌는 경우. 대표적으로 jump, call, return 등의 명령어를 수행하는 경우가 이에 해당한다. Exceptional Control Flow(ECF). 이는 시스템 상태의 변화에 반..
링킹은 여러 개의 코드와 데이터를 모아서 연결하여 메모리에 로드될 수 있고, 실행될 수 있는 한 개의 파일로 만드는 작업이다. 링킹은 컴파일 시에 수행할 수 있으며, 이때 소스코드는 머신코드로 번역된다. 프로그램이 메모리에 로드되고, 로더에 의해서 실행될 때에는 로드 타임에, 응용프로그램에 의해서 심지어 실행시에도 수행될 수 있다. 현대 시스템에서 링킹은 링커라고 부르는 프로그램에 의해서 자동으로 수행된다. 링커는 독립적인 컴파일을 가능하게 만든다. 즉, 큰 규모의 응용 프로그램을 한개의 소스 파일로 구성하는 대신 별도로 수정 및 컴파일할 수 있는 보다 유지보수에 용이한 더 작은 모듈로 나눌 수 있다. 이러한 링커를 배워야 하는 이유는 대략적으로 다음과 같다. 링커가 참조를 해결해 나가는 방법, 라이브러..
x86-64 스택 스택은 stack displine에 의해 관리되는 메모리 영역을 말한다. stack discipline이란 말그대로 스택을 관리하기 위한 일종의 규율과 같은 것이다. 스택은 %rsp 레지스터가 현재 스택의 가장 낮은 주소(top)을 저장하기로 되어있다. 또한 스택에 데이터가 쌓일 때는 낮은 주소 방향으로 쌓이도록 약속이 되어있다. 따라서 데이터를 push 할 때는 %rsp 의 값을 8만큼 감소시켜야 하고, 데이터를 pop할 때는 %rsp 의 값을 8만큼 증가시켜야 할 것이다. x86-64 리눅스 스택 프레임은 Caller의 스택 프레임이 저장하는 데이터를 push하는 순서대로 나열하면 기존 %rbp, 백업된 레지스터들의 값, 지역 변수들. 즉, 자기 자신의 지역 데이터를 의미하는 값들과..
객체 지향으로 가야하는 이유 객체지향 개발 방법은 안정적인 구조에 변경이 빈번하게 발생하는 기능을 종속시키는 지도의 방법과 유사하다. 이것이 객체지향이 과거의 전통적인 방법보다 범용적이고, 재사용성이 높으며, 변경에 안정적인 이유다. 성공적인 소프트웨어들이 지닌 공통적인 특징 훌륭한 기능이 훌륭한 소프트웨어를 만드는 충분조건이라고 한다면, 훌륭한 구조는 훌륭한 소프트웨어를 만들기 위한 필요조건이다. 성공적인 소프트웨어들이 지닌 공통적인 특징은 훌륭한 기능을 제공하는 동시에 사용자가 원하는 새로운 기능을 빠르고, 안정적으로 추가할 수 있다는 것이다. 미래에 대한 대비 미래의 변경을 예측할 수는 없다. 단지 대비할 수 있을 뿐이다. 미래에 대비하는 가장 좋은 방법은 변경을 수용할 수 있는 선택의 여지를 설계..
비즈니스 요구사항 영화관에 입장하는 관객의 초대권을 확인하고, 만약 초대권이 없다면 티켓 구매 후 입장을 시키고, 초대권이 있다면 티켓으로 바꿔준 후 입장 시킨다. 객체 지도 설계 객체와 자료 구조 객체 : private 형식의 변수와 함수가 존재하는 클래스 자료 구조 : public 형식의 변수만 가지고 있고, 함수가 없는 클래스 변수를 private 접근 제한자로 선언하는 이유는 남들이 변수에 의존하지 않게 만들고 싶어서이다. 그런데 웃긴점은 우리는 자연스럽게 getter/setter 함수를 public 하게 선언하여 외부에 노출한다. 과연 이것이 맞는것일까? OOP 스러운 클래스는 추상 인터페이스를 제공해 클래스의 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야하는 것이 진정한 의미의 클래..
의미있는 이름(Meaningful Names) 독자의 입장에서 고려하자. gubun, gbn, sabun, yuji 등 변수명만을 보고 어떤 데이터를 저장하고 있는지 예측이 되는가? 첫 번째 규칙: 의도를 분명히 밝혀라. 코드의 저자의 의도가 명확하게 파악된다. 코드가 위에서 아래로 술술 읽힌다. 코드의 맥락이 명시적이다. 두 번째 규칙: 그릇된 정보를 피하라. 세 번째 규칙: 의미있게 구분하라. 네 번째 규칙: 발음하기 쉬운 이름으로 정하자. 다섯 번째 규칙: 검색하기 쉬운 이름을 사용하자. 로그 검색 용이성 여섯 번째 규칙: 타입과 관련된 문자열을 넣지 말아라. 일곱 번째 규칙: 한 개념에 한 단어를 사용하라. 일관성있는 어휘를 선택해서 이름을 붙이자. ex) Controller-fetch, Serv..
객체지향의 기본 개념은 책임을 수행하는 자율적인 객체들의 협력을 통해 애플리케이션을 구축하는 것이다. 그리고 객체지향 애플리케이션의 중심 사상은 연쇄적으로 메시지를 전송하고, 수신하는 객체들 사이의 협력 관계를 기반으로 사용자에게 유용한 기능을 제공하는 것이다. 클래스는 객체의 속성과 행위를 담는 틀일 뿐이다. 객체지향 패러다임으로의 전환은 시스템을 정적인 클래스들의 집합이 아니라 메시지를 주고받는 동적인 객체들의 집합으로 바라보는 것에서 시작된다. 따라서 객체지향 설계의 중심에는 메시지가 위치한다. 객체가 메시지를 선택하는 것이 아니라 메시지가 객체를 선택하게 해야 한다. 메시지가 객체를 선택하게 하려면 메시지를 중심으로 협력을 설계해야 한다. 결과적으로 메시지가 수신자의 책임을 결정하며, 메시지를 먼..
추상화 추상화란 복잡한 현실을 단순화하기 위해서 사용하는 인간의 가장 기본적인 인지 수단이라고 할 수 있다. 이에 모든 추상화의 목적은 복잡성을 이해하기 쉬운 수준으로 단순화하는 것이다. 그리고 복잡성을 다루기 위해 추상화는 두 차원에서 이루어진다. 첫 번째 차원은 구체적인 사물들 간의 공통점은 취하고, 차이점은 버리는 일반화를 통해 단순하게 만드는 것 두 번째 차원은 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것 객체지향 페러다임은 객체라는 추상화를 통해 현실의 복잡성을 극복한다. 그리고 객체지향 패러다임을 이용해 유용하고 아름다운 애플리케이션을 개발위해 추상화의 두 차원을 올바르게 이해하고 적용해야 한다. 객체: 명확한 경계를 가지고 서로 구별할 수 있는 구체적인 ..