목록Language (36)
ecsimsw
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 리다..
자바는 문자열의 끝을 표시하지 않는다. 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 ..
자바의 접근 제한자 private : 같은 클래스 내에서만 접근 가능 default : 같은 패키지 내에서만 접근 가능 protected : 같은 패키지내 또는 자손 클래스일 경우 접근 가능 public : 제한 없음 캡슐화 접근 제한자는 객체지향의 캡슐화, 그리고 그를 통한 코드 은닉화를 위한 도구이다. 데이터를 외부로부터 숨기거나, 접근을 막고, 또는 접근에 처리를 강제화한다. 이전에 oop 캡슐화에 대해서 정리한 글이 있다. 객체지향을 공부하면서 캡슐화를 정확히 몰랐고, 은닉화와 구분하지 못해서 정리했던 기억이 난다. 그때 캡슐성을 아래 3개로 정리했다. Encapsulation 1) 유사한 기능이나 변수를 한 집합으로 하여 더 관리하기 쉽게하고 코드를 명확히 함. 2) 외부에서 멤버를 엑세스하는 ..