- 직렬화(Serialization) 란? (출처:https://nesoy.github.io/articles/2018-04/Java-Serialize)
- 특정 시스템 내부에서 사용되는 '데이터'를 -> '바이트(byte)' 화하여 전송하는 기술.
- Java의 Serializable : java.io.Serializable 인터페이스를 상속받아, 객체 직렬화 가능.
- (타 시스템간의 데이터 전송으로 사용되는~ CSV, JSON, XML 등등도 일종의 직렬화 형태)
- 동기(Synchronous)와 비동기(ASynchronous) 그리고 블록과 넌블록
- Sync : 시스템간 결과를 직접 바로 받는것.
- ASync : 시스템간 상호작용이, 시차를 두고 일어나는것.
- Block : 작업을 마칠때까지, 리턴X.
- Non-Block : 작업을 바로마칠 수 없으면, 리턴O.
- 예)
- Sync Block : 결과가 나올떄까지 기다림.
- Sync Non-Block : 결과가 없으면, 끝... 있으면 받음.
- ASync Block (?) : 요청을 하고, 결과를 주지않지만... 그냥 기다림. (논리적으로 이상한 상황이됨!)
- ASync Non-Block : 요청을 하고, 바로 끝. 추후 간접적으로 받음.
- multi-thread 환경에서의 동기화. ()
- Mutex
- MUTual EXclusion. 말그대로, "상호 배제" 라는 의미.
- 리소스에 대한, 일종의 Locking 메커니즘. (열쇠가 있어야 접근이 가능함)
- Semaphore
- 하나의 리소스에 접근 할 수 있는 Counter를 관리하는 메커니즘.
- 1개의 Counter는 Binary Semaphore라 하고, 개념적으로 Mutex와 같음. (2개 이상은 Counting Semaphre)
- Critical Section
- 오직 하나의 thread만 접근이 가능한 구간.
- 동일한 process에서 또다른 thread의 접근을 금지하는 것으로, retrun 혹은 waiting 처리 해야함.
- Monitor
- Mutex(Lock) 와 ConditionVariables(Queue) 개념을 가지는 메카니즘.
- Java에서는 Object Class의 wait(),notifyAll(),notify() 가 ConditionVariables 역할을 함으로, 모든 객체가 Monitor를 가지고 있고 보면 된다.
- 즉, "synchronized 키워드"를 선언하여~ multi-thread 환경에서 손쉽게 자동 동기화처리를 하는것 이다.
- Mutex
- "Java8 Stream은 loop가 아니다." (출처:https://www.popit.kr/java8-stream은-loop가-아니다)
- Stream은 직관적, Code간결성, Lambda연동, 병렬처리 등등의 많은 장점에 신세경이다...
- 하지만, 단순히 loop문의 대체가 아니라는 사실을 인식하고~ 상황에 맞게 적절하게 사용해야 한다.
- Stream : 자료의 흐름.
- Stream의 forEach : loop문이 아님.
- 중간에 break 할 수 없고... return 으로 중지해야 함.
- filter를 이용하여, forEach를 제한 함. 예) IntStream.range(1,100).filter(i -> i<=50).forEach(System.out::println);
- Java String 관련... (출처:https://jeong-pro.tistory.com/85)
- String
- immutable 함. 즉, new 생성되면~ 해당 인스턴스 메모리는 절대 변하지 않음.
- '+연산자' 나 concat를 사용하면, 새로운 인스턴스 메모리로 할당 됨.
- multi-thread에서 동기화를 전혀 신경쓸 필요가 없지만~ 반복적인 메모리 GC가 유발되면... 성능저하.
- StringBuilder 와 StringBuffer
- mutable 함. 즉, new 생성이후~ 해당 인스턴스 메모리가 변화 될 수 있음.
- StringBuilder는 thread-safe하지 않지만, 더 빠른 성능처리.
- StringBuffer는 "synchronized 키워드"으로 동기화 가능. multi-thread에 적합.
- // TODO : 신입개발자면접기초
- String
- Java Exception (출처:http://www.nextree.co.kr/p3239)
- Throwable
- <- Error : (system-level 에서 발생하는 오류. 심각한 것이지만, 개발자가 신경쓸필요는 없음.)
- <- Exception : (개발자의 구현에 따라 발생하는 예외. checked Exception들)
- <- RuntimeExceptoin : (개발자가 꼭 처리 할 필요없는 unchecked Exception들)
- Throwable
- Java
- 구동
- 1) 컴파일러를 통해서, Code 검증 및 ByteCode(.CLASS) 생성.
- 2) ByteCode를 처리 할 수 있는 JVM으로 가져옴.
- 3) ByteCode 검증 및 인터프린트(재해석).
- 4) ByteCode를 -> BinaryCode으로 변경.
- 5) Runtime 과정에서, Class의 static 변수를 초기화 홤.
- 6) static 블록 수행.
- 7) instance 블록 수행.
- 8) 생성자 호출.
- 9) main 함수 호출.
- JVM 메모리 (출처 : // 더더더)
- Class 영역
- : method area, code area, static area로 불림. 클래스 멤버번수들의 이름, 타입 등등. 메소드의 이름 타입 변수 등등. Type 이 Calss 인지 Interface 인지. 상수 정보. Static 변수
- Stack 영역
- : 메소드 호출시마다 각각의 스택프레임(해당 메소드만을 위한 공간) 생성 메소드 안에서 사용되는 값들, 매개변수 지역변수 리턴값 등등.. 재귀함수호출시 재귀함수 호출 뒤에 결과로 연산을 하게되면 스택에서 앞부분의 메소드 정보를 참조해야하기 때문에 stackoverflow 발생. 꼬리재귀로 해결
- : (재귀함수 장단점 : 결과적으로 반복문이지만 메모리나 속도측면에서 좋지않다. 하지만 H/W가 좋아졌기때문에 어느정도 상쇄되고 stackoverflow 등의 문제 만 발생하지 않는다면 가독성에서 더 좋다.)
- Heap 영역
- : new 로 만들어지는 object가 저장. 클래스영역에 로드된 클래스만 생성 가능. Garbage collector 를통해 반환됨. - GC 구조 참고
- Native 메소드 영역
- : 자바 외 다른언어에서 제공되는 메서드들이 저장되는 공간
- PC 레지스터
- : Thread생성될때마다 할당. 현재 실행되는 부분의 명령과 주소
- Class 영역
- GC (출처 : // 더더더)
- Young 영역
- Eden 영역 : 새로생성한 대부분의 객체가 위치
- Eden에서 GC발생 후 살아남은 객체틑 survivor영역중 하나로 이동.
- Survivor 중 하나가 가득 차면 GC발생 후 살아남은걸 다른 survivor로 이동 이과정 반복후 young 에 공간이 없으면남은건 OId로 이동(Minor GC)
- Old 영역
- Old 영역이 가득차면 GC를 실행한다. (Major GC, Full GC)
- Serial GC - Old 에서 안쓰는 객체 식별해 필요없는것들은 지움. 순차적으로 cpu 1개
- Parallel GC - Serial 과 기본적으로 같고 CPU 여러개
- Parallel Old GC(Parallel Compacting GC) : Old GC 에 새로운 알고리즘 적용(모름)
- Concurrent Mark & Sweep GC(이하 CMS) :
- G1(Garbage First) GC : 가장 빠름. JDK7 부터 정식제공
- Young 영역
- 문자 인코딩
- Java는 Modified UTF-8 문자 인코딩을 사용함.
- UTF-8 이란?
- UNICODE TRANSFORMATION FORMAT.
- UNICODE를 전송할때 사용하는 형식. (통신에 UNICODE를 그대로 쓰기 힘들다고 함)
- UTF-8, UTF-16, UTF-32 등이 있음.
- UNICODE 란?
- 4byte를 사용하는 범위에서 전세계 모든 문자를 표현 함.
- 변수
- boolean : 1 bit (true or false)
- byte : 8 bit (-128 ~ 127)
- char : 16 bit (\u0000 ~ \uFFFF)
- short : 16 bit (-32768 ~ 32767)
- int: 32 bit (-2147483648 ~ 2147483647) (2,147,483,647 = 20억)
- long : 64 bit (-9223372036854775808 ~ 9223372036854775807) (92,23,372,036,854,775,807 = ... )
- float : 32 bit (1.40239846E-45f ~ 3.40282347E+38f)
- double : 64 bit (4.94065645841246544E-324 ~ 1.79769313486231570E+308)
- ...
- 구동
-끝-
'랭귀지&프레임웤' 카테고리의 다른 글
Python 이란? (0) | 2019.11.06 |
---|---|
STS 개발 (0) | 2019.11.06 |
Spring Cloud 란? (0) | 2019.11.06 |
Spring Batch 란? (0) | 2019.11.06 |
Spring 개론 (0) | 2019.10.30 |