본문 바로가기

프로그래밍 언어/Java

(39)
jvm, jre, jdk 확실하게 구별하자 자바에서 사용하는 용어중에 혼동하기 쉬운 용어들은 jvm, jre, jdk에 대해 확실히 정리해보자. JVM? JVM은 자바 가상머신(Java Virtual Machine)의 약자이다. JVM은 class파일을 compile하여 binary file을 만들수 있다. bytecode로 이루어진 binary file로 complie로 class들을 class Loader를 통해 적재후 실행한다. JRE? JRE는 자바 실행환경(Java Runtime Environment)의 약자이다. JRE는 JVM 이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있다. JRE는 JVM의 실행환경을 구현했다고 할 수 있다. JDK JDK는 자바 개발도구(Java Development Kit)..
Java Volatile은 무엇이고 왜 필요할까? Java Volatile이란? volatile keyword는 Java 변수를 Main Memory에 저장하겠다라는 것을 명시하는 것이다. 그러므로 매번 Read/Write 작업을 할때 CPU Cache에 값을 저장하거나 읽는것을 넘어서 Main Memory영역까지 저장하고 읽는것을 의미한다. 그렇다면 왜 필요할까? 위의 그림을 자세히 살펴보자. CPU는 중간에 Cache Memory를 경우하고 Main Memory에 접근한다. 왜 그럴까? volatile 변수를 사용하고 있지 않는 MultiThread 어플리케이션에서는 Task를 수행하는 동안 성능 향상을 위해 Main Memory에서 읽은 변수 값을 CPU Cache에 저장하게 됩니다. 만약에 Multi Thread환경에서 Thread가 변수 값을 ..
enum과 활용사례 enum이란? Enum이란 Enumeration의 앞 글자로 열거라는 의미를 갖는다. 관련이 있는 상수들의 집합 어떤 클래스가 상수만으로 작성되어 있으면 반드시 class로 선언할 필요는 없습니다. 이럴 때 class로 선언된 부분에 enum이라고 선언하면 이 객체는 상수의 집합이다. 라는 것을 명시적으로 나타냄 활용사례 1 CODE용 테이블 대체 개발을 진행하다 보면 코드용으로 테이블을 만들어야 하는 경우가 생깁니다. 예를 들면, 입금 여부를 나타낼때 1번은 입금, 2번은 출금이라고 할때 해당 내용을 저장할 테이블이 필요합니다. 위와 같은 테이블이 필요하다는 이야기이고, 실제로 위와 같은 코드성 테이블을 만들고 코드를 관리할 경우 다음과 같은 문제에 마주칩니다. 문제점 1 다른 테이블에는 코드인 1 아..
접근제어자 private, public, protected 등의 접근제어자에 대해 알아보자. 자바는 크게 4가지의 접근 제어자로 나눌수 있다. private public protected default 많은 사람들이 default 접근 제어자에 대해서 잘 모르는 경우가 많다. 이번에 확실하게 알아보자. private 접근제어자가 private으로 설정되었다면 private 이 붙은 변수, 메소드는 해당 클래스에서만 접근이 가능하다. public class Sample { private String secret; private String getSecret() { return this.secret; } } 위 예제의 secret 변수와 getSecret 메소드는 오직 Sample 클래스에서만 접근이 가능하고 다른 클..
Hash Map과 Hash Collision 문제 Hash Map & Hash Table 두 구조 모두 Key, Value로 데이터를 저장하는 자료구조입니다. Hash Map : JDK 2.0부터 생긴 API로 꾸준히 업데이트 되고 있습니다. Hash Table : JDK 1.0부터 있던 API로 현재는 사용되고 있지 않습니다. 두 자료구조의 가장 큰 차이로는 동기화의 차이가 있습니다. HashMap의 경우 동기화를 지원하지 않기 때문에 멀티 쓰레드 환경에서 문제가 될수 있습니다. 반면에 HashTable의 경우 동기화를 지원하여 멀티 쓰레드 환경에서 안전합니다. 물론, 현재 동기화를 지원하는 ConcurrentHashMap이라는 API를 지원하기 때문에 동기화 때문에 HashTable을 사용할 필요는 없습니다. Hash Map 작동방식 Hash Map..
GC(Garbage Collector) Java로 실행되는 Application들은 모두 JVM위에서 실행된다. 따라서 JVM이 작동하는데 있어서 메모리 구조와 GC는 애플리케이션의 응답 시간과 성능에 밀접한 관계를 맺고 있다. GC란? GC(Garbage Collection)는 자바 애플리케이션에서 사용하지 않는 메모리를 자동으로 수거하는 기능을 말한다. C/C++ 같은 언어는 메모리를 할당하고 직접 해제해야했지만, 자바에서는 GC를 이용하여 개발자들이 메모리 관리를 비교적 신경쓰지 않아도 된다. JVM의 메모리 영역 GC의 동작 방법을 이해하려면, 먼저 자바의 메모리 구조를 이해할 필요가 있다. 일반적으로 애플리케이션에서 사용되는 객체는 오래 유지되는 객체보다 잠시 사용되는 경우가 많다. 자바에서는 크게 두 영역으로 메모리를 구분한다. Y..
자바 Transactional 자바의 Trasncation은 더 이상 쪼갤 수 없는 실행이다. 하나의 실행단위이기에 여러 Thread에 실핼될수 있고 그 중에서는 동시에 실행되서는 안되는 critical한 Transaction이 존재할수 있다. 이를 위해 특정 transcation을 고립시켜서 실행시킬수 있게 해주는 Spring transcational annotation이 옵션에 대해 알아보자. 발생할수 있는 현상과 현상을 예방할수 있는 방법으로 구성하도록 하겠다. 트랜잭션 동시성과 관련해서 발생할수 있는 현상은 다음과 같은 3가지가 존재한다. 1. Dirty Read Dirty Read는 위의 그림을 보면 쉽게 이해가 가능합니다. 1) Transaction B는 특정 데이터베이스 컬럼값을 Update를 사용해 수정하고 아직 Com..
Interface가 왜 필요할까? 우리는 프로그래밍을 하면서 Interface를 선언하고, 그 Interface를 구현하면서 프로그래밍을 진행한다. 그렇다면 왜 interface가 필요할까? 인터페이스의 정의는 다음과 같다. 인터페이스 모든 기능을 추상화로 정의만 하고 구현은 하지 않은것을 의미한다. 모든 기능을 추상화하였다는 의미이다. 그렇다면 추상화란 왜 필요할까? 예를 들어서, Payment System을 개발한다고 생각해보자. Payment System에는 cashPay, cardPay가 존재한다. class CashPayment { public void cashPay() { //TODO Payment logic... } } class CardPayment { public void cardPay() { //TODO Payment ..