일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 개발
- github
- 신입사원
- 운영체제
- java
- 깃허브
- 컴퓨터공학
- 공채
- 정보처리기사
- 컴퓨터과학
- 이펙티브 자바
- 프로그래밍
- Effective Java
- OS
- 뮤텍스
- 스터디
- 스프링
- 깃
- 알고리즘
- spring
- 메모리
- 우리카드
- CS
- 자바
- package-private
- 디지털
- 신입
- Public
- 세마포어
- IT
- Today
- Total
목록Java/이펙티브 자바 (23)
주니어 개발자 성장기
3장 Object는 객체를 만들 수 있는 구체 클래스지만 기본적으로는 상속해서 사용하도록 설계되었다. Object에서 final이 아닌 메서드(equals, hashCode, toString, clone, finalize)는 모두 재정의(overriding)를 염두에 두고 설계된 것이라 재정의 시 지켜야 하는 일반 규약이 명확히 정의되어 있다. 일반 규약에 맞게 해당 메소드를 overriding 해야 일반 규약을 활용하는 클래스들(HashMap, HashSet)이 오동작하지 않게 된다. finalize는 이전 장에서 다루었으므로 더이상 언급하지 않는다. 개요equals 메서드는 overriding하기 쉬워 보이지만 곳곳에 함정이 있으므로 필요하지 않은 경우 overriding하지 않는 것이 최선이다. 그..
개요 자바 7부터 try-finally는 더 이상 최선의 방법이 아니다. (자바 7부터) try-with-resources를 사용하면 코드가 더 짧고 분명하다. 만들어지는 예외 정보도 더 유용하다. try-finally의 문제점 // 코드 9-2 자원이 둘 이상이면 try-finally 방식은 너무 지저분하다! (47쪽) static void copy(String src, String dst) throws IOException { InputStream in = new FileInputStream(src); try { OutputStream out = new FileOutputStream(dst); try { byte[] buf = new byte[BUFFER_SIZE]; int n; while ((n =..
개요 자원 회수를 위해서 사용할 수 있는 finalizer와cleaner는 즉시 수행된다는 보장이 없으며 상황에 따라 위험할 수도 있어 불필요하다. Finalizer 다음과 같이 클래스에 Object.finalize 메서드를 오버라이딩 해주면 된다. @Override protected void finalize() throws Throwable { System.out.print(""); } 자바 9부터 Deprecated 되었다. 대안으로 AutoCloseable, Cleaner, WeakReference, PhantomReference 등을 제시하고 있다. (AutoCloseable가 제일 낫다고 한다) 또한 상속을 악용한 Finalizer 공격이 일어날 수도 있다. Cleaner 다음과 같이 stati..
메모리 누수 발생을 주의하자메모리 관리를 직접하는 경우 GC가 완벽하게 동작할 것을 기대하면 안된다 코드 내부에 더 이상 쓰이지 않지만 참조해제가 안된 객체들이 계속해서 존재할 가능성이 있다. 주요 원인 Stack Cache Listener 공통점: 모두 내부에 객체를 쌓아두는 공간이 있다! 일반적으로 자기 메모리를 직접 관리하는 클래스라면 프로그래머는 항시 메모리 누수에 주의해야 한다. - 이펙티브 자바 38p 대안 사용하지 않는 변수에 대해 명시적으로 null을 삽입해준다.public Object pop() { if (size == 0) throw new EmptyStackException(); Object result = elements[--size]; elements[size] = null; //..
불필요한 객체 생성 String 타입의 인스턴스의 경우 한 번 생성되면 JVM 내부의 메모리에 캐싱되기 때문에 같은 JVM내에 있다면 모든 코드가 동일한 인스턴스를 참조한다. 하지만, new String("문자열")과 같은 생성자를 호출한다면 새로운 인스턴스가 생성된다. 반복문 내에 있으면 불필요한 객체가 수백만개 생성될 수 있으니 주의할 필요가 있다. String의 생성자는 heap 메모리에 저장, 그냥 선언된 String은 `Java Constant Pool`에 저장되어 사용된다. 생성 비용 절약 책에서는 생성 비용이 아주 비싼 객체들은 캐싱해서 재사용하기를 권장한다. 예를 들어서, String.matches 메서드의 경우 패턴을 입력 받으면 내부적으로 패턴을 컴파일해서 인스턴스를 만들게 되는데 생성..
의존 객체 주입(DI) 사용하는 자원에 따라 동작이 달라지는 클래스에 사용하기 적합하다. 문제 상황 자원을 직접 명시하게 되면 Mocking을 할 수가 없게된다. (엄밀히 말하면 가능은 하지만 번거롭고 바람직하지 않다.) //SpellChecker.class // 자원을 직접 명시하는 코드 private static final Dictionary dictionary = new DefaultDictionary(); 이미 자원이 클래스가 로드되는 시점에서 무조건 생성되며 변경할 수도 없다. 유연성과 재사용성이 떨어진다. 예제에 나온 SpellChecker가 DefaultDictionary가 아닌 KoreanDictionary나 EnglishDictionary를 사용하고 싶다면 어떻게 해야 할까? 기존처럼 리..