오랫만에 스레드 포스팅을 올립니다. Java에는, synchronized 키워드가 있는데요. 이것은 특정한 대상에 lock을 걸어서, lock이 풀릴 때 까지 다른 쓰레드가 실행을 하지 못하게 합니다. static 메소드에 붙일 때와, 일반 메소드에 붙일 때, 어디에 락을 거는지가 다른데요. 그에 대해서 간단하게 짚고 넘어가 보도록 하겠습니다. 먼저, 일반 메소드에 synchronized를 붙였습니다. 그러면 어떻게 락을 걸까요? 간단하게 프로그램을 만들어서 실험해 봅시다. 예제 1번입니다. 먼저 코드부터 보여드리겠습니다. 먼저 foo와 bar는, static 메서드가 아니지만, synchronized가 붙어있습니다. 이들을 동기화 메소드라고 이야기 합시다. 그리고 Thread를 상속받은 worker와 ..
전체 글 검색 결과
보통 제어문을 배우시고, 함수로 넘어가는 경우가 많아요. 저는 C언어 배열 먼저 다루도록 하겠습니다. 함수는 조금 뒤에 배워도 크게 문제는 없습니다. 먼저 array는 같은 자료형을 여러 개 묶어놓은 자료 구조 정도로 생각하면 좋아요. 그런데, 그걸 어떻게 묶느냐가 문제입니다. 이 친구는 시작 위치를 기준으로 연속이 되게 저장이 되어 있어요. 흔히 이런 말을 들어보신 적이 있을 겁니다. array는 삽입, 삭제는 매우 오래 걸리지만, x번째에 있는 원소는 굉장히 빠르게 찾을 수 있다. 그 이유는 간단합니다. 메모리 상에 연속적으로 저장이 되기 때문입니다. 즉, 실제로 arr[2]에 접근하기 위해서, arr의 기준 위치를 알아냅니다. 그림에서는 0x80번지입니다. 그 다음에, 첨자가 2가 붙었기 때문에, ..
오늘은 라빈 카프 알고리즘을 배워 보겠습니다. 어떠한 문자열을 수 하나, 혹은 2개, 3개로 압축할 수 있다. 이것은 꽤 엄청납니다. 그렇게 하면, 사실 어떠한 문자열에서 다른 패턴을 찾는 거 또한, 상당히 빠르게 수행할 수 있습니다. 다만, 정확성이 문제라면 문제인데요. 이 부분은 모듈러를 2개, 3개 이상 주는 식으로 해결합니다. 즉, 데이터가 강하지 않을 거라는 믿음을 가지고 수행을 하는 편입니다. 이 알고리즘을 잘 배워놓으면, 문자열 알고리즘을 모를 때, 조금이라도 건드려 볼 수 있습니다. 그러니 알아두시면 나름 좋습니다. 이 포스팅은 부분합 알고리즘을 이해했다는 전제 하에 쓰여졌습니다. 만약에, 그 부분에 대해서 이해를 하지 못하셨다면, 아래 포스팅을 먼저 보시고 오시는 것을 강력하게 권해드립니..
ps를 하면서, switch문은 그렇게 많이 작성하지는 않았습니다. 오히려 if, else if문을 가지고 많이 작성하거나, 배열로 많이 처리를 했는데요. 그래도 알아두면 유용한 조건문입니다. 대략적인 문법은 아래와 같습니다. 여기서 default는, 정수 변수가 정수값(1), ... , 정수값(n)이 아닐 때, 걸립니다. 이 때에는 실행(n+1)이 수행되고 switch문이 끝날 겁니다. 괄호에 정수 변수가 하나 들어갑니다. 예를 들어서 op나, cc와 같은 것들이 그러한 예입니다. 그리고, case 정수값(i)는 정수 변수의 값이 정수값(i)일 때, 걸립니다. 즉, 분기가 되는 위치 정도로 생각하시면 좋겠네요. 이것을 그림으로 쉽게 그려 드리면 다음과 같습니다. 예를 들어, op가 switch문의 정수..
A(x)을 x의 약수 갯수라고 해 봅시다. 이 때, A(1) + ... + A(n)의 값은 어디에 근접할까요? 이 간단한 질문에서, 오늘의 주제를 이야기 해 보도록 하겠습니다. a가 b의 배수라면, b는 a의 약수입니다. 이 점을 이용해 봅시다. 예를 들어 4의 약수는 1, 2, 4입니다. 그러면, 4는 1의 배수이면서 2의 배수이고, 4의 배수이기도 합니다. 그러면 1에서 출발해서, 1만큼 건너 뛸 때, 2에서부터 출발해서 2만큼 건너 뛰었을 때, 4에서부터 출발해서 4만큼 건너 뛰었을 때, 4를 visit 할 수 있게 됩니다. 그러면 1부터 n까지의 약수의 갯수의 합을 구하는 건 어떻게 하면 좋을까요? 역시 거꾸로 생각하시면 됩니다. 예를 들어서, 약수가 1인 수들을 찾는다고 해 봅시다. 그러면 1,..
최근댓글