다양한 OS에서 독립적으로 실행시키기 위해서, 이가 가능한 이유는 JVM(Java Virtual Machine) 덕분이다. JVM은 컴파일된 코드를 실행시켜주는 가상의 컴퓨터 역할을 한다.
GC는 JVM의 Heap Area만 다룬다. GC는 메모리 관리 역할을 담당하는데 자동으로 사용하지 않는 객체를 소멸시키는 역할을 한다. GC 동작 과정 중 stop-the-world가 발생하는데 이는 GC를 실행하기 위해 JVM이 앱 실행을 멈추는 것이다.
GC를 해도 더이상 사용 가능한 메모리가 없을 경우에는 OutOfMemoryError가 발생한다.
프로그램의 실행 중 추가적인 시간과 메모리, 자원이 소요되는 것
ex ) 10초가 걸릴 기능이 다른 간접적인 원인으로 20초가 걸리면 오버헤드는 10초이다.
함수 호출 방식 종류
자바는 기본적으로 call by value 방식을 선택하고 있다. 따라서 원본 데이터가 변형될 가능성이 전혀 없다 ( 자바는 call by reference 방식으로 넘길 방법이 없다 )
캐스팅은 변수가 원하는 정보를 다 가지고 있는 것이다. 캐스팅은 다형성과 상속을 활용하기 위해 필요하다.
Parent p = new Child();
Parent p = new Child();
Child c = (Child) p;
자바는 컴파일러가 박싱과 언박싱이 필요하 상황에 자동으로 처리해 줌
// 오토 박싱
int i = 10;
Integer num = i;
// 오토 언박싱
Integer num = new Integer(10);
int i = num;
멀티태스킹은 두 가지 이상 작업을 동시에 하는 것을 말한다. 자바에서는 하나의 프로세스 안에서 여러개의 스레드가 동시에 작업을 수행할 수 있도록 지원한다.
// 스레드 클래스 구현
public class ThreadTest implements Runnable {
public ThreadTest() {}
public ThreadTest(String name){
Thread t = new Thread(this, name);
t.start();
}
@Override
public void run() {
for(int i = 0; i <= 50; i++) {
System.out.print(i + ":" + Thread.currentThread().getName() + " ");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class MyThread extends Thread {
@Override
public void run() {
// 수행 코드
}
}
// 스레드 생성
public static void main(String[] args) {
Runnable r = new MyThread();
Thread t = new Thread(r, "mythread");
}
Thread는 run이 아닌 start로 실행해야 한다.
실질적으로 멀티태스킹하려면 두개 이상의 call stack을 생성하여 콜스택을 번갈아가면서 작업을 해야 하는데 run의 경우 main의 call stack을 사용하기 때문에 새로운 콜스택을 만들어 contexts switching을 통해 동작하게끔 하는 start 함수를 사용해야 한다.
여러 스레드가 같은 프로세스의 자원 공유하면서 작업하면 서로의 작업이 다른 작업에 영향을 주기 때문에 동기화가 필수적이다.
스레드 동기화를 위해 임계 영역을 정해 lock을 하나의 스레드에게만 빌려주고 작업 수행이 완료되면 lock을 반납한다.
List<String> names = Arrays.asList("Sehoon", "Songwoo", "Chan", "Youngsuk", "Dajung");
names.stream()
.map(name -> name.toUpperCase())
.forEach(name -> System.out.println(name));
Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Optional<Integer> sum = numbers.reduce((x, y) -> x + y);
sum.ifPresent(s -> System.out.println("sum: " + s));
Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Optional<Integer> sum = numbers.reduce((x, y) -> x + y);
sum.ifPresent(s -> System.out.println("sum: " + s));
// sum 55
System.out.println(names.stream()
.map(String::toUpperCase)
.collect(Collectors.joining(", ")));
[Keycloak] 한국어 설정 추가, 국제화 메시지 등록하기 (0) | 2022.05.26 |
---|---|
[Spring] 스프링 파일 업로드/다운로드 총 정리, 쉽게 알아보자 (0) | 2022.05.25 |
[Spring] Exception 개념/사용법 총정리, 쉽게 알아보자 (0) | 2022.05.24 |
[Keycloak] 회원가입 폼 설정 및 Custom User Attribute 값 가져오기 (0) | 2022.05.24 |
[Keycloak] WildFly 버전 외부 DB(Mariadb) 연동 방법 (0) | 2022.05.24 |