분류 전체보기

Language/Java

[effective java] 아이템 70. 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라.

핵심 요약 복구할 수 있는 상황이면 검사 예외를, 그로그래밍 오류라면 비검사 예외를 던지자. 확실하지 않다면 비검사 예외를 던지자. Throwable을 상속하여 사용자 정의 throwalbe을 정의하지 말자. 검사 예외라면 복구에 필요한 정보를 알려주는 메소드를 제공하자. 예외 계층 구조 자바는 문제 상황을 알리는 타입(throwable)으로 다음의 세 가지를 제공한다. 1. 검사 예외: Exception 하위 클래스들 2. 런타임 예외: RuntimeException 하위 클래스들 3. 에러: Error 하위 클래스들 이를 어떻게 적재적소로 사용할지에 대해 알아보자. 검사 예외(Checked Exceptions) ✍ 호출하는 쪽에서 복구하리라 여겨지는 상황이라면 검사 예외를 사용하자. Exception..

Language/Java

[effective java] 아이템 69. 예외는 진짜 예외 상황에만 사용하라.

예시 1 코드 1 - 예외 처리를 제어 흐름 방식으로 사용 // 예외를 완전히 잘못 사용한 예 - 훨씬 느리다. try { // 성능이 2배 정도 느리다 int i = 0; while(true) range[i++].climb(); } catch (ArrayIndexOutOfBoundsException e) { } 배열의 원소를 순회하는데, 무한루프를 돌다가 배열의 끝에 도달해 ArrayIndexOutOfBoundsException이 발생하면 끝을 내는 코드이다. 코드 2 - 표준적인 관용구 // 표준적인 관용구로 작성한 예 for (Mountain m : range) m.climb(); 코드 1의 문제점 예외 처리는 비용이 많이 드는 작업이다. 예외는 코드의 정상적인 실행 흐름을 제어하기 위한 수단이 아..

Language/Java

[effective java] 아이템 68. 일반적으로 통용되는 명명 규칙을 따르라.

자바 언어의 명명 규칙 크게 철자와 문법 두 가지로 나뉜다. 철자 규칙 특별한 이유가 없는 한 반드시 따라야 한다. 지키지 않을 경우 API는 사용하기 어렵고, 유지보수하기 어렵다. 가독성이 떨어진다. 패키지와 모듈 이름 각 요소를 점(.)으로 구분하여 계층적으로 짓는다. 조직 외부에서도 사용될 수 있다면, 조직의 웹 도메인 이름을 역순으로 사용한다. 웹 도메인 이름은 전세계적으로 유일하므로 패키지 이름의 충돌을 피할 수 있다. ex. com.google 예외적으로 표준 라이브러리와 선택적 패키지들은 java와 javax로 시작한다. 각 요소는 8자 이하의 짧은 단어 혹은 약어를 추천한다. ex. utilities보다는 util처럼 의미가 통하는 약어를 사용하는 것도 좋다. ex. 여러 단어로 구성된 이..

Language/Java

[effective java] 아이템 67. 최적화는 신중히 하라.

빠른 프로그램보다는 좋은 프로그램을 작성하라. : 아키텍처 수준에서의 성능 최적화를 위해 가독성이 좋고, 재사용성이 높고 수정이 용이한 코드를 작성하라. 프로그램의 아키텍처가 잘 설계되어 있으면, 개별 구성 요소의 성능 문제는 대체로 구성 요소 내부의 개별적인 최적화를 통해 해결할 수 있다. 즉, 정보 은닉 또는 캡슐화 원칙을 따르므로 각 요소를 독립적으로 설계하고 개선할 수 있게 만든다. 반면, 성능 문제가 아키텍처 수준에서 발생하는 경우, 일반적으로 전체 시스템을 변경해야 하며 이는 대규모의 재설계와 많은 리소스가 필요하다. 결론적으로, 좋은 프로그램을 작성하는 것이 중요하며, 이를 통해 개별 구성 요소를 독립적으로 최적화할 수 있는 유연성을 얻을 수 있다. 또한, 아키텍처 수준에서의 성능 최적화가 ..

DevOps/Docker

[Docker] 컨테이너 모니터링

