본문 바로가기

개발

Short-circuit evaluation과 Sequence Point 우연히 페이스북에서 생활코딩의 한 게시물을 보게 되었다. https://www.facebook.com/groups/174499879257223/?multi_permalinks=7441092495931222 질문의 내용은 int i = 1, j = 1, k = 1; printf("%d\n", ++i || ++j && ++k); printf("%d %d %d", i, j, k); 해당 코드의 결과값이 1 2 2 2 라고 생각하였는데 1 2 1 1 인 것이 이해가 가지 않는다는 것이었다 나도 처음에 코드만 봤을 때는 1 2 2 2 가 맞지 않나? 라고 생각했지만, 정답을 보고 나서는 아차! 싶었다 이 이유는 조금만 생각해본다면, 당연한 것이다 AND && 연산자와 OR || 연산자에 대해서 생각해보자 다음과 .. 더보기
[Spring] 싱글톤 패턴의DIP 위반과 만족 싱글톤 패턴이란, 특정 클래스의 인스턴스가 여러 개 존재하는 것이 아닌, 딱 하나만 존재하도록 보장하는 것을 말한다. 이런 패턴이 존재하는 이유는 다음과 같다. 만약 실시간 결제 정보를 저장하는 DB 객체가 결제 수만큼 생성된다면 이는 리소스 낭비로 이어질 수 있다. 그러나 해당 클래스에 싱글톤 패턴을 적용하면, 하나의 인스턴스에 모든 결제 DB를 저장할 수 있게 된다. 객체 생성은 많은 비용을 요구하나, 참조 접근은 생성에 비해 엄청나게 적은 비용이 들기 때문에 더 효율적이다. 그럼 싱글톤 패턴을 적용한 클래스 예제를 살펴보자. public class SingletonService { private static final SingletonService instace = new SingletonServi.. 더보기
[Java] Queue에서 poll()과 remove() 중 무엇을 선택해야 할까? Java에서 Queue를 사용할 때, 가장 앞 요소를 가져오는 메소드는 poll()과 remove() 두 가지가 있다. Queue가 빈 상태일때, 두 메소드의 차이를 볼 수 있다. poll()은 null을 반환하고 remove()은 NoSuchElement Error를 반환한다. 어떤 상황에서 어떤 선택을 해야할지 고민이 됐다. null로 인해 발생되는 NPE은 예방하는 것이 중요하다고 본 것이 기억났기 때문이다. 이에 대한 힌트를 stackoverflow에서 얻었다. Queue가 비어있을 것으로 예상되는 경우에는 poll()을 사용하는 것이 적절하고 그 반대의 경우에는 remove()를 사용하는 것이 적절하다고 한다. 예외처리가 많은 비용을 요구하기 때문이다. Queue가 종종 빈다는 사실을 개발자가 .. 더보기
코드 실행시간 측정하기 (Java, Python, C, C++) 알고리즘 문제를 풀거나, 구현을 하거나, 심심풀이 궁금증 등의 이유로 해당 코드 조각의 실행시간을 구해야 할 때가 종종 있다. 그러나 자주 사용하지 않다보니 항상 까먹어서 구글에 검색하곤 했다. 정리하며 기억하자는 의미에서 내가 주로 사용하는 3가지 언어로 정리했다. Java long startTime = System.currentTimeMillis(); // 테스트할 코드 long endTime = System.currentTimeMillis(); long elaspedTime = endTime - startTime; System.out.printf("startTime(%s) - endTime(%s) = %s%n",startTime, endTime, elaspedTime); Python import t.. 더보기
[Git] Tracking connection (-set-upstream 명령) 이번에 다룰 내용은 Tracking connection 입니다! 'Git에 이런 게 있었나?' 라는 생각과 함께 생소하게 느껴질 수도 있는데요. 밑의 이야기를 보며 배워볼게요. A와 B는 얼굴을 나누어 맡았었죠? 그래서 둘은 이런 고민을 했습니다. "혹시나 내 붓이 미끄러져서 네가 그린 부분을 망치면 어떡해?" 그리고 이 문제를 해결 하기 위해서 둘 만의 브랜치를 나눠 만들기로 했어요. 눈을 그리는 A는 upper_face 브랜치에서, 코와 입을 그리는 B는 lower_face 브랜치에서 작업하기로요. 먼저, 이 둘은 초석이 될 face 브랜치를 생성했었죠? (face) $ git push -u origin face 🙋 : 여기서 -u 옵션은 무엇을 의미하나요? 더보기 A. -u는 -set-upstrea.. 더보기
[Git] Branch Branch 1) Branch는 무엇이고, 왜 쓰는 걸까요? 브랜치는 뭔 뜻이죠? "나뭇가지" / "분기" 라는 뜻을 가지고 있습니다. 나무를 떠올려볼까요? 나무에 있는 나뭇가지들은 나무 뿌리에서 시작을 해서, 근본을 공유합니다. 다만, 나뭇가지들은 어느 순간부터 각자 분리되어있죠. 실제 나뭇가지는 다시 합쳐지지는 않지만, 이 나뭇가지들이 다시 합쳐지는 그림을 떠올리면서... 깃에서의 브랜치를 이해해봅시다. 가장 왼쪽에 있는 초록색 원을 프로젝트의 시작 커밋이라고 해볼까요? 그리고 여러분이 파란색 원과 같이 커밋을 하고 싶습니다. 근데, 그와 동시에 다른 사람들도 작업을 해서 커밋을 하고 싶다고 합시다. 만약 여러분이 지금까지 알고있는 내용으로 생각해보면, 위와 같은 플로우의 작업이 가능했나요? main.. 더보기