분류 전체보기
[C++] Design Pattern
[C++] Design Pattern
2022.11.24클래스와 객체의 관계를 어떻게 구성해야 할까? 이런 상황에서 클래스는 어떻게 구성해야 할까? 위와 같이 자주 발생하는 문제에 대한 정리된 해결책을 디자인 패턴이라고 한다. 디자인 패턴은 문제 해결의 방법론이고, Paradigm에 맞춰서 정의된다. (함수형 언어의 paradigm, 객체지향 언어의 paradigm) 몇 가지 디자인 패턴에 대해 알아보자. Singleton 클래스가 하나의 인스턴스만을 가지도록 한다. 클래스의 생성자를 private 접근제어자로 정의하고, instance를 static 으로 정의해 어디서든지 해당 instance로 접근할 수 있되, 인스턴스의 생성은 단 한 번만 진행되도록 한다. Builder 복잡한 객체를 한 단계씩 생성한다. 생성해야 하는 객체가 복잡해지면 생성자로 넘겨야..
[JavaScript] function
[JavaScript] function
2022.11.231. function 키워드 자주 사용하는 방식이다. 2. Literal function 키워드로 함수를 정의한 후 해당 함수를 사용하는 경우가 많지만, 리터럴 방식으로도 함수를 정의할 수 있다. 리터럴 방식을 사용할 때는 익명 함수를 사용한다. x(4, 3) 을 실행 시 12를 반환한다. 3. Constructor 자바스크립트의 built_in 함수인 Function을 사용해 함수를 정의할 수 있다. 4. Self Invoking 정의 후 스스로를 호출한다. 재사용 할 수 없다. 5. lambda (arrow) 람다식을 사용해 함수를 간단하게 표현 할 수 있다. 인자가 하나면 괄호를 생략할 수 있지만 인자가 없거나 두 개 이상인 경우는 괄호를 생략할 수 없다. Hoisting 자바스크립트는 다른 언어와..
[C++] 정리 (1)
[C++] 정리 (1)
2022.11.231. cast / dispatch Dynamic cast / Dynamic dispatch Static cast / Static dispatch 제대로 정리하자. cast 는 형변환이고 dispatch는 함수 호출이다. static은 컴파일 시간이고 dynamic은 런타임 시간이다. 위의 부분을 제대로 짚고 다시 공부하자. 2. 함수, 메서드, 프로시저 셋 다 프로그램의 일부비슷한 의미라서.. 혼용해서 사용해도 괜찮다. 맥락에 따라 다르게 사용하기도 한다. 클래스 안에 있으면 메서드, 호출하는건 함수로 부른다. 함수와 프로시저는 같이 사용하는 편이다. (https://murphymoon.tistory.com/entry/%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80procedure-%E..
[JavaScript] Object
[JavaScript] Object
2022.11.22let something = { a : 'A', b : 'B', }; 원시 타입의 값들은 변경할 수 없지만, 객체는 변경할 수 있다. 객체는 위와 같이 프로퍼티 키와 프로퍼티 값들로 이루어져 있으며, 프로퍼티 값으로는 자바스크립트에서 사용하는 모든 값이 해당될 수 있다. (함수 포함) 자바와 C++같이 클래스를 중심으로 객체를 생성하고 인스턴스화하는 클래스 기반 언어들에 반해, 자바스크립트는 프로토타입 기반 객체지향 언어로서 자바와 C++과는 다른 방법으로 객체를 생성한다. let something = { a : 'A', b : 'B', }; console.log(something); console.log(something.a); console.log(something['a']); 위와 같이 객체 리터럴..
[C++] OOP (5) Dynamic dispatch / Multiple Inheritance
[C++] OOP (5) Dynamic dispatch / Multiple Inheritance
2022.11.22객체지향 언어에는 같은 signature를 가진 함수를 여러 개 정의할 수 있다. (signature 가 다르면 다른 함수이다) 이를 function overloading 이라고 부르고, 여러 함수 중 어떤 함수가 호출될지는 컴파일 시간에 정해진다. 여기까지는 지난번에 배웠고.. 이번에 살펴볼 function overriding 은 부모에서 정의된 함수를 자식이 새로 정의하는 작업이다. 함수를 사용할 때 어떤 함수가 불리는지는 런타임 시간에 정해진다. 즉, Dynamic dispatch를 사용한다. 런타임 시간에 불리는 함수가 결정되는 경우를 Dynamic dispatch 라고 부른다. 런타임 오버헤드가 있어 성능은 떨어질 수 있지만 코드를 훨씬 효과적으로 작성할 수 있어 상황에 맞춰서 사용한다. C++..
[HTML] API
[HTML] API
2022.11.15HTML이 제공하는 여러 API를 사용해 다양한 기능을 쉽게 구현하자. 사용하기 전 웹 브라우저가 API를 제공하는지 확인해야 한다. 1. Drag and Drop 사용자 인터페이스 중 Drag and Drop 이 있다. 구글 캘린더에서 일정을 등록할 때 사용하기도 하는데, API 를 사용하면 Drag and Drop 을 쉽게 구현할 수 있다. (https://www.w3schools.com/html/tryit.asp?filename=tryhtml5_draganddrop) 드래그 시작 시 dataTransfer 객체에 Text 형식의 id를 보낸다. 기본적으로 HTML에서는 다른 요소가 드랍되는걸 지원하지 않기 때문에 드랍 대상인 div 박스에서는 preventDefault() 메서드를 실행시킨다. 이미..
[시스템 프로그래밍] 시그널
[시스템 프로그래밍] 시그널
2022.11.14컴퓨터는 다수의 프로세스를 concurrent 하게 실행시킨다. 각각의 프로세스들이 OS에 의해 문맥이 전환되기 때문에 여러 가지 프로그램이 병행적으로 작동하는게 가능하고, 여기서 시그널이 사용된다. 시그널은 어떤 이벤트가 시스템에 발생했음을 프로세스에게 알려주는 메세지이다. 예외 상황과 인터럽트를 커널에서 추상화 한 개념이고, 커널을 통해 프로세스에게 전달된다. 각각의 시그널들은 정수 값의 아이디로 구분된다. SIGSEGV : 잘못된 주소로 접근했을 때 발생한다. SIGCHLD : 자식이 종료되면 부모에게 SIGCHLD가 보내진다. 커널은 목적지 프로세스의 컨텍스트 내부 상태를 갱신하는 방법으로 시그널을 목적지 프로세스에 보낸다. 무슨 소리인지 자세히 알아보자. 메모리에는 프로세스를 돌리기 위한 자료구..
[JavaScript] AJAX
[JavaScript] AJAX
2022.11.08Asynchronous JavaScript and XML 의 약자로, 비동기적으로 서버와 통신하는 방식을 의미한다. 지금까지는 서버로부터 정보를 전달받은 경우 페이지를 리로드해서 사용자에게 정보를 보여줘야 하지만, ajax 방식을 사용하면 페이지를 리로드 하지 않고도 정보를 보여줄 수 있다. 전체 페이지를 전부 다 로딩하지 않고 부분만 새로 로딩할 때 사용하는 방식이라고 생각하면 된다. 브라우저에서 이벤트가 발생하면 서버에게 HttpRequest를 전달한다. 서버는 받은 정보를 처리한 후 브라우저에게 처리 결과를 전달한다. 브라우저는 서버로부터 받은 정보를 바탕으로 자바스크립트를 사용해 해당되는 페이지를 업데이트한다. (https://www.w3schools.com/js/tryit.asp?filename..
[JavaScript] JQuery
[JavaScript] JQuery
2022.11.08제이쿼리는 자바스크립트 코드를 간결하게 축약시키 위해 사용된다. 제이쿼리를 사용해 작성된 코드는 어떤 브라우저에서도 동작함이 보장된다. 직접 다운로드해서 사용하는 방법과 구글 cdn을 사용하는 방법이 있는데, 구글 cdn을 사용하도록 하자. 이 방법이 로딩 시간을 더 짧게 만들어준다. 헤드 내부에서 스크립트를 정의할 때 위의 cdn을 사용하면 된다. selector 부분은 CSS 선택자 문법이 들어간다. selector 로 적용할 대상을 정하고, action() 으로 어떤 작업을 수행할 지 정한다. $(this).hide() : 현재 element를 숨긴다. $("p").hide() : p 태그를 숨긴다. 이런 식으로 자바스크립트만 사용 할 때 보다 훨씬 간결하게 사용할 수 있다. 아직 준비되지 않은 요..
[시스템 프로그래밍] 프로세스 (2)
[시스템 프로그래밍] 프로세스 (2)
2022.11.06fork() 함수가 실행되는 순간 프로세스가 복사된다. if(fork() == 0) 문장을 실행할 때 fork() 프로세스가 복사되고 복사되자마자 자식은 죽는다. 부모는 리턴값이 0이 아니기에 무한 루프에 빠진다. 어셈블리 부분을 살펴보자. 원래대로라면 부모는 무한 루프에 빠져 입력받을 수 없는 상태겠지만, 명령어 실행 시 &를 붙이면 백그라운드에서 실행하게 돼 명령어를 입력받을 수 있다. ps 명령어로 현재 돌아가는 프로세스를 확인했을 때 자식과 부모 모두 돌아가고 있음을 확인할 수 있다 (부모가 죽지 않아서 자식이 좀비 상태이다) 이후 kill 명령어로 부모를 죽이면 부모와 자식 모두 정리됨을 확인할 수 있다. 부모가 죽지 않으면서 자식이 정리되지 않는 경우가 문제가 되는데.. 이 경우 wait 함수..
[시스템 프로그래밍] 프로세스 (1)
[시스템 프로그래밍] 프로세스 (1)
2022.11.06프로그램이 실행된다는 건, 컴퓨터 내부의 회로들이 시간의 흐름에 따라 작동하고 있음을 의미한다. 즉, 한 번에 한 개의 명령어들이 반복적으로 실행되고, 제어 회로는 명령어가 제대로 실행되도록 돕는다. 하지만, 때로는 제어 흐름이 변경돼야 하는 경우도 있다. 한글 문서 작업을 하고 있는 도중 카카오톡 메세지가 도착했다고 생각하자. 컴퓨터는 한글 문서 작업 관련 명령어를 처리해야 되기 때문에 카카오톡 메세지의 도착을 무시해야 할까? 이런 컴퓨터는 잘 팔리지 않을 것이다. 컴퓨터는 위와 같은 돌발적인 사건에 대응할 수 있어야 한다. 이런 사건을 예외적인 제어 흐름이라고 부르고, 하드웨어와 소프트웨어 두 가지로 나뉜다. 1. 하드웨어 컴퓨터구조에서 배운 Interrupt를 생각하면 이해하기 쉽다. 시스템 이벤트..
[백준] 23743 방탈출 - Java
[백준] 23743 방탈출 - Java
2022.11.02각각의 방이 노드, 워프가 간선을 의미함은 쉽게 이해할 수 있다. 문제는 비상 탈출구를 어떻게 처리하는가인데.. 두 가지 방법이 있다. 1. 브루트포스 방식으로 비상 탈출구를 설치할 수 있는 모든 경우의 수를 살펴본다. 즉, 방의 개수가 3이면 1 / 2 / 3 / 1 2 / 1 3 / 2 3 / 1 2 3 이렇게 뽑을 수 있는 모든 수를 뽑고, 뽑힌 수에 비상 탈출구를 설치한 후 최소 스패닝 트리를 돌린다. 크루스칼 알고리즘을 사용하는데, 만들어진 MST가 항상 모든 노드를 순회한다는 보장이 없다. 따라서 만들어진 MST에 대해 bfs를 수행해 모든 노드를 순회할 수 있는지 따로 확인하는 작업이 필요하다. 구현도 굉장히 힘든데.. 이렇게 풀면 시간 초과가 발생한다. 더보기 import java.io.*..