컨테이너된 환경에서 애플리케이션 모니터링 : 프로메테우스(Prometheus) 전통적인 애플리케이션 모니터링 일반적으로 고정된 서버에서 애플리케이션을 실행하고 관리하므로, 서버의 상태를 추적하고 문제가 발생했을 때 알림을 받는 방식으로 작동한다. 보통 서버의 CPU 사용량, 메모리 사용량, 디스크 공간 등의 기본적인 지표를 추적한다. 컨테이너화된 애플리케이션 환경에서는 적합하지 않다. 컨테이너는 빠르게 생성되고 삭제되며, 많은 컨테이너가 동시에 실행될 수 있다. 컨테이너화된 애플리케이션 환경에서는 각 컨테이너의 상태를 개별적으로 추적하고, 컨테이너 간의 관계와 상호작용을 이해할 수 있는 모니터링 도구가 필요하다. 또한, 컨테이너가 생성되고 삭제되는 빠른 주기를 반영할 수 있는 동적인 모니터링 방식이 필요..

Language/Java

[effective java] 아이템 66. 네이티브 메서드는 신중히 사용하라.

핵심 정리 네이티브 메소드는 메모리 관리, 성능, 이식성, 디버깅 등에서 문제를 일으킬 수 있으므로, 정말 꼭 필요한 경우에만 사용하자. ❔ 자바 네이티브 인터페이스(Java Native Interface, JNI) 더보기 JVM이 C, C++, 어셈블리와 같은 다른 프로그래밍 언어로 작성된 애플리케이션과 상호작용하는 데 사용하는 프로그래밍 프레임워크이다. JNI는 자바 코드가 네이티브 메소드를 호출하고, 네이티브 코드(즉, C/C++ 등의 언어로 작성된 코드)가 JVM 내에서 실행되는 자바 객체를 호출하는 기능을 제공한다. 네이티브 메소드의 전통적인 주요 쓰임새 레지스트리 같은 플랫폼 특화 기능 특정 플랫폼에만 특화된 기능을 사용하기 위해 네이티브 메소드를 사용할 수 있다. ex. 윈도우에만 제공하는 ..

Language/Java

[effective java] 아이템 65. 리플렉션보다는 인터페이스를 사용하라.

핵심 정리 리플렉션은 동적인 프로그래밍을 지원하는 강력한 기능이지만, 단점이 많다. 따라서 객체 생성에만 사용하고, 생성한 객체를 이용할 때는 적절한 인터페이스나 컴파일타임에 알 수 있는 상위 클래스로 형변환해 사용해야 한다. 리플렉션(java.lang.reflect) 개념 자바에서 동적인 프로그래밍을 가능하게 해주는 강력한 기능이다. 프로그램이 실행 중에 자신의 구조를 동적으로 탐색하거나 조작하는 능력이다. 프로그램이 자신을 조사하고 수정할 수 있게 하는 기능이며, 이는 컴파일 시점에는 알 수 없는 클래스나 메소드에 대해 런타임에 동적으로 접근하는 것을 가능하게 한다. 클래스의 정보를 가져올 수 있다. 자바의 Class 객체를 통해 임의의 클래스에 접근할 수 있다. Class 객체는 해당 클래스의 메타..

Language/Java

[effective java] 아이템 64. 객체는 인터페이스를 사용해 참조하라.

핵심 정리 유연성을 위해 구체 클래스가 아닌 인터페이스 타입을 사용하자. 매개변수, 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하라. 예시 1 // 좋은 예. 인터페이스를 타입으로 사용했다. Set sonSet = new LinkedHashSet(); // 쉽게 구현 클래스를 교체할 수 있다. Set sonSet = new HashSet(); 예시 2 // 나쁜 예. 클래스를 타입으로 사용했다. LinkedHashSet sonSet = new LinkedHashSet(); 주의해야 할 점 : 원래의 클래스가 특정 메소드를 제공하고, 그 메소드를 사용하는 코드가 있다면, 새로운 클래스도 반드시 그 메소드를 제공해야 한다. 예시: LinkedHashSet은 순서를 가지는 반면, HashSet는 순서..

JOYERIM
'분류 전체보기' 카테고리의 글 목록 (3 Page)