Language/Java

Language/Java

[effective java] 아이템 53. 가변인수는 신중히 사용하라.

핵심 정리 가변인수는 필요에 따라 개수가 달라질 수 있는 인수를 메소드에 넘길 때 유용하다. 그러나 메소드가 호출될 때마다 배열을 새로 할당하고 초기화하는 비용이 발생한다. 따라서 성능에 민감한 상황에서는 메소드 오버로딩을 통해 성능을 최적화하도록 하자. 가변인수 예시 : int 인수들의 합을 계산해주는 가변인수 메소드 간단한 가변인수 활용 예 static int sum(int... args) { int sum = 0; for (int arg : args) sum += arg; return sum; } 인수가 1개 이상이어야 하는 가변인수 메소드 - 잘못 구현한 예 public static int min(int... args) { if (args.length == 0) { throw new Illegal..

Language/Java

[effective java] 아이템 52. 다중정의는 신중히 사용하라.

핵심 요약 매개변수 수가 같을 경우 오버로딩을 피하자. 그러나 구현해야 할 경우, 형변환을 통해 명확히 선택하도록 하자. 그것이 불가능하다면 같은 객체을 입력받는 오버로딩 메소드들에 대해 모두 동일하게 동작하도록 하자. 재정의(Overriding)와 다중정의(Overloading) : 재정의한 메소드는 동적으로, 다중정의한 메소드는 정적으로 선택된다. 재정의(Overriding) 메소드를 재정의한 다음 하위 클래스 인스턴스에서 메소드를 호출하면 재정의한 메소드가 실행되며, 컴파일 타임의 인스턴스 타입은 신경쓰지 않는다. class Wine { String name() { return "포도주"; } } class SparklingWine extends Wine { @Override String name(..

Language/Java

[effective java] 아이템 51. 메서드 시그니처를 신중히 설계하라.

아이템 51은 API 설계를 위한 다양한 Tip들을 설명한다. 메소드 이름을 신중히 짓자. 표준 명명 규칙(item 68)을 따르자. 예를 들어, Java에서는 메소드 이름을 camel case를 사용한다 이해하기 쉬운 이름을 사용하자. 일관된 이름을 사용하자. 같은 패키지나 클래스 내에서 메소드 이름은 일관성을 유지해야 한다. 커뮤니티에서 널리 사용하는 이름을 사용하자. 너무 긴 이름은 피하자. 편의 메소드는 적당히 만들자. 클래스/인터페이스에 메소드가 너무 많으면 복잡성이 커지고, 코드의 가독성이 저하된다. 또한, 문서화, 테스트, 유지보수 등의 작업을 복잡하게 만든다. 클래스/인터페이스는 해당 클래스/인터페이스가 수행해야 할 기능에 필요한 메소드만 제공해야 한다. 즉, 각 메소드는 한 가지 기능을 ..

Language/Java

[effective java] 아이템 50. 적시에 방어적 복사본을 만들라.

핵심 요약 해당 아이템은 클라이언트로부터 받은 가변 매개변수와 클라이언트에게 반환하는 데이터를 보호하는 방법에 대해 다룬다. 이는 자바 클래스가 불변성을 유지하기 위해 필요한 기법이라고 볼 수 있다. 클래스가 클라이언트로부터 받은 가변 매개변수에 대해 방어적 복사를 수행하면, 클래스를 보호할 수 있다. 즉, 클래스 내부에서 사용하는 데이터는 외부에 노출되지 않도록 보호해야 한다. 클래스가 클라이언트에게 데이터를 반환할 때도 방어적 복사를 수행해야 한다. 클래스 내부의 데이터를 직접 반환하면 클라이언트에 의해 변경될 수 있기 때문이다. 또한, 방어적 복사는 성능 저하를 가져올 수 있으므로 항상 필요한 경우에만 사용해야 한다. 만약 클래스와 클라이언트 사이에 확실한 신뢰가 잇거나, 복사 없이도 불변성을 유지..

Language/Java

[effective java] 아이템 49. 매개변수가 유효한지 검사하라.

핵심 요약 유효성 검사는 메소드나 생성자가 예상하는 입력 조건을 충족하는지 검사하는 과정이다. 이를 통해 오류를 되도록 빠르게 처리할 수 있다. 공개 메소드는 매개변수 유효성을 반드시 검사해야 하며, 유효하지않은 매개변수가 발견될 때 적절한 예외를 던져야 한다. 일반적으로 사용되는 예외에는 'IllegalArgumentException', 'IndexOutOfBoundsException', 'NullPointerException' 등이 있다. 비공개 메소드는 assert 문을 사용하여 매개변수 유효성을 검사할 수 있다, 그러나 assert 문은 런타임에 기본적으로 비활성화되므로 주의해서 사용해야 한다. 성능상의 이유로 유효성 검사를 생략하는 경우(유효성 검사 비용이 지나치게 높거나 실용적이지 않을 때, ..

Language/Java

[effective java] 아이템 48. 스트림 병렬화는 주의해서 적용하라.

핵심 정리 스트림 병렬화는 신중하게 사용해야 한다. 그리고 실제로 테스트하여 성능을 확인해야 한다. 무분별한 병렬화는 오히려 성능 저하를 일으키고, 예상치 못한 문제를 야기할 수 있다. 1. 스트림 병렬화를 신중하게 사용해라 스트림 병렬화를 적용하면 코어 수에 따라 성능이 향상될 수 있지만, 이는 잘못 사용하면 성능을 저하시킬 수 있다. 병렬화는 추가적인 계산 비용을 발생시키고, 모든 작업이 병렬화로 이익을 얻지는 못한다. 따라서 병렬화를 고려하기 전에 작업이 병렬로 수행될 때 성능 이득을 얻을 수 있는지 충분히 분석해야 한다. 2. 자동 병렬화를 무조건적으로 신뢰하지 마라. Stream API는 데이터 처리를 병렬화하는 도구를 제공하지만, 이를 잘못 사용하면 예상치 못한 성능 저하나 잘못된 결과를 초래..

Language/Java

[effective java] 아이템 47. 반환 타입으로는 스트림보다 컬렉션이 낮다.

핵심 정리 자바에서는 Stream 또는 Iterable을 반환하는 API를 설계할 때 특정 패턴을 고려해야 한다. 1. 어댑터의 사용 Stream을 Iterable로, 또는 Iterable을 Stream으로 변환하기 위한 어댑터 메서드가 필요하다. 이 어댑터를 이용하면 개발자는 Stream과 Iterable 간에 변환이 필요한 경우에 유연하게 대응할 수 있다. 그러나 어댑터의 사용은 코드를 복잡하게 만들고 성능을 저하시킬 수 있다. 따라서 불가피한 경우가 아니라면 이러한 변환은 최소화하는 것이 좋다. 2. Collection의 사용 원소 시퀀스를 반환하는 메서드를 작성할 때는 Stream과 Iterable을 모두 지원할 수 있도록 작성하는 것이 좋다. 가능하다면 Collection이나 그 하위 타입을 반..

Language/Java

[effective java] 아이템 46. 스트림에서는 부작용 없는 함수를 사용하라.

핵심 요약 스트림 API에서는 람다 표현식이나 메서드 참조 등의 동작에 대해 외부 상태를 변경하지 않아야 한다. 이러한 원칙은 함수형 프로그래밍에서 가져온 개념으로, 데이터의 불변성을 유지하고 병렬 처리에 안전함을 보장하기 위함이다. 이와 관련하여 Collectors는 외부 상태를 변경하지 않고 스트림의 요소들을 수집하는 방법을 제공한다. Collectors의 여러 메서드들은 스트림의 결과를 수집하는 동안 상태를 변경하지 않는다. 대신, 새로운 컬렉션을 반환하거나, 집계값을 계산하거나, 그룹을 형성하는 등의 연산을 수행한다. 예를 들어, Collectors.toList()는 스트림의 모든 요소를 새로운 리스트에 수집하고, Collectors.groupingBy()는 주어진 분류 함수에 따라 요소들을 그룹..

JOYERIM
'Language/Java' 카테고리의 글 목록 (5 Page)