본문 바로가기

Language31

[Java] 애노테이션(Annotation)과 리플렉션(Reflection)을 통한 애노테이션 활용 정리 언젠간 한번 정리하려고 했지만 이제서야 하게 됐다.. 이미 만들어진 애노테이션을 많이 사용하기는 했는데 어떤방식으로 돌아가는지, 특히 런타임 중에 애노테이션이 달린 코드를 어떻게 찾아서 특정 기능을 수행하는지는 잘 몰랐다. 이번 포스팅에서는 애노테이션의 개념과 주로 활용되는 예시를 함께 정리하려고 한다. 애노테이션이란? 애노테이션은 프로그램의 코드에 추가하는 메타데이터로, 컴파일러나 런타임 시 코드를 처리하는 도구들에게 어떻게 처리해야 할지 추가적인 정보를 제공한다. 애노테이션은 Retention에 따라 다음 세 가지 용도로 활용된다. 1. 컴파일러에게 필요한 정보 제공 2. 빌드 툴이 코드를 자동으로 생성할 때 사용하는 정보 제공 3. 런타임 시 특정 기능을 처리할 때 사용하는 정보 제공(with Re.. 2024. 3. 17.
[Java] TreeSet에 중복된 값을 넣어야한다면? 결론부터 말해서.. TreeSet의 중복 요소를 넣고 싶다면 Comparable한 객체를 만들어 해당 타입을 갖도록 한다. compareTo를 재정의 할 때 같은 값을 갖는 경우 0이 아닌 다른 값을 리턴하도록 한다. 그런데 중복된 값을 가지는 SortedCollection이 필요하다면 TreeMap을 사용하는 게 더 나아보인다. value를 키로 갖고 중복된 요소의 개수를 value로 갖는 TreeMap을 만들면 위의 1, 2를 굳이 구현할 필요가 없기 때문이다. 작년에 풀었던 이중 우선순위 큐를 다시 풀면서 TreeSet으로 구현하게 되었는데, 몇가지 간과한 부분 때문에 오답처리를 받게 됐다. 해당 특징과 더 나은 방법을 정리해 비슷한 유형에서 같은 실수를 하지 않도록 하자.. 2023.05.03 .. 2024. 3. 15.
The method sort(int[]) in the type Arrays is not applicable for the arguments (int[], Collections.reverseOrder()) Arrays.sort()로 내림차순을 할 때는 첫번째 매개변수가 T[] a로 객체타입이다. 따라서 int[]등 primitive타입의 배열을 인자로 넣으면 제목과 같은 오류가 발생하게 된다. 참고하자. 2023. 11. 28.
Arrays.fill()에 참조타입을 매개변수로 전달하면? 프로그래머스 문제를 풀다 StringBuilder배열을 만들고 반복문을 돌며 특정 요소에 append하는 로직을 만들었다. append하기 위해선 각 요소에 StringBuilder객체를 초기화해야했고 Arrays.fill() 메서드를 사용해 초기화했다. Arrays.fill(temp, new StringBuilder()); 그런데 이후 특정요소에 append()하면 모든 요소의 StringBuilder에 append되는 것을 확인했다. 무엇이 원인일까 생각해보았고 Arrays.fill() 메서드에 객체를 매개변수로 전달하면 각 요소는 해당 객체를 얕은 복사하기 때문일 것으로 생각했다. 문서를 자세히 보면 특정된 객체의 참조를 각 요소에 할당한다고 되어있다..^^ ChatGPT에 물어봐도 같은 답변을 준.. 2023. 11. 25.
메서드 내에서 포장객체의 값을 변경한다면? pass by value의 원리에 따라, 참조타입을 메서드로 전달하면 인자로 받은 복사본 역시 원본과 같은 주소를 가리킨다. 그래서 메서드 내에서 참조타입을 수정하면 원본이 변경되는 것이다. pass by value에 대한 내용 참고 - 2023.03.07 - [Language/Java] - Java 메서드 인자 전달 메커니즘 Java 메서드 인자 전달 메커니즘 일반적으로 함수의 인자 전달 방법은 pass-by-value와 pass-by-reference로 구분할 수 있다. 먼저 두 방법의 개념을 살펴보고, 자바에서는 어떤 방법을 채택하고 있는지 알아보도록 하자. ** pass-by-value == c brotherstone.tistory.com 예시1) Person객체의 필드를 메서드를 통해 수정하는 .. 2023. 4. 25.
Java Raw Type의 정의와 사용 시 문제점 stack을 이용한 알고리즘 문제를 풀면서 발생한 일이다. Stack클래스가 제네릭 타입임을 잊어버리고 타입 파리미터를 생략한 채로 풀게 되었는데, IDE에서 경고메시지를 보내긴 했지만 컴파일하고 실행하는 데는 문제가 없었다. 실행결과가 정상적으로 나오고 제출결과도 정답으로 나오게 되니 제네릭 타입의 클래스를 사용할 때 타입 파라미터 없이 사용하면 발생하는 문제가 무엇인지 궁금해졌고 이를 주제로 포스팅하게 되었다. 다음은 문제의 소스 코드와 경고메시지이다. Stack st = new Stack(); boolean flag; for (int i = 0; i < tc; i++) { st.clear(); flag = false; String line = br.readLine(); for (int j = 0; .. 2023. 4. 3.
Java Garbage Collector의 수집 대상이 되기 위해 참조만 끊으면 되는 걸까? 자바 자료구조 강의 수강 중 Linked List를 직접 구현하는 과정에서 궁금증이 생겼다. 특정 노드를 삭제하기 위해 그 노드를 어떤 노드에서도 참조하지 않게만 하면 될 것으로 생각했지만, 해설 코드는 이와 더불어 그 노드가 참조하고 있는 부분까지도 null로 바꾸었다. GC의 특성상 어떤 객체를 아무 데서도 참조하고 있지 않으면 메모리 상에서 삭제된다고 알고 있었기 때문에, 굳이 그 객체가 참조하고 있는 부분까지 신경을 써줘야 하나?라는 생각이 들었던 것이다. 소스 코드 private class Node { T data; Node next; Node(T data) { this.data = data; } Node(T data, Node next) { this.data = data; this.next =.. 2023. 3. 31.
자바의 배열 크기를 바꿀 수 있을까? ArrayList자료구조를 직접 구현해보면서 배열의 크기를 바꿀 수 있다면 더 유연하게 구현할 수 있겠다고 생각했다. 하지만 자바에서는 배열의 길이는 늘리거나 줄일 수 없다. 그렇다면 어떤 방법으로 간접적으로나마 배열의 길이를 바꿀 수 있을까? 구현 코드를 까보기 전에 먼저 구글링을 통해 해답을 찾고 싶었고 검색을 했다. 다음은 W3 school의 포스팅이다. 결론은 배열 선언 후 크기를 바꾸는 것은 불가능 하며, 새로운 배열을 생성하고 기존 배열에 그 값을 채우거나, 복사하는 방법으로 대체할 수 있다고 한다. 참고 사이트) https://www.w3schools.blog/change-array-size-in-java Change array size in java Can we change array si.. 2023. 3. 26.
Java 메서드 인자 전달 메커니즘 일반적으로 함수의 인자 전달 방법은 pass-by-value와 pass-by-reference로 구분할 수 있다. 먼저 두 방법의 개념을 살펴보고, 자바에서는 어떤 방법을 채택하고 있는지 알아보도록 하자. ** pass-by-value == call-by-value Pass by value 인자가 pass-by-value 방식으로 전달될 때, callee의 인자로 넘어가는 값은 변수 원본의 복사본이다. 따라서 callee안에서 일어나는 변수의 변경사항은 원본에 영향을 끼치지 않는다. ** caller == 메서드를 호출하는 메서드, callee == caller에 의해 호출되는 메서드 Pass by reference 인자가 pass-by-referece방식으로 전달될 때, callee는 전달받은 값을 직.. 2023. 3. 7.