평소에 자바를 어느 정도 잘 안다고 생각하였지만, 실제 어떠한 요구사항이 있었을 때 이를 구현하는데 생각보다 어렵다는 것을 느꼈다. 기본기가 매우 중요하고 자바를 이론으로 아는것과 실제 적용하며 몸으로 깨닫는 것은 매우 큰 차이가 있기에, 평소에도 도움을 많이 받는 친구에게 코드리뷰를 받으며 블랙잭을 구현해 보았다. 그 과정에서 내가 느끼고 배운 것을 정리하려고 이 글을 작성한다. 배운 점 기본적인 자바 컨벤션, 클린코드, 네이밍 평소에도 이론적으로는 어느 정도 알고 있다고 생각하였지만, 스스로가 많이 놓치고 있는 부분이었다. 개행을 어느 부분에서 해야 하고, 메서드 순서를 어떤 식으로 해야 하는지에 대해 무지했던 것이다. 우선 개행의 경우 변수를 선언할 때 접근자가 달라지거나 final 키워드의 유무에..
리플렉션(Reflection)이란? 리플렉션은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API를 말하며, 컴파일 시간이 아닌 실행 시간에 동적으로 특정 클래스의 정보를 추출할 수 있는 프로그래밍 기법이라 할 수 있다. 언제 사용할까? 동적으로 클래스를 사용해야 할 때 사용한다. 다시 말해, 작성 시점에는 어떠한 클래스를 사용해야 할지 모르지만 런타임 시점에서 가져와 실행해야 하는 경우 필요하다. 프레임워크나 IDE에서 이런 동적 바인딩을 이용한 기능을 제공한다. 리플렉션을 통해 알 수 있는 정보 Class Constructor Method Field 리플렉션 예시 public class Parent { private String str1 ..
불변 객체(Immutable Object)란? 불변 객체란 객체 생성 이후 내부의 상태가 변하지 않는 객체이다. 불변 객체는 read-only 메소드만을 제공하며, 객체의 내부 상태를 제공하는 메소드를 제공하지 않거나 방어적 복사(defensive-copy)를 통해 제공한다. Java의 대표적인 불변 객체로는 String이 있다. String name = "Immutable"; name.toCharArray()[0] = 'A'; System.out.println(name); //Immutable Java의 String은 불변 클래스이기 때문에 위와 같이 String 내부의 char형 배열을 얻어 수정하여도 반영이 되지 않는다. Java에서는 배열이나 객체 등의 참조(Reference)를 전달한다. 그렇기..
다양한 가비지 컬렉션(Garbage Collection) 알고리즘 JVM이 메모리를 자동으로 관리해 주는 것은 개발자의 입장에서 상당한 메리트이다. 하지만 문제는 GC를 수행하기 위해 Stop The World에 의해 애플리케이션이 중지되는 것에 있다. Heap의 사이즈가 커지면서 애플리케이션의 지연(Suspend) 현상이 두드러지게 되었고, 이를 막기 위해 다양한 Garbage Collection(가비지 컬렉션) 알고리즘을 지원하고 있다. Serial GC Serial GC의 Young 영역은 앞서 설명한 알고리즘(Mark Sweep)대로 수행된다. 하지만 Old 영역에서는 Mark Sweep Compact 알고리즘이 사용되는데, 기존의 Mark Sweep에 Compact라는 작업이 추가되었다. Com..
Private 메소드를 테스트하는 방법 예를 들어 id를 만들때 해당 id의 길이가 2에서 10 사이가 아니라면 UUID를 생성하여 반환하는 다음과 같은 코드가 있다고 하자. @Service public class PrivateTestClass { public String makeID(String id) { if (isCollectID(id)) { return id; } return UUID.randomUUID().toString().substring(0,10); } private boolean isCollectID(String id) { return 2
가비지 컬렉션(Garbage Collection) 개발을 하다 보면 유효하지 않은 메모리인 가비지(Garbage)가 발생한다. C/C++에서는 메모리 누수(Memory Leak)를 막기 위해 객체를 생성한 후 사용하지 않는 객체의 메모리를 프로그래머가 직접 해제해주어야 한다. 하지만 JAVA는 JVM의 가비지 컬렉터가 불필요한 메모리를 알아서 정리해 주기 때문에 프로그래머가 직접 해제할 필요가 없다. 일반적으로 다음과 같은 경우에 GC의 대상이 된다. 객체가 NULL인 경우 (ex. String str = null) 블럭 실행 종료 후, 블럭 안에서 생성된 객체 부모 객체가 NULL인 경우, 포함하는 자식 객체 Java에서는 메모리 누수를 방지하기 위해 가비지 컬렉터(Garbage Collector, G..
JAVA 탄생 배경 JAVA는 썬 마이크로시스템즈의 제임스 고슬링이라는 사람과 다른 연구원들이 개발한 프로그래밍 언어이다. 1991년 그린 프로젝트라는 이름으로 시작해 1995년에 발표가 되었다. 제임스 고슬링은 가전제품 내에 탑재해 동작하는 프로그램을 개발하려고 하는 데 그 당시에는 유닉스 기반의 배경을 가지고 있었기 때문에 사용하던 프로그래밍 언어 C/C++의 특성상 여러 하드웨어를 커버하기에는 같은 기능의 소스를 각 하드웨어에 맞게 작성해야 하는 번거로움이 있었기에 JAVA를 개발하게 되었다. JAVA의 가장 큰 특징 중 하나가 컴파일된 코드가 플랫폼 독립적이라는 점이다. 즉 어느 플랫폼이든 작성한 소스를 변경할 필요 없이 다 실행시킬 수 있다. 이러한 특징을 구현하기 위해서는 JVM(JAVA Vi..
Java 언어 설계자인 Brain Goetz는 Optional을 만든 의도를 아래와 같이 작성했다. API Note: Optional is primarily intended for use as a method return type where there is a clear need to represent "no result," and where using null is likely to cause errors. A variable whose type is Optional should never itself be null; it should always point to an Optional instance. 메소드가 반환할 결과 값이 '없음'을 명백하게 표현할 필요가 있고, null 을 반환하면 에러가 발생..