본문 바로가기

All205

[이펙티브자바 3판] ITEM8. finalizer와 cleaner 사용을 피하라 이번장의 핵심은... 자바의 객체 소멸자(finalizer, cleaner)는 안전망 역할이나 중요하지 않은 네이티브 자원 회수용으로만 사용하자 물론, 이런 경우라도 불확실성과 성능 저하에 주의해야한다 (가능하면 close()로 자원회수를 하는게 좋을거같다..) 자바의 2가지 객체 소멸자 1. finalizer 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다 오동작, 낮은 성능, 이식성 문제의 원인이 되기도 한다 자바 9에서는 이미 deprecated 되었고, cleaner를 그 대안으로 소개한다 2. cleaner finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다 C++의 파괴자(destructor) vs 자바의 객체 소멸자 자바의 객체 .. 2020. 9. 8.
[Codility(코딜리티)] Lesson2. OddOccurrencesInArray (100%) Lesson 2 Arrays - OddOccurrencesInArray (Java Solution) app.codility.com/programmers/lessons/2-arrays/odd_occurrences_in_array/ OddOccurrencesInArray coding task - Learn to Code - Codility Find value that occurs in odd number of elements. app.codility.com 문제 홀수개의 배열 A가 주어진다 예를 들면, A = {9,3,9,3,9,7,9} 여기서 9는 4개, 3은 2개, 7은 1개이다 짝이 없는 숫자를 출력하면 된다 즉, 7이 정답이다 해결 Map을 하나 만든 후, 배열의 값을 Key로 하여 개수를 Value.. 2020. 9. 7.
[이펙티브자바 3판] ITEM7. 다 쓴 객체 참조를 해제하라 (메모리 누수) 이번장의 핵심은... 자바가 가비지 컬렉터를 갖춘 언어이지만, 메모리 관리에 신경쓰지 않으면, 메모리 누수가 일어날 수 있다 다른 언어를 쓰다가 자바처럼 가비지 컬렉터를 갖춘 언어로 넘어오면, 자칫 메모리 관리에 더 이상 신경 쓰지 않아도 된다고 오해할 수 있다 아래 자료구조 Stack에서 데이터를 꺼낼 때 쓰는 pop() 메소드를 예로 들어보자 public class Stack { private Object[] elements; public Object pop() { if(size=0) throw new EmptyStackException(); Object result = elements[--size]; return result; } } 별로 문제가 없어보이지만, '메모리 누수' 라는 문제가 있다 결국.. 2020. 9. 7.
[Codility(코딜리티)] Lesson2. CyclicRotation (100%) Lesson 2 Arrays - CyclicRotation (Java Solution) https://app.codility.com/programmers/lessons/2-arrays/cyclic_rotation/ CyclicRotation coding task - Learn to Code - Codility Rotate an array to the right by a given number of steps. app.codility.com 문제 정수들로 구성된 배열 A[] 들이 주어진다. 그리고 K가 주어지는데, K만큼 오른쪽으로 shift 하는 문제이다. 배열의 가장 마지막 인덱스의 숫자는 맨 앞으로 온다. 예를들어 A=[3,8,9,7,6], K=3 이면, [3, 8, 9, 7, 6] -> [6, 3,.. 2020. 9. 6.
[Java] String 객체 생성 2가지 방식의 차이점 (new String vs "") 안녕하세요~ 잭코딩입니다! new String("") vs "" 이번 내용에서는 String 객체를 생성하는 2가지 방식과 그 차이점을 설명하겠습니다 String은 다른 일반 객체와 달리 Heap 영역 안에 String Pool 영역에서도 관리해주는데, 그와 관련된 내용을 정리해볼게요! 평소에 String으로 객체를 생성할 때, String name = "jackcoding" 단순히 이렇게 ""(큰 따옴표)로 생성했다. 그런데 이펙티브자바 ITEM6을 공부하면서, new String("jackcoding") 이렇게 생성하면 성능에 좋지 않다는 내용을 봤다. ""로 생성하면 한번만 객체가 생성되지만, new로 생성하면 객체가 계속 생성된다고 한다 https://jackjeong.tistory.com/12'.. 2020. 9. 6.
[이펙티브자바 3판] ITEM6. 불필요한 객체 생성을 피하라 이번장의 핵심은... 기존 객체를 재사용해야 한다면 새로운 객체를 만들지 말자 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다 특히, 불변 객체는 언제든 재사용할 수 있다 new String() 대신 문자열 리터럴을 사용하자 하지 말아야 할 극단적인 예 String s = new String("jackcoding"); 이 코드는 실행될 때마다 String 인스턴스를 새로 생성한다 반복문이나 빈번히 호출되는 메서드 안에 있다면 쓸데없이 String 인스턴스가 수백만 개 만들어질 수 있음 개선해보자 String s = "jackcoding"; 이제 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용한다 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가.. 2020. 9. 6.
[이펙티브자바 3판] ITEM5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 이번장의 핵심은... 클래스가 내부적으로 하나 이상의 자원에 의존하고, 그 자원이 클래스 동작에 영향을 준다면 싱글턴과 정적 유틸리티 클래스를 사용하지 않는 것이 좋다! 클래스가 직접 생성해서도 안되고, 필요한 자원을 생성자에 넘겨주자 -> '의존 객체 주입' 이라 하는 이 기법은 유연성, 재사용성, 테스트 용이성을 기막히게 개선해준다 정적 유틸리티 클래스와 싱글턴을 잘못 사용한 예를 보자 이런 코드는 유연하지 않고 테스트하기 어렵다 // 정적 유틸리티를 잘못 사용 public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} // 객체 생성 방지 } // 싱글턴을 잘못 사용 public.. 2020. 9. 6.