본문 바로가기

언어와 프레임워크/Java9

빠르게 살펴보는 코틀린 문법 클래스 생성자 constructor 키워드 class Person constructor(name: String, age: Int) {}클래스 선언부에 적지 안하도 알아서 생성해준다. 기본 생성자의 인자가 외부 주입이거나, 여러개가 필요할 땐 내부에서 선언한다. class Person() { // 기본 생성자의 인자 없는 경우 constructor(name: String, age: Int): this() } class Person(name: String) { // 기본 생성자의 인자가 있는 경우 constructor(name: String, age: Int): this() }기본 생성자 외 생성자는 this()를 꼭 호출해야한다 클래스 생성할 때 new 키워드 사용하지 않는다. 디폴트 생성자에 기본값 넣기.. 2023. 9. 25.
[Java] lazy evaluation(short circuit, loop fusion), Stream API lazy evaluation이란 어느 조건이 이미 달성하여 생략해도 상관없는 그 다음 행위를 생략하는 일종의 최적화 기능이라 할 수 있습니다. 비교 연산자에서의 short circuit이 그 예가 되겠습니다. 어느 조건에서 나머지 조건에 상관없이 그 결과가 정해졌을때 나머지 조건에 대한 연산은 실행하지 않는 것을 말합니다. static boolean executeFlag = false; public static void main(String[] args) { Supplier returnTrue = () -> true; Supplier returnFalse = () -> false; Supplier updateFlag = () -> { executeFlag = true; return true; }; if .. 2023. 7. 26.
[Java] effectively final, lambda lambda식에서는 외부지역변수를 사용할땐 final이거나 effectively final 해야한다. lambda식도 함수이니 실행되는 함수와 외부지역변수를 가진 함수와 다른 쓰레드에서 동작할 가능성이 있다. 이 때 두 쓰레드 사이에 외부지역변수에 대해 완벽하게 sync를 잡아줄 방법이 없다. lambda식 입력이 같다면 그 결과도 같아야만한다.(순수함수) 일단 둘 사이의 쓰레드가 다를 때 외부지역변수의 데이터를 가진 쓰레드가 먼저 끝나 데이터가 사라질 수 있다. 그렇기에 lambda식에서는 변수를 복사하여 사용한다. (람다 캡쳐링) (클래스 변수, 인스턴스 변수는 공유 자원이니 접근 가능) 즉, 멀티쓰레딩 환경에서 정상적인 결과를 보장하기 힘들어 외부지역변수를 복사하여 사용한다. 그리고 이 복사한 값에.. 2023. 7. 25.
[JAVA] Intellij JDK 한글 깨짐 (Open JDK18 이전, 이후 나눔) 사건 발단 '본 글은 windows10 환경에서 Intellij를 사용하며 겪었던 한글 깨짐 문제의 회고입니다.' Intellij를 사용하는데 openJDK 18 버전을 깔고나서 뭔 짓을 해도 콘솔에서 한글 출력이 (UTF-8 인코딩) 안 됐습니다. 찾아보니 18에 들어오면서 UTF-8 인코딩에 있어 살짝 변경이 있었습니다. 해결 방안 Open JDK 18 이전 Intellij의 상단 내비게이션 바의 File - Settings에 들어가서 File Encoding 메뉴의 Global Encoding, Project Encoding 그리고 Proprties Files를 UTF-8로 맞춥니다. 이후 Intellij 상단 내비게이션 바의 help 탭에서 Edit custom VM options부분을 클릭하여 .. 2022. 7. 14.
[JAVA] java 입장에서 call by value와 call by reference의 짧은 고찰. 자바는 기본적으로 call by value로써 정보들이 다뤄진다. c++와 같이 call by refernce를 지원하면 좋지 않을까 생각하였지만 잠시 뒤 꼭 그러할 필요는 없겠구나 생각이 들었다. c++같은 언어에서 call by reference를 사용하는 이유야 몇가지 있겠지만, 대표적으로 의도치 않은 객체 자체 복사같은 오버헤드를 막기 위해서가 그 중 한 가지이다 생각한다. 이 경우야 c++는 객체가 스택에도 만들어질 수 있어 객체 자체의 복사가 큰 비용이 들 수 있지만 java는 객체, 즉 인스턴스를 전부 jvm의 heap영역에서 생성하고 관리한다. jvm의 heap 인스턴스를 두고는 이의 위치를 참조하여 데이터를 다루는 것이다. call by value를 통해 지나친 낭비가 일어날 상황이 다른.. 2022. 6. 26.
[JAVA] 클래스 메서드와 인스턴스 메서드 클래스의 내부에는 클래스 메서드와 인스턴스 메서드가 존재한다. 클래스 메서드는 메서드 앞에 static을 붙임으로 선언할 수 있고 클래스 메서드는 객체를 생성하지 않고도 다음과 같은 식으로 호출할 수 있다. '클래스이름.메서드이름(매개변수)' 그에 반해 인스턴스 메서드는 static을 붙이지 않고 선언하며 객체를 생성해야만 호출할 수 있다. 이는 JVM가 관리하는 메모리 영역에서 생성되는 시점에 따른 차이 때문이다. 클래스 메서드(클래스변수 포함)는 해당 클래스가 사용될 시 JVM의 메서드 영역에 저장된다. 인스턴스 메서드(인스턴스 변수 포함)는 그 인스턴스가 생성될 때 메모리 상에 유효하게 되어 사용이 가능하다. 그렇기에 늘 상 클래스 메서드가 인스턴스 메서드보다 먼저 태어난다. 한 클래스 안에 클래스.. 2022. 6. 25.
[JAVA] JVM의 메모리 구조 응용프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다. 대표적인 세 영역으로 (method Area, call stack, heap)가 있다. 메서드 영역 (method Area) 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 그 클래스의 클래스 파일을 읽어 분석하고 클래스에 대한 정보를 이 영역에 저장한다. 저장되는 클래스 데이터에는 클래스변수도 저장된다. 힙 (heap) 인스턴스가 생성되는 공간. 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에서 생성된다. 인스턴스변수들도 이 곳에서 저장된다. 호출스택 (call stack 혹 execution stack) 호출스택은 메서드의 작업에 필요한.. 2022. 6. 25.
[JAVA] 클래스변수, 인스턴스변수, 지역변수 클래스에서의 변수는 세 종류로 나눌 수 있는데, 이들을 구분하는 기준은 '변수의 선언된 위치'라고 할 수 있다. 변수의 종류 선언위치 생성시기 클래스변수 클래스 영역 클래스가 메모리에 로딩될 때 인스턴스변수 인스턴스가 생성될 때 지역변수 클래스 영역 이외 변수 선언문이 수행되었을 때 인스턴스변수 인스턴스변수는 클래스 영역에 선언되며 클래스의 인스턴스를 생성할 때 만들어진다. 그러니 항상 인스턴스를 먼저 만들어야한다. 모든 인스턴스는 각자의 고유한 저장공간을 가져 자신만의 값을 가질 수 있다.(다른 인스턴스로부터 독립적) 클래스변수 변수 앞에 static 키워드를 붙이고 선언한다. 클래스변수는 인스턴스변수와 반대로 모든 인스턴스들이 공통적으로 공유하는 변수이다. 만들어지는 시점은 클래스가 메모리에 로딩될 .. 2022. 6. 25.