Java

[Effective Java] 7. finalize 를 사용하지 말것

1 분 소요

C++의 경우 생성자와 소멸자를 쌍으로 만들지만 자바의 경우는 GC가 불필요한 메모리를 정리하기 때문에 소멸자가 필요하지 않다. 자바에서 소멸자인 finalize는 절대로 사용하면 안된다. 1. finalize의 단점 자바의 finalize의 경우 예측이 불가능하고, 위험하며 ...

[Effective Java] 65. 예외를 무시하지 마라

최대 1 분 소요

당연한 얘기지만 checked exception은 개발자에게 명시적으로 처리할 예외가 있다는 것을 알리는 것이다. 그렇기 때문에 무시하는 것은 좋지 못하다. 빈 catch문은 예외를 사용하는 목적에 맞지 않게 무시하는 것이다. 처리할 별다른 내용이 없다면 적어도 주석이라도 달아두...

[Effective Java] 64. 실패 원자성 달성을 위해 노력하라.

1 분 소요

일반적으로 메서드 호출이 정상적으로 처리되지 못하고 예외가 발생한 경우 객체의 상태는 메서드 호출 이전과 동일해야 한다. 이를 만족할때 실패원자성(failure atomicity)을 갖췄다고 한다. 1. failure atomicity를 달성 방법

[Effective Java] 60. 표준 예외를 사용하라.

최대 1 분 소요

자바 플랫폼 library에는 대부분 api가 필요로 하는 Runtime Exception이 갖춰져 있다. 수준 높은 코드는 코드 재사용성이 높다. Exception역시 마찬가지다. 참고로 Exception을 재사용 할때는 예외를 발생시키는 조건이 문서에 기술된 것과 일치해야...

[Effective Java] 6. 객체 참조 폐기

1 분 소요

GC가 있는 Java의 경우 메모리 관리를 망각하는 경우가 많다. 하지만 실수에 의해 불필요한 참조가 제거되지 않아 Memory leak이 발생할 수 있다.

[Effective Java] 59. 불필요한 Checked Exception 사용은 피하라.

최대 1 분 소요

Checked Exception을 사용하면 예외처리를 강제함으로써 프로그램의 안전성을 높일 수 있다. (try-catch 문 사용이 필수적이기 때문에) 하지만 너무 남발하면 사용하는 측에서 불편한 api가 된다. 만약 API를 제대로 사용해도 예외적인 상황이 발생하는 것을 피...

[Effective Java] 56. 일반적으로 통용되는 작명 관습을 따르라.

1 분 소요

자바의 작명 관습은 철자 와 문법 두가지 범주로 나눌 수 있다. 1. 철자 철자의 작명 관습은 패키지, 클래스, 인터페이스, 메서드, 필드, 자료형 변수에 관한 것으로 별다른 이유가 없다면 어겨서는 안된다. 1.1. 철자 관습을 어길 경우 유지 보수가 어려워 진다. 코...

[Effective Java] 50. 다른 자료형이 적절하다면 문자열 사용은 피하라

최대 1 분 소요

1. 적절한 자료형으로 변환하라. 네트워크나 키보드를 통해 입력되는 값이 문자열 형태이다 보니 그대로 사용하려는 경우가 있을 수 있다. 하지만 이는 매우 좋지 못한 것으로 적절한 자료형이 있다면 그것이 기본 자료형이든 객체 자료형이든 상관없이 해당 자료형으로 변환해서 사용해야 한...

[Effective Java] 49. Wrapper class 대신 기본자료형을 사용하라

1 분 소요

모든 기본 자료형(primitive type)에는 이와 대응되는 참조 자료형이 있다. 이를 boxed primitive type 이라고 부른다. JDK 1.5부터는 autoboxing, auto-unboxing을 지원하게되어 기본 자료형과 이런 참조 자료형의 차이를 희미하게 ...

[Effective Java] 48. 정확한 답이 필요하면 float, double은 피하라

1 분 소요

float와 double은 부동소수점 연산을 수행한다. 이는 넓은 범위의 값에 대해서 정확도가 높은 근사치를 제공할 수 있도록 설계된 연산으로 정확한 값을 보장하지 않는다. 특히나 돈과 같이 정확한 연산을 할때는 절때 float와 double을 사용해서는 안된다. 예를 들어...

[Effective Java] 47. 라이브러리를 적절히 활용하라

최대 1 분 소요

라이브러리를 활용할때의 장점은 아래와 같다. 표준 라이브러리를 사용하면 그 라이브러리를 개발한 전문가의 지식뿐 아니라 먼저 그 라이브러리를 사용한 개발자의 경험을 활용할 수 있다.

[Effective Java] 46. for-each 문을 사용하라

최대 1 분 소요

