분류 전체보기 2425

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

예외를 안 써도 되는 상황에서는 예외를 사용하지 말자 코드가 달성하고자 한 목표 JVM은 배열에 접근할 때마다 인덱스가 범위를 넘지 않는지 검사 일반적인 반복문도 배열 범위의 경계에 도달하면 종료 일반적인 반복문을 사용하면 검사를 두 번하므로 두 검사 중 하나를 생략함으로써 성능 최적화를 목표함 위 코드의 문제점 코드 가독성 저하 잘못된 추론을 근거로 성능 최적화를 노렸고 잘못되었다는 근거는 다음과 같음 예외는 예외 상황에 사용할 용도로 설계되었으므로 JVM 구현자 입장에서는 최적화에 별로 신경 쓰지 않았을 가능성이 큼 try-catch 블록 내 코드는 JVM이 적용할 수 있는 최적화가 제한됨 배열을 순회하는 표준 관용구는 앞서 걱정한 중복 검사를 수행하지 않음 (JVM이 알아서 최적화) 1. 예외를 사..

JAVA/Effective Java 2024.03.21

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

자바 플랫폼은 명명 규칙이 잘 정립되어 있으며 그중 많은 것이 자바 언어 명세에 기술되어 있습니다. https://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html Chapter 6. Names class Test { static int v; static final int f = 3; public static void main(String[] args) { int i; i = 1; v = 2; f = 33; // compile-time error System.out.println(i + " " + v + " " + f); } } In this program, the names used as the left-hand-sides in the assi docs.or..

JAVA/Effective Java 2024.03.20

백준 17071번 숨바꼭질 5

문제 링크입니다: https://www.acmicpc.net/problem/17071 17071번: 숨바꼭질 5 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 500,000)에 있고, 동생은 점 K(0 ≤ K ≤ 500,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 www.acmicpc.net 동생의 위치가 계속 움직이기 때문에 기존 숨바꼭질 문제들의 심화 버전이었습니다. 알고리즘은 아래와 같습니다. 1. 주어진 N이 너무 크기 때문에 `visited[수빈이의 위치][경과한 초]`와 같이 이차원 배열을 선언하지 못합니다. 1.1 이 문제의 핵심은 수빈이가 [+1, -1] 혹은 [-1, +1]과 같이 이초에 걸쳐 동일한 위치로 이동할..

알고리즘/BOJ 2024.03.20

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

최적화 관련 명언 `(맹목적인 어리석음을 포함해) 그 어떤 핑계보다 효율성이라는 이름 아래 행해진 컴퓨팅 죄악이 더 많다(심지어 효율을 높이지도 못하면서).` - 윌리엄 울프 `(전체의 97% 정도인) 자그마한 효율성은 모두 잊자. 섣부른 최적화가 만악의 근원이다.` - 도널드 크누스 `첫 번째, 하지 마라. 두 번째, (전문가 한정) 아직 하지 마라. 다시 말해, 완전히 명백하고 최적화되지 않은 해법을 찾을 때까지는 하지 마라` - M.A 잭슨 정리하자면 최적화는 주로 해로운 결과를 초래할 가능성이 높으며, 특히 섣불리 진행할수록 더 그럴 확률이 높습니다. 따라서 최적화를 진행하기 전에 많은 요소를 고려한 뒤 진행해야 합니다. 프로그램을 설계할 때 고려해야 할 요소 1. 빠른 프로그램보다는 좋은 프로그..

JAVA/Effective Java 2024.03.19

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

Java Native Interface(JNI)는 자바 프로그램이 네이티브 메서드를 호출하는 기술입니다. "네이티브 메서드"는 일반적으로 특정 프로그래밍 언어로 작성된 코드가 아닌, 시스템의 네이티브 코드로 구현된 함수 이러한 메서드들은 일반적으로 고성능이 필요한 작업이나 특정 플랫폼과의 상호 작용을 수행할 때 사용 네이티브 메서드는 일반적으로 C나 C++와 같은 저수준 언어로 작성되며, 특정 플랫폼의 기능에 직접 액세스 가능 전통적인 네이티브 메서드의 주요 쓰임 전통적인 네이티브 메서드의 주요 쓰임은 다음과 같습니다. 레지스트리 같은 플랫폼 특화 기능을 사용 네이티브 코드로 작성된 기본 라이브러리를 사용 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 별도로 네이티브 언어로 작성 하지만 자바 ..

JAVA/Effective Java 2024.03.19

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

