String Pool String을 이용하여 문자열을 생성하는 방법은 2가지가 있다. 문자열 리터럴을 이용하여 생성 new 연산자를 통해 String 객체를 생성하는 방법 위 2개 방법 모두 Heap 영역에 데이터가 저장되는것은 동일하지만, 리터럴의 경우는 String Pool 이라는 곳에 생성된다. 리터럴 방식으로 문자열을 생성할 때, 만약 String Pool에 같은 문자열이 존재하면 새로 만들지 않고, 만들어진 문자열을 바라본다. 그래서, 아래와 같이 같은 문자열인 경우 동일한 주소를 바라보고 있다. String greet = "Hello"; String greet2 = "Hello"; System.out.println(System.identityHashCode(greet)); System.out...
String String은 불변성(Imutable)을 가진 객체로 + 연산자를 통해 문자열을 생성하는 경우, 새로운 문자열을 반환한다. String greet = "Hello"; System.out.println(greet.hashCode()); greet += " World"; System.out.println(greet.hashCode()); 69609650 -862545276 + 연산 후 주소값이 달라짐. 즉, 가리키는 문자열이 달라짐 StringBuilder & StringBuffer StringBuilder와 StringBuffer는 String에 문자열을 추가하면 새로운 객체를 반환하는 단점을 보완하여 만들어진 클래스이다. StringBuilder와 StringBuffer는 버퍼(Buffer)..
JVM GC 동작 순서 요약하면 GC 동작은 아래 3 STEP으로 나눠진다. Heap 영역에 존재하는 객체들에 대해 접근 가능한지 확인한다. GC Root에서 부터 시작하여 참조값을 따라가며 접근 가능한 객체들에 Mark하는 과정을 진행한다. Mark 되지 않은 객체 즉, 접근할 수 없는 객체는 제거(Sweep) 대상이 된고, 해당 객체들을 제거한다. 접근 가능한 객체 판단 과정 GC Root에서 시작해서 참조하는 객체를 찾고, 또 그 객체가 참조하는 객체를 찾아가며 Mark 한다. (아래 그림 참고) Mark 되지 않은 객체는 접근할 수 없는 객체 (Unreachable Object)로 판단하고 메모리를 돌며 제거(Sweep)한다. GC Root가 될 수 있는 대상 JVM 메모리의 Stack 영역에 존..
GC (Garbage Collector) JVM에는 메모리를 자동으로 관리해주는 특징이 있는데, 이 역할을 Garbage Collector(가비지 콜렉터)이 한다. 정확히는 JVM 메모리 중 Heap 영역에서 사용하지 않는 객체를 삭제하여 관리해줌 Stop The World GC에는 stop-the-world 라는 것이 존재하여, 메모리가 관리되는 동안 Java Application이 멈추는 현상을 말한다. stop-the-world가 발생하는 동안 GC 스레드를 제외한 모든 스레드가 멈춤 stop-the-world가 발생하는 시간이 줄이기 위해 JVM 튜닝을 하곤하는데, 튜닝을 위해서는 JVM GC에 대해 살펴볼 필요가 있다. 일반적인 GC 구조 일반적인 GC 구조는 Young Generation과 O..
Runtime Data Area JVM 메모리를 뜻함 Runtime Data Area는 5개 영역으로 나눠짐 Method Area, Heap, Stack, PC Register, Native Method Area Method Area와 Heap은 모든 스레드가 공유하는 공간 Stack, PC Register, Native Method Area는 각각의 스레드가 하나씩 가지는 공간 Method Area (메소드 영역) class data와 static 변수가 저장되는 공간 모든 스레드(Thread)가 공유하는 공간 JVM이 실행될때 생성됨 Heap (힙 영역) new 를 통해 동적으로 생성되는 객체가 저장되는 공간 (또는 배열) Heap에 저장된 데이터는 메모리 관리가 필요한 GC 대상 만약 참조하지 않는..
JVM Java Virtual Machine의 약자. Java 프로그램이 플랫폼에 의존하지 않고, 어디서든 동작 가능하도록 하기 위한 Java 가상 머신이다. 단, Java 프로그램은 JVM 위에서 동작하기 때문에, JVM에 의존성을 가짐 C/C++ 언어는 CPU 아키텍처, 운영체제 등 플랫폼 환경에 의존성을 가지기 때문에, 플랫폼이 바뀌면 제대로 동작하지 않는 문제가 있음 (크로스 컴파일을 통해, 타겟 플랫폼에 맞춰서 컴파일을 해줘야 함) Java의 경우 이러한 문제를 해결하기 위해 JVM을 만들었음 JVM 아키텍처 JVM은 아래와 같이 크게 Class Loader, Runtime Data Area(JVM 메모리), Execution Engine 으로 나눠짐 Class Loader Java 바이트 코드..
아스키코드 ASCII 아스키코드는 현재도 많이 사용되는 인코딩 방식 중 하나로, 영어 대/소문자 숫자, 공백, 특수 문자들을 표현 할 수 있음 총 표현할 수 있는 문자는 0 ~ 127로 총 128개의 문자를 표현할 수 있음 과거에는 7비트를 이용해서 아스키코드를 표현했지만, 현대에는 편의를 위해 8비트(1Byte)로 표현 Java로 출력해보면 어떤 문자들을 표현 할 수 있는지 확인 할 수 있음 아래에서 일부 안보이는 문자들도 존재 for(int i=0; i
문자 인코딩 (charater encoding) 컴퓨터는 Hello, World와 같이 인간의 언어를 이해할 수 없음. 컴퓨터가 이해할 수 있는 언어는 2진수뿐이다보니, 위와 같은 인간의 언어를 이해 할 수 있도록 문자를 2진수로 변환하는 작업이 필요함 2진수와 문자를 1대1로 대응하는 규칙을 통해 문자를 처리하는데, 이러한 대응 규칙에는 ASCII, EUC-KR, UTF-8, UTF-16, UTF-32 등 여러개의 규칙이 존재함 예를들어, 아스키코드에서는 2진수 01000001 (10진수로 65)는 문자 A로 표현 됨 JAVA 예시 코드 int num = 65; System.out.println(Integer.toBinaryString(num)); // 2진수 System.out.println((cha..
Infix Functions (중위 함수) 중위 함수를 생성할 때는 infix fun 예약어를 사용한다. fun main() { // Infix 함수 정의 infix fun Int.times(message: String) = message.repeat(this) // 'Bye' 를 2번 반복해서 출력하는 중위 함수(Infix Functions) println(2.times("Bye ")) println(2 times "Bye ") // .과 ()를 생략하여 표현 할 수 있음 } 원래는 Int.times(String) 형태로 호출하지만, .과 ()를 생략하여 표현 할 수 있음 Bye Bye Bye Bye 결과 동일 다른 예시 fun main() { println("Ferrari" to "Katrina") ..
Kotlin function 코틀린에서 함수를 생성할 때는 fun 키워드를 사용한다. fun main(args: Array) { printMessage("World") printMessage("Kotlin") } fun printMessage(message: String): Unit { println("Hello, $message") } Hello, World Hello, Kotlin message 라는 문자열 매개변수를 받아서 콘솔에 출력하는 메소드. Unit은 Java의 void와 비슷한 역할을 한다. Unit을 return 한다는 것은 '반환값이 없다'는 뜻 위 메소드처럼 한 줄로 끝나는 경우, 아래처럼 메소드를 작성할 수 있다 fun printMessage2(message: String): Uni..