ConcurrentModificationException 은 어디서, 언제 throw 되는걸까?
2023. 4. 12. 19:40
Java
Java 개발을 한 사람들이라면 ConcurrentModificationException 에 대해 들어보았을 것이다. Collection에서 순회중, 데이터의 조작이 발생하는 경우 ( 이름만 보면 분명 Concurrent 인데 멀티스레드가 아닌 단일 스레드 환경 에서도 해당 예외가 발생한다. ) thread가 간섭 하면서 발생 이라고 흔히들 알고 있을 것 같다. 오늘은 대체 이 ConcurrentModificationException 이 내부적으로 어떤 로직에 의해 throw 되는 것인지 알아보기로 했다. ConcurrentModificationException 발생 시켜 보기 내부적으로 Iterator 를 사용하는 코드가 존재하는 경우 발생하게 된다. 가장 흔하게 볼 수 있는 것은 이미 해당 Colle..
Aggregation 과 Composition 개념
2023. 3. 24. 11:41
Java
서브클래스, 서브타입, 클래스들간의 각종 관계 등에 대해 정리해보고자 시리즈물로 준비했다. 나는 이 부분에 대해 전혀 모르기 때문에 간단한 정리가 될 것이다. 1. 타입과 클래스들의 관계 그리고 리스코프 치환원칙 2. Aggregation 과 Composition 개념 3. Subtype 과 Subclass Aggregation 과 Composition Composition 은 Java 개발을 하면서 “상속 대신 컴포지션을 사용하라” 라는 말로 수도 없이 많이 들어온 용어다. 그리고 알게모르게 대부분의 자바 개발자들은 Composition 을 사용하고 있으니 익숙하다..고 생각했다. 그런데 이펙티브 자바 스터디를 진행하는 과정에서 누가 화두를 꺼냈다. Aggregation 과 Composition 의 차..
타입 및 클래스들 사이에 존재하는 각 종 관계들과 리스코프 치환 원칙
2023. 3. 24. 11:35
Java
서브클래스, 서브타입, 클래스들간의 각종 관계 등에 대해 정리해보고자 시리즈물로 준비했다. 나는 이 부분에 대해 전혀 모르기 때문에 간단한 정리가 될 것이다. 1. 타입과 클래스들의 관계 그리고 리스코프 치환원칙 2. Aggregation 과 Composition 개념 3. Subtype 과 Subclass 봐도 봐도 헷갈린다. 그래도 이제는 헷갈릴 때 마다 여러번 봐 놓았었더니 wiki 내용이 조금 와 닿기 시작했다. wiki 에 있는 Is-a 와 관련된 설명들을 바탕으로 s-a , has-a 등 각종 타입간의 관계와 이를 리스코프 치환 원칙과 연관 지어 정리 해 보기로 했다. 타입 및 클래스들 사이에 존재하는 각 종 관계들과 리스코프 치환 원칙 리스코프 치환원칙 과 “Java 에서의 is-a 관계” ..
Java 에서 Stack 구현체로는 무엇을 사용해야할까?(feat_Java로 코딩테스트 문제 풀기)
2022. 9. 2. 12:19
Java
Stack LIFO -> 처음 넣었던 원소는, 마지막에 꺼낼 수 있다. "끝" 에 대한 삽입과, 제거만을 허용한다 Stack 은 Array, LinkedList 등등을 사용하여 구현할 수 있다. 사실 자료구조상, 양 쪽(out,in 하는 곳) 이 모두 뚫려 있더라도, 제공하는 작업이 pop, push 이기만 해도 stack 으로 제공가능하다. 따라서 Queue 도 스택으로 사용이 가능하다. Java 에서 Stack 을 위해 어떤 구현체를 사용해야할까? 그렇다면 Java 에서 Stack 으로 사용할 자료구조에는 무엇이 있을까? 그냥 Stack 사용하면 안됨?? 흠.. 가장 먼저, "Stack" 클래스를 살펴보자! Java 의 Stack 에 대한 문서에는 이런 구절이 존재한다 A more complete a..
record 의 생성자를 private 으로 만드는 것이 불가능한 이슈
2022. 8. 23. 15:19
Java
상황: record 의 static factory method 만들었다. 개인적인 기호는 new 보다 정적 팩토리 메소드를 사용하는 것을 선호한다. 따라서 타 클래스에서 new 를 통한 생성자를 직접 호출하는 대신, 정적 팩토리 메소드를 사용하도록 제한을 두기 위해 "생성자를 private" 으로 변경하고자 했다. 이미 정적 팩토리 메소드 내부에서는, 모든 불변 필드를 초기화하는 역할의 기본 생성자(이하 '주생성자' 라고 칭하겠음) 를 호출하는 방식을 취하도록 했다. record 타입에서는 컴파일러가 자동으로 public 주생성자를 만들어주기 때문에, 이를 명시적으로 다시 정의해서 private 으로 해주려고 했다. 그런데 컴파일 에러가 발생했다 - 좀 더 구체적인 상황을 적자면 -> 해당 레코드 타입은..
[Java] method final parameter ?
2022. 7. 27. 10:28
Java
final parameter Method 인자로서 final parameter 를 선언해두는 것을 본 적 있다. Java 에서 final 키워드는 클래스 → 상속을 허용하지 않는 클래스 메소드 → 오버라이딩을 허용하지 않는 메소드 클래스,인스턴스 변수 → 초기화 이후에 값을 변경할 수 없는 변수임을 명시적으로 나타낸다 물론, 이 변수가 “참조변수" 인 경우라면, 해당 객체 내부의 값은 또 변경될 가능성이 존재한다. 를 의미한다. “인자"는 변수와 같은 의미에서 final 을 사용하는 걸까? 어차피 Java 에서는 “참조값을 전달" 하며, 이 값 자체는 스택에 복사되어올 뿐이다. 따라서 새로운 메소드 호출로 인해 생긴 스택 프레임 상의 값을 변경하는 것은 Caller 에 존재하던 참조 변수의 값을 변경하지..
[Java] ImmutableCollection 과 UnmodifiableCollection 과 Immutability
2022. 5. 31. 01:32
Java
테스트 코드를 작성할 때면 List.of 를 무지성으로 사용하고는 했었다. 해당 정적팩토리 메소드를 통해 리턴되는 리스트는 불변 객체라고는 알고 있었지만, 어떤 의미에서의 불변인지.. 해당 컬렉션에 담겨있는 element는 변경이 가능한 것 같은데 왜 Immutable 이라는 이름이 붙어있는지 궁금해졌다. 그래서 교육 방학 첫날(?) release note 를 통해 알아보았다 ImmutableCollection @jdk.internal.ValueBased static abstract class AbstractImmutableCollection extends AbstractCollection { // all mutating methods throw UnsupportedOperationException @O..
[Java] 주어진 배열에서 특정 값을 갖는 index 찾기 (stream) (참조글 읽어보기)
2022. 3. 8. 11:32
Java
g라는 int형 배열에서 g[idx] 값이 0인 idx 를 "루트노드" 라고 하고, 이 루트노드를 찾는 상황이라고 가정. 이제까지 for문을 사용해 탐색해왔는데 요즘도 이렇게 하나? 라는 생각이 들었다. python에서 range 사용하는 것 처럼 할 수는 없을까? stream에 있을 것 같은데..라고 생각하며 찾아보았다. IntStream 이라는 것은 처음 사용해보았다. public static int findRoot(int[] g){ return IntStream.range(0, g.length) .filter(i -> g[i] == 0) .findAny().getAsInt(); } 물론 findAny() 는 Optional을 리턴하기 때문에 Optional로 리턴하게 하여, null인 경우에 대한 ..