728x90
728x90
자바 라이브러리에는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다. InputStream, OutputStream, java.sql.Connection 등이 좋은 예다. 자원 닫기는 클라이언트가 놓치기 쉬워서 예측할 수 없는 성능 문제로 이어질 수도 있다. 이런 자원 중 수 상당수가 안전망으로 finalizer를 활용하고는 있지만 finalizer는 그리 믿을만하지 못하다. 전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 try-finally가 쓰였다. 예외가 발생하거나 메서드에서 반환되는 경우를 포함해서 말이다. static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedRea..
자바는 두 가지 객체 소멸자를 제공한다. 그중 finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다. 오동작, 낮은 성능, 이식성 문제의 원인이 되기도 한다. finalizer는 나름의 쓰임새가 몇 가지 있긴 하지만 기본적으로 '쓰지 말아야' 한다. 그래서 자바 9에서는 finalizer를 사용 자제 API로 지정하고 cleaner를 그 대안으로 소개했다(하지만 자바 라이브러리에서도 finalizer를 여전히 사용한다). cleaner는 finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다. 자바의 finalizer와 cleaner는 C++의 파괴자(destructor)와는 다른 개념이다. C++에서의 파괴자는 (생성자의 꼭 필요..
C, C++처럼 메모리를 직접 관리해야 하는 언어와는 달리, 자바는 가비지 컬렉터를 가지고있다. 다 쓴 객체를 알아서 회수해가니 얼마나 편리하겠는가? 하지만 이를 자칫 메모리 관리에 더 이상 신경 쓰지 않아도 된다고 오해할 수 있는데, 절대 그렇지 않다. 아래의 코드는 스택을 간단히 구현한 코드이다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensure..
벌써 한빛미디어 서평단 활동 3번째 개발 서적이다. 이번 서적은 웹 개발자라면 꼭 공부해야하는 봄.... 스프링이다!! 주 언어가 Java이고 웹 개발자를 지망한다면 Spring은 꼭 공부해야 할 것이고 Spring MVC도 어느정도의 숙련도를 요구한다. (필요한 만큼 알면 된다고 하는데, 더 고급진 개발자가 되고싶다면 다다익선이다) 스프링 자체는 워낙 방대한 내용이기 때문에 전부 다 챙기다는건 쉽지 않을 것이다. 스프링은 객체지향 프로그래밍을 도와주는 프레임워크다. 객체지향설계를 공부하면서 스프링을 공부한다면 더 많이 와닿을 것이다. 어느 자바 웹 개발자 박OO 차장 대략적인 박차장의 개발인생 그렇다 웹 개발자라면... (Node 라거나.... Angular 라거나... Python은 잘 모르겠다) 스..
최근에 List 타입이나 Map의 반환타입을 가진 메서드나 혹은 필드를 일급컬렉션으로 대체해보라는 코멘트를 받았다. 일급 컬렉션.... 일급컬렉션 ... 분명 들어본...것 같은데? 뭐였지... 뭐였더라? 이런 생소한(?), 혹은 알듯 말듯한 용어가 나올때마다 당황스럽지만 우리에게는 구몬 아니 구글 선생님이 계신다! 오픈카톡방에서 조졸두님이라 불리우는 동욱님의 블로그에 '일급 컬렉션'에서 원하는 내용이 있었다. 그것도 자세히! 간단하게 정리해보면서 내 것으로 만들어 보려고 한다. (오늘도 동욱님의 공유지식에 감사함을 느끼며.... 정리를 시작해보자) 일급 컬렉션은 나뿐만 아니라 대부분의 개발자들에게 쉽지 않은 개념이였던 것 같다. 일급 컬렉션은 객체지향적으로, 리팩토링하기 쉬운 코드를 만들기 위해 필요하..
이전글에 이어서 아이템6의 내용을 정리한다. 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을때가 많다. 재사용은 빠르고 세련됐다. 특히 불변 객체는 언제든 재사용할 수 있다. 다음 코드는 하지 말아야 할 극단적인 예이다. 자세히 살펴보고 절대 따라하지 말자 String s = new String("bikini"); // 따라 하지 말 것! 이 문장은 실행될 때마다 String 인스턴스를 새로 만든다. 완전히 쓸데없는 행위다. 생성자에 넘겨진 "bikini" 자체가 이 생성자로 만들어내려는 String과 기능적으로 완전히 똑같다. 이 문장이 반복문이나 빈번히 호출되는 메서드 안에 있다면 쓸데없는 String인스턴스가 수백만 개 만들어질 수도 있다. 개선된 버전을 보자 String..