리플렉션 기능을 이용하면 프로그램에서 임의의 클래스에 접근할 수 있으며 Class 객체가 주어지면 클래스 정보를 통해 다음과 같은 인스턴스를 가져올 수 있습니다. 생성자 메서드 필드 1. 생성자 생성자 시그니처를 가져올 수 있음 생성자 인스턴스를 통해 객체를 생성할 수 있음 2. 메서드 메서드 시그니처를 가져올 수 있음 메서드 인스턴스를 통해 메서드를 실행시킬 수 있음 3. 필드 필드 타입, 멤버 필드명 등을 가져올 수 있음 MyClass.java ReflectionExample.java 리플렉션의 단점 앞서 코드에서 볼 수 있었다시피 리플렉션은 강력한 기능이지만 다음과 같은 단점들이 존재합니다. 컴파일 시점 타입 검사가 주는 이점을 누릴 수 없음 리플렉션을 이용하면 코드가 지저분해지고 장황해짐 성능 저..

JAVA/Effective Java 2024.03.19

백준 12869번 뮤탈리스크

문제 링크입니다: https://www.acmicpc.net/problem/12869 12869번: 뮤탈리스크 1, 3, 2 순서대로 공격을 하면, 남은 체력은 (12-9, 10-1, 4-3) = (3, 9, 1)이다. 2, 1, 3 순서대로 공격을 하면, 남은 체력은 (0, 0, 0)이다. www.acmicpc.net 주어진 N과 SCV의 최대 체력이 크지 않기 때문에 브루트포스로 풀어도 되는 문제였습니다. visited set의 키를 {scv 체력의 순열, 몇 번째 공격}으로 두는 것이 핵심이었습니다. 억지로 푼 느낌... 개발환경:Visual Studio 2022 지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

알고리즘/BOJ 2024.03.18

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

아이템 51에서 소개된 `매개변수 타입으로 클래스가 아니라 인터페이스를 사용하라`는 내용을 `객체는 클래스가 아닌 인터페이스로 참조하라`로 보다 구체적으로 확장할 수 있습니다. 적합한 인터페이스만 존재한다면 매개변수 뿐 아니라 반환값, 변수, 그리고 필드를 전부 인터페이스 타입으로 선언하는 것을 권장합니다. 위 내용을 적용한다면 객체의 실제 클래스를 사용해야 할 상황은 `오직` 생성자로 생성할 때 뿐입니다. 코드 부연 설명 좋은 예는 Set 인터페이스 타입으로 변수를 선언 좋지 않은 예는 Set 인터페이스의 구현체 중 하나인 LinkedHashSet 타입으로 변수를 선언 1. 인터페이스 타입으로 사용하는 습관을 길러야 하는 이유 프로그램을 유연하게 작성하기 위해서는 인터페이스 타입으로 사용하는 습관을 길..

JAVA/Effective Java 2024.03.18

[아이템 63] 문자열 연결은 느리니 주의하라

문자열 연결 연산자(+)는 여러 문자열을 하나로 결합해주는 편리한 도구입니다. 주로 한 줄로 된 출력값이나 고정 크기의 객체의 문자열 표현을 만들 때 사용하기에 유용합니다. ex) `String fullName = this.firstName + this.lastName;` 하지만 문자열 연결 연산자로 문자열 N개를 잇는 시간 복잡도는 O(N^2)이기 때문에 본격적으로 많은 문자열을 합치기 시작하면 성능 저하를 피하기 어렵습니다. 문자열은 불변이기 때문에 두 문자열을 연결하는 경우 양쪽의 내용을 복사하여 연결한 다음 새로운 String 객체를 생성해야하기 때문 성능을 포기하고 싶지 않다면 String 대신 StringBuilder를 사용하는 것을 권장 자바 6번 이후 문자열 연결 성능을 다방면으로 개선했지..

JAVA/Effective Java 2024.03.17

[아이템 62] 다른 타입이 적절하다면 문자열 사용을 피하라

문자열은 널리 사용되며 자바에서 잘 지원되기 때문에, 일반적으로 텍스트 표현 이외의 다른 용도로도 자주 사용됩니다. 이번 아이템에서는 문자열을 쓰지 않아야 할 사례를 다루겠습니다. 문자열은 다른 값 타입을 대신하기에 적합하지 않음 문자열은 열거 타입을 대신하기에 적합하지 않음 문자열은 혼합 타입을 대신하기에 적합하지 않음 문자열은 권한을 표현하기에 적합하지 않음 1. 문자열은 다른 값 타입을 대신하기에 적합하지 않음 많은 개발자들이 파일, 네트워크, 키보드 입력으로부터 데이터를 받을 때 주로 문자열을 이용 하지만 입력받을 데이터가 진짜 문자열인 경우 즉, 텍스트일 때만 문자열을 사용하는 것을 권장 데이터가 수치형이면 int, long, double 등 수치에 적합한 타입을 사용 `Yes/No`와 같은 질..

JAVA/Effective Java 2024.03.17