JDK 1.5에 도입된 for-each 문은 반복자나 첨자 변수, 기타 성가신 코드를 없애서 오류 가능성을 없앤다. 또한, 성능면에서도 기존 for 문과 거의 동일하고 어떤 상황에서는 for문보다 나은 성능을 보이기도 한다.

[Effective Java] 45. 변수 범위의 최소화

최대 1 분 소요

지역 변수의 유효범위를 최소화하면 가독성(readability)과 유지보수성(maintainability)이 좋아지고 오류 가능성도 줄어든다. 변수 범위를 최소화하는 가장 좋은 방법은 처음 사용하는 곳에서 선언하는 것이다. 지역 변수를 너무 빨리 선언하면 유효범위가 앞 뒤로 ...

[Effective Java] 4. 객체 생성을 막을때 private 생성자 활용

최대 1 분 소요

객체 생성을 막고자 할 경우 private 생성자를 사용하자. 가끔 Utility성 Class로 static method나 field만 모은 클래스를 만들때가 있다. 이런 구조는 객체지향적이지 않기 때문에 남용하면 안된다. 하지만 반드시 필요한 경우도 있기 때문에 자주 사용되...

[Effective Java] 20. 태그 형태의 클래스 구현 대신 상속을 사용

1 분 소요

Class가 특정 상태에 따라서 다르게 동작하는 식으로 구현되는 경우가 있다. 이런 특정 상태(태그)에 따라서 내부 구현이 달라진다면 상속으로 구분하는 것이 좋다. 아래는 이러한 구현의 예로 shape 라는 태그 내용에 따라서 클래스가 사용하는 멤버가 정해진다. public...

[Effective Java] 2. Builder 패턴

4 분 소요

생성자의 parameter가 많을때는 Builder 패턴을 고려하는것이 좋다. 특히나 선택적으로 필요한 parameter가 많을 경우 유용하다.

[Effective Java] 19. Interface는 자료형을 정의할 때만 사용하라

1 분 소요

인터페이스를 구현하는 클래스를 만들면 그 인터페이스는 해당 클래스 객체를 참조할 수 있는 자로형의 역할을 하게 된다. 인터페이스를 구현해 클래스를 만든다는 것은 해당 클래스의 객체로 어떤일을 할 수 있다라는 것을 클라이언트에게 알리는 행위로, 이 외에 다른 용도로 인터페이스를 사...

[Effective Java] 16. 상속 대신 구성하라

3 분 소요

상속은 코드 재활용을 위한 강력한 방법이지만 적절하게 사용하지 않은 경우 깨지기 쉬운 소프트웨어가 된다. 1. 상속이 안전한 경우

[Effective Java] 15. 변경 가능성을 최소화하라

3 분 소요

immutable class란 변경 불가능한 클래스로 객체가 생성되고 난 이후 그 객체 값의 변경이 불가능한 class를 말한다. 자바에서는 String, 기본자료형 wrapper, BigInteger, BigDeciaml 등이 이러한 class 이다. 변경 불가능한 클래스는 ...

[Effective Java] 13. 접근 권한의 최소화

1 분 소요

잘 설계된 모듈은 구현 세부사항을 API 뒤에 잘 숨긴다. 즉, 정보 은닉(information hiding). 다른말로 캡슐화(encapsulation)가 잘 된 것이다. 1. 캡슐화의 중요성 모듈간의 캡슐화가 잘 된 경우 모듈사이 의존성을 낮춰서 개별적인 개발, 테스트, ...

[Effective Java] 1. Static Factory Method

2 분 소요

객체를 생성하는 방법으로 생성자 외 정적 팩토리 메서드(Static Factory Method)를 사용하는 방법이 있다. 일반적인 생성자보다 장점이 많으니 무조건 생성자를 만들것이 아니라 static factory method를 만드는것을 고려해봐야 한다. singleto...

조건문과 반복문의 속도

1 분 소요

1. if문 개수에 따른 속도차이 결론적으로 if문의 개수에 따른 실행속도의 차이는 무시해도 될 만큼 작다. if문 자체보다 if문에 들어가는 조건을 비교하는 구문이 얼마나 빠르냐가 성능을 좌우한다. 2. switch-case 문에서의 String 비교 JDK 6까지 swit...

자바의 Reference 형태와 GC

6 분 소요

