목록분류 전체보기 (115)
도당탕탕
1. 일반적인 규칙 Reflexive : null이 아닌 레퍼런스 value x에 대해서, x.equals(x) == true 여야한다. Symmetric : null이 아닌 레퍼런스 value x,y에 대해서, x.equals(y) == true 이면 y.equals(x) == true여야 한다. Transitive : null이 아닌 레퍼런스 value x,y,z에 대해서, x.equals(y) == true, y.equals(z) == true이면 x.equals(z) == true Consistent : null이 아닌 레퍼런스 value x,y에 대해서, x.equals(y)는 여러번 호출해도 같은 값을 리턴해야한다. (내부 값이 변경되지 않았다는 가정하에) null이 아닌 value x에 대해..
자바에서는 resource를 사용하고 close를 사용해 닫아야 하는 메소드들이 많다. 대표적인 예로 InputStream, OutputStream, dbConnection을 들수 있다. 만약 이 자원들을 닫지 않으면 시스템은 성능 문제를 야기 시킬 수 있다. 그렇기 때문에 전통적으로 자바에서는 finalizer를 활용해 자원을 닫아주는 것을 보장 했었다. 그렇지만 finalizer는 item8에서 봤듯이 언제 JVM에서 호출을 해줄지 모르기 때문에 별로 믿을만하지 못하다. 또한 다음과 같은 단점도 보인다. 예를 한번 보자. try-finally를 이용해 자원을 회수 하는 코드 static String firstLineOfFile(String path) throws IOException { Buffere..
Finalizer란? Object 클래스의 메소드 중 하나로써, Garbage Collection이 수행될때 호출되는 메소드. 주로 자원을 해제하기 위해서 사용된다. ( Java 9에서는 deprecated됨 ) public class FinalizerTest extends Object { @Override protected void finalize() throws Throwable { super.finalize(); System.out.println("finalizer is called!"); } } Cleaner란? Java 9부터 생겨났고 수거대상이 되는 객체를 Cleaner 의 register함수로 등록한다. 아래와 같이 수거대상이 되는 State 객체에 대한 정리 작업이 run() 함수에서 수행..
자바는 C와 C++과 다르게, 가비지 컬렉터에서 다 쓴 객체를 알아서 회수해 간다. 즉 메모리 관리를 따로 할 필요가 없어 프로그래머의 삶이 훨씬 편안해진다. 그렇다고 메모리 관리를 아예 신경쓰지 않아도 된다고 오해 할 수 있는데, 절대 그런 오해를 하면 안된다. 다음 코드를 보면 Memory leak - Stack Code public class Stack { private Obejct[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Obje..
자바의 컴파일 과정 및 방법에 대한 글입니다. 자바 코드가 어떻게 실행되는지 어떻게 실행하는지에 대해 설명해 보겠습니다. 목차 컴파일 자바 컴파일 과정 바이트코드 컴파일? 컴파일이 무엇일까요? 바로 사람이 이해하는 언어를 컴퓨터가 이해할 수 있는 언어로 바꿔주는 과정이라 보면 됩니다. 먼저 씨언어의 컴파일 과정을 볼까요? C언어의 컴파일 과정 씨언어는 다음과 같은 구조로 컴파일을 진행합니다. C 파일을 컴파일을 통해 어셈블리어를 만들 거 어셈블러를 통해 기계어를 만들어 실행시킵니다. 그럼 자바는 어떻게 하는지 살펴볼까요? Java의 컴파일 과정 자바 컴파일러는 자바 파일을 클래스 파일로 변환시킨 뒤 JVM에 의해 실행됩니다. 자세한 내용은 나중에 JVM을 공부할 때 더 알아보도록 하겠습니다. Java C..
이번 글에서는 JVM이 무엇인지 어떤 역할을 하는지 JVM내에 어떤 일이 일어나는지 등 알아보려고 합니다. 목차 런타임? JVM 스택기반 vs 레지스터기반 JIT JVM 구조 JDK, JRE 런타임? 런타임이란 말 글대로 프로그램에서 실행되고 있는 동안의 동작을 말합니다. 자바에서 런타임은 어떤 과정으로 이루어져 있을까요? 아래 순서를 적어봤습니다. JDK를 통해 바이트코드를 생성합니다. 생성된 바이트코드를 JRE에 넘겨줍니다. JRE를 사용해서 바이트코드를 JAVA 명령어로 실행하라고 합니다. 그러면 JVM이 실행시킵니다. 이런 과정으로 자바 파일이 실행되어집니다. 그럼 이제부터 본격적으로 궁금한 키워드 JDK, JRE, JVM이 무엇인지 공부해 봅시다. JVM Java는 스택 기반 가상 머신으로 특정..
불필요한 객체생성의 예시 String s = new String("bikini"); // 잘못된 사용의 예, "bikini" 자체가 String 객체를 생성함. String s = "bikini"; // 옳은 사용의 예 String s = new String("bikini") 처럼 사용하면 실행될때마다 String 객체가 새로 생성된다. 반면 String s = "bikini" 로 사용하면 같은 문자열에 대해서는 하나의 JVM안에서 재사용된다. Static factory method로 불필요한 객체 생성 피하기 다음 코드는 올바른 로마 숫자 표기법인지 검사하는 함수이다. static boolean isRomanNumeral(String s) { return s.matches("^(?=.)M*(C[MD]|..
Utility Class의 객체 생성을 막기 위해서는 private constructor를 선언해서 default constructor가 생기지 않도록 해야한다. public class UtiliyClass { private UtilityClass () { throw new AssertionError(); } } 물론 abstract class를 만듬으로써 객체 생성을 막을 수도 있지만 다음과 같은 문제가 있다. 다른 클래스가 이를 상속해서 객체를 생성할 수 있음 사용자도 상속을 해야하는 class로 오해 따라서 인스턴스화를 막으려거든 private 생성자를 선언해 사용하는 것이 좋다. 그러나 모든 코드는 트레이드 오프가 있듯 private 생성자에도 부작용도 있다. 바로 다른 클래스가 상속할 수 없다는..