본문 바로가기

Computer Science/기타

(9)
비동기와 동기화 - 비동기 카페 주문 구현 (Java) 안녕하세요, 이번 포스팅은 생소하지만 아주 중요한 내용인 비동기/동기의 개념, 그리고 동기 처리 대비 효율적이라는 비동기 처리의 장점과 그렇지만 공유된 자원에 동시 접근하기 때문에 생길 수 있는 부작용에 대해 알아보겠습니다. 그리고 비동기 처리의 부작용을 해결할 수 있는 동기화(Synchronization) 방법에 대해서도 알아보겠습니다. 내용을 살펴보면 처음보신다면 좀 생소하고 헷갈립니다. 프로그래머들이 편하게 비동기와 동기화를 사용할 수 있도록 자바에서도 묶어서 구현해놓은 인터페이스가 존재하는데요, 바로 CompletableFuture라는 API입니다. 이에 대해서도 중요한 메서드들과 내부 구현을 살펴보겠습니다. 마지막으로 API를 사용해서 비동기로 주문을 처리하는 카페를 구현해하면서 실제로 어떻게 ..
객체지향 설계, UML 다이어그램 - 콘솔 체스 구현하기 (Java) 이번 포스팅의 주제는 콘솔 체스 구현하기입니다. 복잡한 체스 룰을 조금 간략화시켰고, UI부분은 콘솔 출력으로 대체했습니다. 들어가기 앞서서, 설계의 중요성은 말 안해도 누구나 다 아실겁니다. 저도 마찬가지로 일단 돌아가게만 구현을 했다가 리팩토링 과정에서 한줄한줄 찾아가면서 코드를 고치면서 생산성이 많이 떨어진다는 느낌을 받았던 경험이 있는데요, 그래서 저도 이번에는 설계를 가능한 범위까지하고, 구현을 하면서 설계를 보완해나간다는 목표를 잡았습니다. 설계를 잘 할 수 있도록 도와주는 툴이 있는데요, 테스트 코드 작성과 UML 모델링 언어입니다. 흔히 TDD라고도 말하는, 테스트 주도 개발 방법론입니다. 테스트 코드 작성을 선행으로 전체적인 그림을 그린 후에 구현하는 방법인데, 이 방법은 사실 저도 실천..
함수형 프로그래밍 기초 - 재귀, 카테고리 이론, 모나드(Monad), 고차 함수(Java) 함수형 프로그래밍 기초 저번 포스팅에서 함수형 프로그래밍이란 무엇인지, 함수형 프로그래밍의 주요 개념인 불변성, 참조 투명성 등을 알아보았구요, 람다 함수의 기반을 이루는 람다 대수가 무엇인지 알아보았습니다. 그리고 JAVA에서 함수형 프로그래밍을 구현하는 방법인 함수형 인터페이스에 대해서도 간단히 살펴보았습니다. 자세한 내용은 아래 포스팅을 확인해주세요. https://porolog.tistory.com/19#comment17080166 함수형 프로그래밍 입문 with 람다 대수, 함수형 인터페이스 (Java) 함수형 프로그래밍? 오늘은 함수형 프로그래밍에 대해 알아보겠습니다. 함수형 프로그래밍? 함수로 만들면 함수형 아닌가? 절차지향형 프로그래밍에서는 함수를 사용하니까 지금껏 해왔던게 porolog...
오토마타 이론과 Parser의 원리 - HTML Parser 만들기 (Java) 이번 포스팅에서는 비교적 간단한 HTML, XML 문서가 어떻게 파싱되는지 알아보겠습니다. 그 전에 XML, HTML이 무엇인지부터 알아야합니다. XML, HTML을 파싱한 결과물인 DOM의 구조에 대해서도 살펴보겠습니다. HTML, CSS, Javascript 코드는 웹 페이지를 구성하는데요, HTML을 파싱하여 생성된 트리 자료구조를 DOM, CSS를 파싱하여 얻은 자료 구조를 CSSOM, JS 코드는 AST라고 합니다. DOM, CSSOM, AST로 웹브라우저에 화면이 렌더링되는 과정을 살펴보면서 컴파일링 이론을 왜 배워야하는지 생각해보겠습니다. 좀 더 나은 이해를 돕기위해 위의 DOM, 그리고 컴파일러 이론의 기반을 이루는 오토마타 이론을 간단히 알아보고, 이를 바탕으로 간단한 HTML Parse..
함수형 프로그래밍 입문 with 람다 대수, 함수형 인터페이스 (Java) 함수형 프로그래밍? 오늘은 함수형 프로그래밍에 대해 알아보겠습니다. 함수형 프로그래밍? 함수로 만들면 함수형 아닌가? 절차지향형 프로그래밍에서는 함수를 사용하니까 지금껏 해왔던게 함수형 프로그래밍이군? 이라고 생각할 수 있습니다.(정확히는 제가 그렇게 생각했습니다..) 먼저 정의부터 알아보겠습니다. 함수형 프로그래밍이란? 하나의 프로그래밍 패러다임으로 정의되는 일련의 코딩 접근 방식 자료처리를 수학적 함수의 계산으로 취급, 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임을 의미 자바는 객체지향 언어입니다. 객체를 정의할 때 상태와 메서드가 결합되어있다는 점이 특징입니다. 절차지향형 언어와 달리 객체 지향 언어에서는 클래스의 서브루틴을 function이라고 부르지 않고 method(행위라고도 합니다)라고..
객체지향 설계 연습(SOLID, GRASP) - 좌표평면 도형 그리기 (Java) 들어가며 객체지향 언어인 자바를 사용할 때, 객체 지향 설계의 중요성에 대해 정말 많이 들었습니다. 그래서 책도 샀습니다. '객체지향의 사실과 오해'라는 책도 읽어보았고 앞으로 '오브젝트'라는 책도 읽어볼 예정인데요, 사실 책 한 권을 읽었음에도 아직 객체지향적으로 사고하고 구현하는 것이 익숙하지 않습니다. 그리고 설계를 했을 때 이 설계가 맞는 것인지에 대한 확신도 없습니다. 물론 설계에 정답은 없겠지만 오답은 존재한다고 생각하기에 이 구조가 좋은 구조인지에 대한 답을 얻기 위해 객체 지향 설계에 대한 이해도가 필요하다는 생각이 자주 드는 요즘입니다. 이번 포스팅의 주제는 따라서 1. 기본 용어 정리 2. 객체 지향적 설계를 위한 5가지 원칙(SOLID) 3. GRASP 패턴 소개 4. 개념을 적용한 ..
프로세스의 메모리 영역 (Heap, Stack) 구현하기 (Java) 저번 포스팅에서는 16비트를 기반으로 한 CPU와 메모리의 프로토 타입을 간단하게 구현해보았습니다. 이번 포스팅에서는 운영체제와 연계하여 프로세스가 실행될 때, 가상 메모리 상에서 어떻게 메모리를 관리하는지 간단하게 구현을 통해 알아보도록 하겠습니다. 프로세스의 메모리 프로세스가 실행되면 운영체제는 프로세스에게 메모리 공간을 할당해주는데요, 물리적인 메모리가 아닌 가상 메모리에서 프로세스 별로 메모리를 관리하는 방식을 프로세스 메모리 구조 모델이라고 합니다. 가상 메모리(Virtual Memory)와 물리 메모리 사실, 가상 메모리는 이번 포스팅의 메인 주제는 아니지만, 프로세스의 메모리를 이해하기 위해 필요하므로 간단하게 알아보겠습니다. [물리 메모리] - 물리적인 메모리 그 자체를 의미합니다. RAM..
미니 16비트 CPU + 메모리 구현해보기 (Java) 안녕하세요, 오늘은 16비트의 CPU와 메모리를 간단하게 자바로 구현해보겠습니다. 구현에 앞서 CPU의 구조와 작동원리를 알아야겠죠. CPU의 기능 CPU는 명령어 인출과 해독을 모든 명령어에 대해 공통적으로 수행합니다. 그리고, 데이터 인출, 데이터 처리, 데이터 저장을 명령어에 따라 필요한 경우 수행합니다. 명령어 사이클의 각 개념은 아래와 같습니다. 명령어 인출 : 기억장치로부터 저장된 명령어를 읽어오는 과정 명령어 해독 : 수행해야할 동작을 결정하기 위해 명령어를 해독하는 과정 데이터 인출 : 데이터가 필요한 경우, 기억/입출력 장치로부터 데이터를 read 데이터 처리 : 데이터에 대한 산술,논리적 연산 수행 데이터 저장 : 처리 과정을 거쳐 얻어진 결과를 저장하는 과정 위 과정을 cpu는 clo..