목록 Language/Java, Kotlin (20)
배열, 리스트 선택의 근거 잡기 같은 타입의 여러 객체를 단순히 참조만 하는 용도에는 배열이 좋다고 생각했다. 리스트보다 배열이 메모리 관리에 유리하다는 자료구조 책의 한 문장을 기억했지 그 이상을 알려하지 않았다. 배열과 리스트 중 어떤 것을 사용해야하는 지 선택의 근거를 나름대로 잡아보려 한다. 배열보다는 리스트를 사용하라 'Effective Java 규칙 28. 배열보다는 리스트를 사용하라'는 배열보다 리스트 사용을 권장하고 있다. 그 이유를 공부해왔다. 아래처럼 배열을 사용할 경우, ArrayStroreException을 컴파일 시점에선 알 수 없다. 배열은 공변형이고, 런타임에서야 원소의 자료형이 결정되기 때문에, 런타임에서야 그 실수가 드러난다. Object[] objArr = new Long..
oracle docs - Collections.unmodifiableList()Returns an unmodifiable view of the specified list. This method allows modules to provide users with "read-only" access to internal lists. Query operations on the returned list "read through" to the specified list, and attempts to modify the returned list, whether direct or via its iterator, result in an UnsupportedOperationException. UnmodifiableList은..
Variable 'i' should be final or effectively final 자바에서 람다식과 inner class에서는 final 변수 또는 effectively final 변수만 접근된다. 충분히 가능할 것만 같은 코드가 왜 컴파일 에러를 만드는지, effectively final 변수는 뭔지 정리해보려고 한다. public static void testLamda(String[] args) { int i = 0; Runnable testExpression = () -> i++; } // Variable used in lambda expression should be final or effectively final 람다 캡쳐링 아래 코드를 한번 보자. class test { public s..
자바는 항상 Call by Value자바 Call by value, Call by reference를 검색하면 많은 블로그에서 의견이 분분하다. Call by reference라는 블로그도 있고, 잘못된 예시로 설명하는 글도 보였다. 결론부터 말하면 자바는 Call by value이다.이번 포스팅에서는 Call by value인 이유와 헷갈릴 수 있는 예시를 메모리 구조를 그려보며 하나씩 짚어볼 생각이다. 변함과 변하지 않음컴퓨터 공학을 전공하고 C언어 수업을 들었다면 swap 예시를 꼭 한번은 봤을 것이다. 함수로 main의 a,b 값이 변하지 않는 것을 보여주면서 Call by value를, 주소를 직접 넘겨 a,b 값이 변하는 것을 보여주면서 Call by reference를 배웠다. Call b..
자바의 Thread Safe여러 스레드를 사용하면 시스템 자원의 사용, 응답시간, Context Switch 횟수를 줄일 수 있다는 장점을 얻을 수 있다. 대신 데이터의 충돌 문제가 발생할 수 있다. 여러 테스크가 동시에 처리되도록 구현하는 것을 동시성 프로그래밍, 데이터 충돌과 같은 동시성 프로그래밍으로 발생되는 이슈를 피하는 방법을 동시성 보장이라고 한다. 이번 포스팅에서는 자바의 동시성 보장 방식, 가장 기본적인 synchronized, volatile, atomic 세 가지 키워드를 정리하고자 한다. 가시성 문제와 volatile가시성 문제는 여러 개의 스레드가 사용됨에 따라, cache memory와 Ram의 데이터가 서로 일치하지 않아 생기는 문제를 의미한다. 한 스레드가 변경된 값을 cac..
자바 깊이 알기 / Immutable 객체와 메모리 구성아래 코드를 먼저보고 출력 값을 고민해보자. class App2 { public static void main(String[] args) throws Exception{ Integer i = 10; changeInteger(i); System.out.println(i); } static void changeInteger(Integer a){ a = 20; }} Integer는 int와 다르다. 참조 타입이기 때문에 힙 영역에 있는 객체를 참조할 것이고, changeInteger 에서 a는 힙에 있는 그 객체 자체를 가리키기 때문에 i 값이 변경..
Hashing / HashTablekey 값을 조작해서, 배열의 인덱스와 매핑한다면, key에 해당하는 value 값을 배열의 인덱스에 접근하는 것처럼, O(1)의 비용으로 가져올 수 있을 것이다. 예를들어, 과일 과게에서 과일의 바코드 Id와 과일 명을 담는 테이블을 만든다고 치자. 102 -> apple543 -> banana87426 -> orange9 -> grape 왼쪽이 id, 오른쪽이 상품명이라고 하면, 과일 과게 주인은 다음과 같은 표를 만들 수 있다. 만약 가게 주인이 id에 해당하는 과일 이름을 알고 싶다면, id를 순차적으로 하나씩 확인하고, 해당 id의 과일 이름을 가져와야 하는 것이다. 혹은 이런 표를 만들면 어떨까. id의 끝자리를 인덱스로 해서 아래처럼 표를 ..
자바 깊이 알기 / 바이트 코드 이전 JVM 구조 공부하면서, 1. Runtime Constant Pool에 "클래스 / 인스턴스의 상수, 메소드와 필드에 대한 레퍼런스"이 저장된다.2. Stackframe에서 constant pool을 참조한다.3. Local Variable Array는 로컬 변수를 담고 있는 배열이다. 이렇게 정리했으나, 사실 잘 와닿지 않았다. 그래서 간단하게라도 바이트 코드를 분석해보고 싶었다. 바이트 코드 출력하기 java 파일을 준비하고 javac로 컴파일한다. 해당 자바 파일의 class 파일이 생성된다. javac javaTest.java 역어셈블러(javap)로 해당 클래스를 실행하면 바이트코드가 출력된다.javap -v -p -s javaTest.class 리다..