본문 바로가기

기타 지식들10

썸머타임과 타임존 계산 ㅇ썸머 타임(일광 절약 시간: DST, Daylight Saving Time)보통 3월에서 10월은 태양이 일찍 뜨고, 나머지는 태양이 상대적으로 늦게 뜬다. 시간도 여기에 맞추어 1시간 앞당기거나 늦추는 제도를 썸머 타임이라 한다.  ㅇ타임존 계산세계는 다양한 타임존으로 나뉘어져 있으며, 각 타임존은 UTC(협정 세계시)로부터의 시간 차이로 정의된다.UTC (Coordinated Universal Time, 협정 세계시): 원자 시계를 사용하여 측정한 국제적으로 합의된 시간 체계. 지구의 자전 속도가 변화하는 것을 고려하여 윤초를 추가하거나 빼는 방식으로 시간을 조정함으로써, 보다 정확한 시간을 유지한다. 따라서 정밀한 시간 측정과 국제적인 표준에 관해서는 UTC가 선호된다.기준 시간: UTC+0전 세.. 2024. 8. 28.
유지보수 vs 최적화 유지보수 vs 최적화를 고려해야 하는 상황이라면 유지보수하기 좋은 코드를 먼저 고민해야 한다. 특히 최신 컴퓨터는 매우 빠르기 때문에 메모리 상에서 발생하는 연산을 몇 번 줄인다고 해도 실질적인 도움이 되지 않는 경우가 많다. 코드 변경 없이 성능 최적화를 하면 가장 좋겠지만, 성능 최적화는 대부분 단순함보다는 복잡함을 요구하고, 더 많은 코드들을 추가로 만들어야 한다. 최적화를 위해 유지보수 해야 하는 코드가 더 늘어나는 것이다. 그런데 진짜 문제는 최적화를 한다고 했지만 전체 애플리케이션의 성능 관점에서 보면 불필요한 최적화를 할 가능성이 있다. 특히 웹 애플리케이션의 경우 메모리 안에서 발생하는 연산 하나보다 네트워크 호출 한 번이 많게는 수십만배 더 오래 걸린다. 자바 메모리 내부에서 발생하는 연.. 2024. 8. 22.
스트링 풀(String Pool, 문자열 풀) ㅇ스트링 풀(String Pool, 문자열 풀): 메모리 관리 기법 중 하나로, 힙 영역에 있는 특별한 저장소주로 문자열(String) 리터럴을 효율적으로 관리하기 위해 사용된다. 스트링 풀이 있는 언어에서는 동일한 문자열 리터럴이 여러 번 사용될 때, 각 리터럴이 별도로 메모리에 저장되지 않고, 이미 존재하는 동일한 문자열 리터럴을 재사용한다. 이렇게 함으로써 메모리 사용을 최적화하고 성능을 향상시킬 수가 있다. ※ 오션월드의 유수풀, 코딩조교실 인력풀 할 때의 그 풀(Pool)이다. 수영장이라는 의미를 기본적으로 갖고 있지만, 프로그래밍에서는 공용 자원을 모아둔 곳을 의미한다. 문자열 풀에서 문자를 찾을 때는 해시 알고리즘을 사용하기 때문에 속도가 매우 빠르다.https://claremont.tist.. 2024. 8. 21.
사이드 이펙트(side effect) 사이드 이펙트(side effect)는 프로그래밍에서 어떤 계산이 주된 작업 외에 추가적인 부수 효과를 일으키는 것을 말한 다. 쉽게 말하면 '의도하지 않은 결과'를 의미하며 프로그래밍에서 사이드 이펙트는 보통 부정적인 의미로 사용한다. 1. 사이드 이펙트의 예시전역 변수 수정: 함수가 전역 변수를 수정하는 경우.입력 값 수정: 함수가 전달된 인자의 값을 직접 변경하는 경우.파일 시스템에 쓰기: 함수가 파일에 데이터를 쓰거나 파일을 수정하는 경우.데이터베이스 업데이트: 함수가 데이터베이스에 값을 삽입하거나 갱신하는 경우.콘솔 출력: 함수가 콘솔에 메시지를 출력하는 경우. (System.out.println() 등)네트워크 요청: 함수가 외부 네트워크 요청을 하는 경우. 2. 사이드 이펙트의 문제점"사이드.. 2024. 8. 20.
스코프의 중요성 [스코프 종류]  아래의 C언어 코드를 보자이 코드는 좋은 코드일까? 나쁜 코드일까?#include int main() { int n; int tmp; n = 1; if (n == 1) { tmp = n + 1000; printf("tmp = %d\n", tmp); } printf("n = %d\n", n); return 0;} 정답은 "나쁜 코드"이며 이유는 2가지이다 1. 비효율적인 메모리 사용tmp는 if 코드 블록에서만 사용되지만, main() 코드 블록이 종료될 때까지 메모리에 유지하게 된다. 따라서 불필요한 메모리가 낭비된다. 만약 if 코드 블록 안에 tmp를 선언했다면 C언어를 구현하는 곳에서 if 코드 블록의 종료 시점에 이 .. 2024. 8. 4.
배열의 인덱스가 0부터 시작하는 이유 혹시 배열의 인덱스가 1이 아닌 0부터 시작하는 이유에 대해서 잘 아는가?아마 많은 사람들이 당연하게 인덱스를 0부터 사용하면서 그 이유는 잘 모를 것이다배열의 인덱스를 1이 아닌 0부터 사용하는 데에는 많은 이유가 있다지만, 그중에서 가장 중요하고 본질적인 이유는 바로 "메모리 주소 계산의 용이성"이다  배열은 메모리에서 연속적인 블록으로 할당된다. 배열의 첫 번째 요소의 주소를 기준으로 다른 요소의 주소를 계산할 때, 인덱스가 0부터 시작하면 포인터 산술이 간단해진다. 예를 한 번 들어보면, array[i]는 배열의 첫 번째 요소 주소에 i * 요소 크기를 더한 값과 같게 된다. 인덱스가 0부터 시작하면 첫 번째 요소의 주소에 0을 더하는 것이 되어 매우 직관적이게 된다.C언어와 같은 초기 프로그래밍.. 2024. 7. 24.
전역 변수의 일장일단 (장점) 간편함:작은 프로그램이나 간단한 스크립트에서는 전역 변수를 사용하여 데이터를 공유하는 것이 더 간편할 수 있다. 함수 간에 많은 데이터를 전달하는 복잡함을 피한다.데이터 공유:여러 함수가 같은 데이터를 사용해야 할 때 전역 변수를 사용하면 데이터 전달과 관련된 코드를 줄일 수 있다. 모든 함수가 전역 변수에 접근할 수 있기 때문에 코드가 간결해질 수 있다.메모리 효율성:전역 변수는 프로그램이 실행되는 동안 한 번만 할당되므로 메모리 사용이 효율적일 수 있다. 반복적으로 할당하고 해제하는 비용을 줄인다.상수 데이터:변하지 않는 상수 데이터(예: 설정 값, 하드코딩된 테이블 등)를 저장하는 데 전역 변수를 사용하면 편리하다. 이러한 데이터는 프로그램 전체에서 사용되기 때문에 전역 변수로 정의하는 것.. 2024. 7. 19.
조건식 순서의 중요성 (단락 평가) while (target->key != key && target != NULL) {} 다음 코드는 심각한 오류를 불러올 수 있다왜 그럴까? 한 번 생각해 보자..........이유는 target이 NULL값인 상황에 있다저렇게 target != NULL 조건을 뒤로 보내게 되면 조건식을 따졌을 때 target이 NULL이여도 그대로 target->key != key 조건식을 검사하게 된다 하지만 포인터가 NULL일 때 그 포인터가 가리키는 값을 접근하려고 하면 segmentation fault(프로그램이 허용되지 않은 메모리 영역에 접근하려고 할 때 발생하는 오류)가 일어나게 된다 따라서 조건식을 아래와 같이 target != NULL 먼저 오게 해야 한다while (target != NULL && ta.. 2024. 7. 19.
오버플로우 방지 코드 작성법 4가지 int calculateMid1(int left, int right) { return (left + right) / 2;} 단순히 심플한 수식이지만 오버플로우가 발생할 수 있는 위험한 코드이다오늘은 오버플로우를 방지할 수 있는 코드 작성법 4가지에 대해 설명하려 한다    1. 가장 유명한 방식int calculateMid2(int left, int right) { return left + (right - left) / 2;} 오버플로우 방지의 교과서 같은 방식이다   2. 비트 연산 방식int calculateMid3(int left, int right) { return left + ((right - left) >> 1);} 비트를 오른쪽으로 한 칸 이동시키는 연산으로, 이는 2로 나누.. 2024. 7. 5.