본문 바로가기

Language/Java8

Effective Java 2장 - Item9: try-finally보다 try-with-resources를 사용하라 아이템 9: try-finally보다 try-with-resources를 사용하라핵심 개념파일이나 데이터베이스 커넥션 등 close() 메서드를 호출해야 하는 자원을 다룰 때, try-with-resources 구문을 사용하면 코드가 간결해지고 예외 처리도 안전하게 됩니다.장점코드가 매우 간결하고 가독성이 좋다.자원 회수를 절대 까먹지 않는다: finally 블록을 실수로 빼먹는 일을 방지합니다.예외 처리가 더 안전하다: try 블록과 close() 메서드 양쪽에서 예외가 발생해도, 원래의 예외가 숨겨지지 않습니다. (try-finally는 finally의 예외가 원래 예외를 덮어씁니다.)단점해당 자원 클래스가 AutoCloseable 인터페이스를 구현해야만 사용할 수 있습니다. (하지만 대부분의 자원 .. 2025. 6. 15.
Effective Java 2장 - Item8: finalizer와 cleaner 사용을 피하라 아이템 8: finalizer와 cleaner 사용을 피하라핵심 개념finalize()(Java 9부터 deprecated)와 Cleaner는 자원 회수를 위해 사용하면 안 됩니다. 실행 시점이 불확실하고, 성능을 떨어뜨리며, 매우 위험합니다.장점 (이들을 피했을 때의 장점)예측 가능한 자원 관리: try-with-resources를 통해 자원 해제가 즉시, 확실하게 이루어집니다.성능 향상: finalizer는 GC의 부담을 가중시켜 성능을 저하합니다.안정성: finalizer 내에서 예외가 발생하면 무시되고, 상태가 망가질 수 있습니다.단점 (finalizer/cleaner 자체의 단점)언제 실행될지 모른다: GC가 수행될 때까지 실행이 지연되거나, 프로그램이 끝날 때까지 실행되지 않을 수도 있습니다... 2025. 6. 15.
Effective Java 2장 - Item7: 다 쓴 객체 참조를 해제하라 아이템 7: 다 쓴 객체 참조를 해제하라핵심 개념메모리를 직접 관리하는 클래스(ex. 스택)에서, 더 이상 사용하지 않는 객체에 대한 참조를 null로 처리하여 가비지 컬렉터가 메모리를 회수하도록 돕는 것입니다.장점메모리 누수를 방지하여 프로그램 안정성을 높입니다.단점코드가 약간 지저분해질 수 있지만, 메모리 누수를 막는 것이 훨씬 중요합니다.대부분의 경우 GC가 알아서 처리하므로, 직접 메모리를 관리하는 특별한 경우에만 해당됩니다.💡 예제 비교직접 구현한 스택에서 원소를 꺼내는 pop 메서드를 살펴봅시다.❌ 잘못된 예 (메모리 누수 발생)public class Stack { private Object[] elements; private int size = 0; // ... pub.. 2025. 6. 15.
Effective Java 2장 - Item6: 불필요한 객체 생성을 피하라 아이템 6: 불필요한 객체 생성을 피하라핵심 개념똑같은 기능의 객체를 매번 새로 생성하지 말고, 하나를 재사용하자는 원칙입니다. 특히 반복문 안에서 주의해야 합니다.장점성능이 향상되고, 가비지 컬렉터의 부담을 줄여줍니다.단점코드를 약간 더 신경 써야 하지만, 성능 향상 폭이 크다면 가치가 있습니다.💡 예제 비교❌ 잘못된 예 // 1. 비싼 객체를 반복해서 생성하는 경우public boolean isRomanNumeral(String s) { // matches는 내부적으로 매번 Pattern 객체를 생성하고 버림. 매우 비효율적. return s.matches("^(?=.)M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");}// 2. 불필요한 오.. 2025. 6. 15.
Effective Java 2장 - Item4: 인스턴스화를 막으려거든 private 생성자를 사용하라 핵심 개념Math나 Arrays, Collections처럼 정적 메서드만 모아놓은 유틸리티 클래스는 인스턴스를 만들 이유가 없습니다. 이럴 때 인스턴스화를 막는 방법입니다.장점클래스의 용도를 명확히 하고, 잘못된 사용을 막을 수 있습니다.상속을 막는 효과도 있습니다.단점특별한 단점은 없습니다. 꼭 지켜야 할 좋은 습관입니다.💡 예제 비교❌ 잘못된 예 (생성자가 없는 경우) public class StringUtils { // 생성자가 없으면 컴파일러가 자동으로 public 기본 생성자를 만들어줌 public static boolean isEmpty(String s) { return s == null || s.isEmpty(); }}// 사용자는 의도치 않게 객체를 생성할 수.. 2025. 6. 15.
Effective Java 2장 - Item3: private 생성자나 열거 타입으로 싱글턴임을 보증하라 핵심 개념애플리케이션 전체에서 단 하나의 인스턴스만 존재하도록 보장하는 패턴입니다.장점전역적인 상태를 관리하거나, 유일해야 하는 시스템 컴포넌트(ex. 설정 관리자)에 유용합니다.단점클라이언트 코드가 싱글턴에 강하게 결합되어 테스트하기 어렵습니다. (의존성 주입으로 완화 가능)상속이 불가능합니다.💡 예제 비교❌ 잘못된 예 (public static final 필드 방식) public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { } public void leaveTheBuilding() { /* ... */ }}간결하지만, 리플렉션을 통해 private 생성자를 호출하면 여러 인스턴스를 .. 2025. 6. 15.