[ 백엔드 개발 ]/[ Java,Kotlin ](18)
-
[java] Thread Synchronization (Monitor)
Race Condition - 멀티 쓰레드 환경에서 발생할 수 있는 상황 - shared resource에 대해서 2개 이상의 task들이 동시에(concurrent, parrallel 모두 해당) 접근을 시도할 경우 이들 간의 순서로 인해 결과 값에 영향을 줄 수 있는 상태를 의미 - 이로 인해 shared resource에 대한 연산에 대해서 일관성이 깨진 상태의 결괏값이 도출될 수 있음 The degree of multiprogramming : single-processor가 수용할 수 있는 최대 thread 개수 Mutual exclusion - Race Condition을 해결하기 위한 개념 - 한 시점에 하나의 task만이 shared resource에 접근할 수 있음 (상호 배제) - 단, ..
2021.12.28 -
[java] ArrayList vs LinkedList
ArrayList 배열은 크기가 지정되면 고정되지만 ArrayList는 크기 고정과 상관 없이 추가 삭제를 진행할 수 있다. 하지만 추가했을 때 배열이 동적으로 늘어나는 것이 아니라 용량이 꽉 찼을 경우 더 큰 용량의 배열을 만들어 옮기는 작업이 진행된다. 즉, ArrayList는 겉 보기에 리스트 같지만, 내부적으로는 배열로 존재한다. 기본적으로 new ArrayList()를 하게 되면 위와 같은 생성자가 호출되는데, 이때 기본적으로 ArrayList의 크기(capacity)는 10으로 지정되어 있다. 여기서 원소 10개 이상을 add했을 경우에는 다음과 같이 배열을 옮기는 과정이 발생한다. cf. 위 add 메소드에서 볼 수 있듯이 ArrayList는 elementData[] 라는 배열로 관리된다. ..
2021.12.14 -
[java] 가비지 컬렉션(GC) 기본개념
Garbage Collection 이란?가비지 컬렉션은 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요 없게 된 영역을 해제하는 기능이다. JVM에서 제공하는(JVM 중에서도 Execution Engine) 주요 기능 중 하나이다. 참고로 가비지 컬렉션은 JVM만의 기능은 아니다. Unreachable ObjectStack frame이 Stack에서 pop되면 해당 메소드가 참조하던 레퍼런스도 사라진다. 이때 heap에는 객체 데이터가 그대로 남게 되는데, 이를 unreachable object라 한다. 이러한 unreachable object는 가비지 컬렉터의 대상이 된다. 가비지 컬렉션 주요 과정가비지 컬렉터가 스택의 모든 변수를 스캔하면서 각각 어떤 객체를 참..
2021.09.15 -
<추천글>[java] Runtime Data Areas (JVM 메모리 구조)
Runtime Data Areas는 JVM이 운영체제로부터 할당받는 메모리 영역을 의미한다. JVM의 클래스 로더가 메모리에 바이트코드를 올리면, JVM의 Execution Engine은 JVM 메모리에 올라온 바이트코드들을 명령어 단위로 하나씩 가져와서 기계어로 변환시킨다. 변환된 기계어는 JVM의 메모리구조(Runtime Data Area)의 각 영역에 배치되며 GC와 함께 실행된다. Runtime Data Areas (5개) * 오라클(과거의 썬 마이크로시스템즈)의 HotSpot JVM 기준 모든 Thread 공유 1) Method(Static) Area Method Area, Class Area, Code Area, Static Area 라고도 불린다. JVM의 Execution Engine(실행..
2021.08.24 -
[java] 자바 실행 과정 deep dive
자바는 OS와 독립적으로 실행시킬 수 있다. 그 이유는 JVM이 OS에 의존적이기 때문인데, 즉, OS마다 다른 JVM이 존재하기 때문이다. C/C++는 링커, 로더를 포함한 운영체제 바로 위에서 직접적으로 실행되므로, 빠르고 가볍다. 하지만 개발에 있어서 그만큼 메모리 회수 등 개발자가 신경써야 할 부분이 많다. 또한 C/C++ 등의 전통적인 언어는 컴파일 플랫폼(CPU 아키텍처 16bit, 64bit 등 및 OS)에 따라 자료형형의 크기가 변한다. 그래서 윈도우에서 컴파일한 C/C++파일은 리눅스에서 안 돌갈 수도 있다. JVM은 이러한 문제를 근본적으로 해결한다. 자바 소스코드(.java)가 자바 컴파일러(javac.exe)를 거치고 나면, 자바 바이트코드(.class)를 생성하는데, 이 자바 바..
2021.08.24 -
[java] String = "" 과 new String("") 차이
public class HelloWorld { public static void main(String[] args) { String str1 = "hello"; String str2 = new String("hello"); String str3 = new String("hello"); } } 위 코드에서 str1처럼 바로 " "을 통해 문자열을 선언하면 heap에 있는 String constant pool에 "hello"라는 문자열이 있는지 탐색하고 없을 경우 생성하지만 이미 존재한다면 해당 문자열을 참조한다. str2의 경우 str1과 같이 "hello"라는 문자열을 string constant pool에서 찾고 없다면 새로 만드는 과정은 동일하지만 추가적으로 string pool이 아닌 heap메모리..
2021.08.09 -
[java] interface의 진짜 목적
결론부터말하면 Interface는 abstract method로만 구성된 클래스로써 추상체로 역할을 하며 구현체와 호출하는 쪽 사이의 dependency를 느슨하게 한다. 특히 의존성을 역전(Dependency Inversion)시킴으로써 객체 간 결합도(coupling)를 줄인다. [예제1] public class UserService implements Login{ private KakaoLogin login; private NaverLogin login; // 이하 생략 } [예제2] public class UserService implements Login { private Login login; public UserService(Login login) { this.login = login; } ..
2021.08.04 -
<추천글>[JAVA] 개발하면서 알아야할 기본사항1
1. Java의 Call by Reference 자바는 기본적으로, 객체에 대해서는 call-by-reference이지만, 8개의 primitive type에 대해서는 call-by-value가 적용된다고 생각하면 편합니다. [예제1] public class HelloWorld { public static void main(String[] args) { HelloWorld b = new HelloWorld(); int a = 100; b.doSomething(a); // 100이라는 숫자 자체가 넘어간다. System.out.println(a); // 100이 출력된다. } private void doSomething(int a) { a *= 2; } } 위 예제1에서 변수 a를 초기화하면 메모리의 4b..
2021.08.04