1. 자바의 GC(Garbage Collector) GC는 프로세스의 힙 영역에 할당된 메모리 중 더 이상 사용되지 않는 메모리를 주기적으로 회수함으로써 프로세스 메모리를 관리한다. 자바에서 GC는 다양한 형태가 있지만 공통적으로 다음과 같은 작업을 한다. 힙(heap...

성능 체크를 위한 Sytem.nanoTime()

최대 1 분 소요

시간 관련 메서드에 대표적으로 System.currentTimeMills() 가 있다. 이 메서드는 UTC 시간 표준을 따르면서 현재 시간을 ms로 리턴한다. System.nanoTime() 은 JDK 5.0에 추가된 메서드로 시간을 ns 로 리턴한다. 1. System....

변수, 상수, 리터럴

최대 1 분 소요

변수는 메모리 공간에 할당된 이후 값이 변화될 수 있는 값이다.

기본 자료형과 Wrapper class

2 분 소요

자바는 Primitive type에 상응하는 각각의 Wrapper class를 가지고 있다. 이를 통해 기본 데이터 타입도 객체 단위로 처리할 수 있도록 하고, 기본 데이터를 다루는 여러 유용한 메서드를 사용할 수 있도록 한다. 1. Autoboxing, Auto-unboxi...

volatile 키워드

3 분 소요

1. volatile 키워드란? volatile 역시 synchronized와 마찬가지로 동기화를 위한 키워드이다. volatile은 instance의 멤버 필드를 동기화하기 위한 키워드로 JDK 1.4까지 제대로 지원이 안되다가 1.5부터 다시 주목받게 되었다.

synchronized

4 분 소요

자바 Thread에 대한 내용은 자바의 Thread 포스팅을 참고할 것.

자바의 Thread

7 분 소요

1. Thread의 기본 운영체제 레벨에서 Thread는 명령어 포인터(instruction pointer)와 스택 포인터(stack pointer) 두가지를 가지고 있다. 명령어 포인터 : 다음에 실행할 명령어를 가리킴 스택 포인터 : Thread의 독립적인 loc...

String과 메모리

1 분 소요

1. 문자열 생성 방식과 메모리 위치 자바에서 String을 생성하는 방법은 두가지가 있다. String 생성 방법에 따라서 메모리 저장위치가 달라진다.

static 키워드

2 분 소요

static은 ‘클래스의’ 또는 ‘공통적인’ 이란 의미를 가지고 있다. 자바에서 변수와 메서드앞에 static 키워드를 붙이게 되면 겍체의 멤버 변수나 멤버 메서드가 아니라 클래스 변수, 클래스 메서드가 된다. 일반적인 클래스의 멤버 변수, 멤버 메서드의 경우 인스턴스화 과...

Main Method

최대 1 분 소요

메인 메소드는 프로그램을 실행했을 때 자바에서 가장 먼저 실행되어 명령들을 수행하고 끝나면 프로그램을 종료하는 공간이다. 프로그램의 시작지점이기 때문에 메인 메소드는 프로그램에서 반드시 하나만 존재하여야 한다. 또한, JVM(Java Virtual Machine)이 자바 ...

로그 (Log)

1 분 소요

개발에 있어 Log를 출력하는 것은 반드시 필요한 일이다. 자바에서 Log를 출력할때 모두 System.out.println()으로 출력하는 경우가 있다면 이는 성능상 안좋은 영향을 끼칠 수 있다.

Hash에 대해서

4 분 소요

1. Hash 란 임의의 데이터를 고정된 크기의 정수로 변환해주는 것. Hash 또는 Hashing이라 한다. Hash 함수는 이런 역할을 하는 Hash algorithm을 구현한 함수를 말한다. 2. Hash의 용도 데이터를 저장함에 있어 빠르게 검색을 할 수 있도록 ...

Deadlock

6 분 소요

데드락이란, 둘 이상의 쓰레드가 lock 을 획득하기 위해 기다리는데, 이 lock 을 잡고 있는 쓰레드도 똑같이 다른 lock 을 기다리며 서로 블록 상태에 놓이는 것을 말한다. 데드락은 다수의 쓰레드가 같은 lock 을, 동시에, 다른 명령에 의해, 획득하려 할 때 발생할 수 ...

ConcurrentModificationException

1 분 소요

Concurrent는 동시의 라는 뜻이고, Modification은 수정 이란 뜻이다. 즉, 객체의 상태를 동시에 변경하는 것을 허용되지 않는데 변경이 발생하여 상태가 깨지는 경우에 발생하는 예외이다. 1. Multi thread 문제만은 아니다. 동시에 수정이 발생한다라고 ...

자바 Concurrent 패키지

1 분 소요

java.util.concurrent 패키지에 속한 클래스들로 동시성(concurrency) 작업을 위한 클래스들이다. 동시성이란 말에서 알 수 있듯 멀티 쓰레딩 환경에서 유용한 클래스들이다. 대표적으로 Executor, Callable, Future와 같이 비동기 작업을 위...

Callback과 Listener

최대 1 분 소요

Callback은 Listener과 비슷하다. Callback이나 Listener모두 이벤트 처리에 사용하기 때문이다. 하지만 정확히 이 두 가지는 디자인 패턴이 다르다. Callback은 Command Pattern을 따르고 Listener는 Observer Pattern을...