본문 바로가기

PL

(3)
[Java] private final vs final private 개요 클래스 내부에서만 사용하기 위해 private, 상수로써 사용하기 위해 final을 쓰고자 할 때 어떤 순서로 쓰는 것이 맞을까? 순서가 달라짐에 따라 어떤 차이가 있을까? 차이는 없다 일단, 둘의 차이는 전혀 없다. 완벽하게 동일한 의미이다. 하지만 차이가 없다고 해서 어떤 때는 private final로 쓰고, 어떤 때는 final private으로 쓰면 통일성도 없고 어수선해 보일 것이다. 이런 순서에 대한 컨벤션은 무엇일까? 정답은 자바 스펙에 구글의 자바 스타일 가이드도, OpenJDK 커뮤니티에서 만든 스타일 가이드도 모두 자바 스펙에서 써준 순서를 따를 것을 권장하고 있다. 자바 스펙에 따르면 private final로 쓰는 것이 바람직하다. 관련 링크 stackoverflow.com/..
[C/C++] 다차원 배열에서 인덱스 침범에 대한 고찰 개요 배열은 메모리 상에서 연속된 형태로 배치된다. 그렇기 때문에 배열은 랜덤 액세스가 가능하다(단순한 포인터 계산을 통해). 연속으로 배치되는 것은 1차원 배열 뿐만 아니라 2차원, 3차원 등의 다차원 배열도 해당된다. 그렇다면 이쯤에서 우리는 한 가지 의문이 생긴다. 다음의 코드를 보자. int arr[3][3]; arr[1][2] = 1; // OK arr[0][5] = 1; // ? 의미적으로는 arr[1][2]과 arr[0][5]가 동일한 원소를 가리켜야 할 것 같다. 하지만 실제로도 그럴까? 어서오세요, UB의 세계에! 결론부터 말하자면 UB이다. C11의 J.2절 Undefined behavior를 보면 다음과 같은 얘기가 있다. An array subscript is out of range..
[C++20] #define sz(x) (int)x.size()는 이제 그만 개요 #define sz(x) (int)x.size() C++로 PS를 좀 해본 사람이라면 누구나 공감할 만한 매크로일 것이다. 생소한 사람들을 위해 사용 예시를 들어 보자면, 다음과 같다. std::vector vec; // do something for (int i = 0; i < sz(vec); ++i) { // ... } 대충 벡터 등의 컨테이너 크기를 구하는 데 쓸 수 있다. 하지만 이렇게 쓸 거라면 그냥 vec.size()로 쓰지 않고 왜 굳이 (int)로 번거롭게 형변환을 하는 것일까? 형변환 하는 이유 그 이유는 size() 메서드가 std::size_t 타입을 반환하기 때문이다. std::size_t는 unsigned integer이므로 자칫하면 의도치 않은 상황을 유발할 수 있다. 다음..