목록Language/Java, Kotlin (19)
ecsimsw
자바에서의 열거형(enums) 처음 자바를 배웠을 때, annotation와 함께 가장 신기한 개념이었다. 어떻게 동작하는지도 모르고, 그저 사용 방식을 외워 사용해왔던 것 같아, 이번 포스팅을 정리하면서 좀 더 스스로 명확히 할 수 있도록 공부하려고 한다. 더하여 열거형의 조상 java.lang.Enum 타입을 흉내 내 보았다. 타입에 안전한 열거형 (Typesafe enum) C언어의 Enum은 단순히 이름과 상수를 매핑하는 것에 가깝다. 이를 테면, 아래 C언어에서의 열거형 예시에서 DayOfweek.Tuesday와 Numers.Three 둘 다 상수 2가 할당이 되어있으므로, 논리적으로는 맞지 않으나 C언어에서는 '같다'로 처리된다. #include enum DayOfWeek { Sunday = ..
자바는 항상 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..
자바의 Thread Safe 여러 스레드를 사용하면 시스템 자원의 사용, 응답시간, Context Switch 횟수를 줄일 수 있다는 장점을 얻을 수 있다. 대신 데이터의 충돌 문제가 발생할 수 있다. 여러 테스크가 동시에 처리되도록 구현하는 것을 동시성 프로그래밍, 데이터 충돌과 같은 동시성 프로그래밍으로 발생되는 이슈를 피하는 방법을 동시성 보장이라고 한다. 이번 포스팅에서는 자바의 동시성 보장 방식, 가장 기본적인 synchronized, volatile, atomic 세 가지 키워드를 정리하고자 한다. 가시성 문제와 volatile 가시성 문제는 여러 개의 스레드가 사용됨에 따라, cache memory와 Ram의 데이터가 서로 일치하지 않아 생기는 문제를 의미한다. 한 스레드가 변경된 값을 ca..
자바 깊이 알기 / 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 값이 변경되어야 하는건 아닐까. 틀렸다. Integer는 Immutable 형이다. Integer class를 까..
Hashing / HashTable key 값을 조작해서, 배열의 인덱스와 매핑한다면, key에 해당하는 value 값을 배열의 인덱스에 접근하는 것처럼, O(1)의 비용으로 가져올 수 있을 것이다. 예를들어, 과일 과게에서 과일의 바코드 Id와 과일 명을 담는 테이블을 만든다고 치자. 102 -> apple 543 -> banana 87426 -> orange 9 -> 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 리다이..
자바는 문자열의 끝을 표시하지 않는다. C나 C++은 문자열의 끝을 \0로 하여 끝을 표시하였지만, 자바는 길이를 따로 저장해 두는 방식으로 끝을 안다. 문자열 클래스 파일 따라가기 String.length()가 궁금해서 따라가보았다. 심심해서... String.java와 StringCoding.java을 그냥 궁금한 부분만 검색해가면서 의식의 흐름 기법으로 정리 char[] chars = new char[]{'d','e','s'}; String s2 = new String(chars); System.out.println(s2.length()); public int length() { return value.length >> coder(); } private final byte[] value; byte ..
HashCode hashCode 역시 equals와 마찬가지로 Object에 속하여 기본 구현은 객체의 주소를 기준으로 객체를 식별할 수 있는 정수 코드를 리턴하는 메소드이다. 내용 값을 기준으로 식별 값을 리턴한다. 아래 코드는 재정의 없이 클래스 A의 두 인스턴스에 대한 hashCode를 출력하는 예제이다. static class A{ int a; public A(int a){this.a = a;} } public class Application{ static void main(String[] args){ A a1 = new A(1); A a2 = new A(1); System.out.println(a1.hashCode()); // 758529971 System.out.println(a2.hashCo..