일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 유니온 파인드
- bottom-up
- 동적계획법
- top-down
- union-find
- Controller
- 우선순위큐
- Android Studio
- Django
- onclick
- Java
- Python
- 플로이드 와샬
- 벨만 포드 알고리즘
- 엔테크서비스
- dto
- scikit-learn
- 최단경로
- 직무면접
- 코딩테스트
- clean code
- 다익스트라
- BufferedReader
- kmeans
- 거쳐가는 정점
- 음수가 포함된 최단경로
- spring boot
- compiler
- disjoint set
- 기술면접
- Today
- Total
목록Developer's_til (75)
춤추는 개발자
Cloneable은 복제해도 되는 클래스임을 명시하는 용도의 mixin interface지만, 의도한 목적을 제대로 이루지 못했다. 가장 큰 문제는 clone 메서드는 선언된 곳이 Cloneable이 아닌 Object이고, protected라는데 있다. Cloneable 인터페이스는 protected 메서드인 clone의 동작 방식을 결정한다. clone을 호출하면 그 객체의 필드들을 하나하나 복사한 객체를 반환한다. clone 메서드의 일반 규약으로 Object 명세에서 가져온 설명은 다음과 같다. 이 객체의 복사본을 생성해 반환한다. '복사'의 정확한 뜻은 그 객체를 구현한 클래스에 따라 다를 수 있다. 일반적인 의도는 다음과 같다. 어떤 객체 x에 대해 다음 식은 참이다. x.clone() != x..
equals를 재정의한 클래스 모두에서 hashCode도 재정의해야한다. 그렇지 않으면 hashCode 일반 규약을 어기게 되어 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제를 일으킨다. [ Object 명세에서 발췌한 규약 ] 1. equals 비교에서 사용되는 정보가 변경되지 않았다면, 어플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 한다. 2. equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다. 3. equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 서로 다른 값을 반환할 필요는 ..
equals메서드는 재정의하기 쉬워 보이지만 여러가지 함정이 있어서 자칫하면 끔찍한 결과를 초래한다. 다음에서 열거한 상황 중 하나에 해당한다면 재정의하지 않는 것이 좋다. [ equals를 재정의하지 않는 상황 ] 1. 각 인스턴스가 본질적으로 고유하다 - 동작하는 개체를 표현하는 클래스가 여기에 해당(Thread) 2. 인스턴스의 '논리적 동치성'을 검사할 일이 없다. 3. 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다. 4. 클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없다. - 이를 회피하고 싶다면 아래와 같은 메서드를 구현해두자. @Override public boolean equals(Object o) { throw ne..
똑같은 기능의 객체를 매번생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 다음 코드 중 첫번째는 절대 하지말아야 할 극단적인 예로 코드가 실행될 때마다 새로운 String 인스터스를 생성한다. 이를 개선한 버전이 두번째 코드다. 새로운 인스턴스를 만드는 대신 하나의 String 인스턴스를 사용한다. 나아가 이 방식을 사용한다면 같은 가상 머신 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다. String s = new String("str"); String s = "str"; 생성자 대신 정적 팩터리 메서드를 제공하는 불변 클래스에서는 정적 팩터리 메서드를 사용해 불필요한 객체 생성을 피할 수 있다. 아래 첫번째 생성자는 호출할 때마다 새로운 객체를 ..
✅ 싱글턴이란? 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 전형적인 예로는 함수와 같은 무상태 객체나 설계상 유일해야 하는 시스템 컴포넌트가 있다. ✅ 싱글턴 만드는 방식 [ public static final 필드 방식의 싱글턴 ] public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public void leaveTheBuilding() { ... } } private 생성자는 public static final 필드인 Elvis.INSTANCE를 초기화할 때 딱 한 번만 호출된다. 즉, public이나 protected 생성자가 없으므로 Elvis 클래스가 초기화될 때 ..
클래스의 인스턴스를 얻는 일반적인 방법은 public 생성자다. 하지만, 이와 별도로 클래스는 정적 팩토리 메서드를 제공할 수 있다. 정적 팩토리 메서드란 객체 생성의 역할을 하는 클래스 메서드라는 의미를 갖고 있다. 아래 예시 코드를 참고하자면 java.time 패키지에 포함된 LocalTime 클래스의 정적 팩터리 메서드다. // LocalTime.class public static LocalTime of(int hour, int minute) { ChronoField.HOUR_OF_DAY.checkValidValue((long)hour); if (minute == 0) { return HOURS[hour]; } else { ChronoField.MINUTE_OF_HOUR.checkValidValue..
✅ Gson이란? Json을 파싱하고, 생성하기 위해 구글에서 개발한 오픈소스로 데이터를 처리하는데 높은 수준의 유연성을 제공한다. 내부적으로 리플렉션(Reflection)을 사용하기 때문에 Map을 사용하여 Json을 파싱하는 것보다 가독성있는 코드를 작성할 수 있다. Spring Framework에 Gson을 적용하려면 의존성(dependency)를 추가해서 사용해야 한다. [ Maven 설정 ] com.google.code.gson gson 2.8.5 [ Gradle 설정 ] dependencies { implementation 'com.google.code.gson:gson:2.8.5' } ✅ Gson 활용하기 예제 코드를 통해 Java 객체와 Gson 라이브러리를 활용하여 Json을 파싱 및 생..