일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- BFS
- 비트마스크
- docker
- 파이썬
- 헥사고날 아키텍처
- springboot
- pandas
- disjoint set
- series
- dfs
- 백준
- spring security
- 데이터 flow
- 세그먼트 트리
- JPA
- dataframe
- 다익스트라
- DP
- java
- UML
- 스프링
- 포트앤어댑터 아키텍처
- 위상정렬
- 문자열
- 알고리즘
- equals
- 자바
- 이펙티브 자바
- ddd
- Redis
- Today
- Total
목록자바 메모장 (17)
코딩못하는사람
HashMap은 key의 중복을 허용하지 않고 key-value를 1:1로 매핑하는 자료구조이다. hash의 제공해주는중 장점으로는 빠른 탐색,삽입,삭제에도 있지만 해시 충돌이라는 문제를 꼭 생각해봐야 한다. 해쉬 충돌 동일하지 않은 어떤 객체 X와 Y가 있을 때, 즉 X.equals(Y)가 '거짓'일 때 X.hashCode() != Y.hashCode()가 같지 않다면, 이때 사용하는 해시 함수는 완전한 해시 함수(perfect hash functions)라고 한다. Integer, Long, Double 같은 Number 객체는 객체가 나타내려는 값 자체를 해시 값으로 사용할 수 있기 때문에 완전한 해시 함수 대상으로 삼을 수 있다. 하지만 String이나 POJO(plain old java obje..
아이템43] 람다보다는 메서드 참조를 사용하라 람다의 장점은 익명클래스보다 코드가 간결해진다는 장점을 가진다. 하지만 여기서 메서드 참조(Method reference)를 활용하면 한단계 더 간결해진 코드를 만들 수 있다. 코드로 예시를 보자. Map에 키가 없다면 키와 숫자 1을 매핑하고, 키가 존재하면 기존 매핑값을 증가시키는 코드이다. map.merge(key, 1, (count, incr) -> count + incr); //Map에서 제공하는 merge 메서드 merge 메서드는 키,값,함수를 인자로 받는다. 깔끔해 보이지만 매개변수 count와 incr이 하는일 없이 코드를 차지한다. 자바 8에서는 Integer 클래스 및 기본타입 래퍼클래스은 이 람다와 기능이 같은 정적 메서드 sum 을 제..
아이템 42]익명클래스보다는 람다를 사용하라 자바 8에 와서 추상 메서드 하나짜리 인터페이스는 의미를 인정받아 간결하게 코드를 작성할 수 있게 해주는 방식이 도입되었다. 함수형 인터페이스라 부르는 인터페이스들의 인스턴스를 람다식(lambda expression,혹은 람다)을 사용해 만들 수 있게 된 것이다. 람다는 익명 클래스와 개념은 비슷하지만 코드는 훨씬 간결하고 자질구레한 코드들이 사라지고 어떤 동작을 하는지 명확하게 보인다는 장점을 가진다. 익명 클래스를 사용할 때와 람다를 사용했을 때의 코드를 비교해보자. 문자열을 길이순으로 정렬하는 코드이다. 1.익명 클래스의 인스턴스를 함수객체로 사용하는 방식 Collection.sort(words, new Comparator() { public int co..
아이템40]@Override 애너테이션을 일관되게 사용하라. @Override 애너테이션은 상위 타입 메서드를 재정의했음을 알려준다. 이 애너테이션을 일관되게 사용하면 여러가지 악명높은 버그를 예방해준다. public class Bigram { private final char first; private final char second; public Bigram(char first, char second) { this.first = first; this.second = second; } public boolean equals(Bigram b) { return b.first == first && b.second == second; } public int hashCode() { return 31 * firs..
아이템29] 이왕이면 제네릭 타입으로 만들라 제네릭(generic)이란? 데이터의 타입(data type)을 일반화한다(generalize)는 것을 의미한다. 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법이다. 이렇게 컴파일 시에 타입검사를 미리 수행하면 타입 안정성과 타입 검사에 들어가는 노력을 줄일 수 있다. 클라이언트에서 직접 형변환해야 하는 타입보다 제네릭 타입이 더 안전하고 쓰기 편하다. 따라서 새로운 타입을 설계할 때 형변환 없이 제네릭 타입을 사용해주자. 제네릭으로의 변경이 필요한 코드를 보고 제네릭으로 고쳐보면서 이해해보자. public class Stack { private Object[] elements; private int size = 0; priva..
[아이템15]클래스와 멤버의 접근 권한을 최소화 어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 차이는 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로 부터 얼마나 잘 숨겼는지에 의해 결정된다. 잘 설계된 컴포넌트는 모든 내부구현을 숨기고 구현과 API를 깔끔하게 분리해서 서로의 내부 동작방식을 알 필요가 없게된다. 이것을 정보은닉 및 캡슐화라고 부른다. 정보은닉의 장점 시스템 개발 속도 상승 (여러가지 컴포넌트를 병렬적으로 개발 가능) 시스템 관리 비용 절감 (디버깅 및 다른 컴포넌트로 교체하는 부담이 적다) 성능최적화에 도움 소프트웨어 재사용성을 높인다.(외부 의존도가 거의 없고 독자적이라면 낯선 환경에서도 사용가능) 큰 시스템 제작 난이도를 낮춰준다. (전체가 완성되지 않아도 개별 컴포넌트의..
[아이템1] 생성자 대신 정적 팩터리 메서드를 고려하자 클라이언트가 클래스의 인스턴스를 얻기 위해서는 보통 public 생성자를 사용했다. 하지만 다른 방법으로 public static 팩토리 메소드를 사용해서 해당 클래스의 인스턴스를 만드는 방법도 있다. public static 팩토리 메소드의 장점 1. 이름을 가질 수 있다. BigInteger.probblePrime를 보자. 기존 생성자로 BigInteger()을 사용하는 것 보다 BigInteger.probblePrime()를 사용하면 만드려는 인스턴스 객체의 특성을 더 알아보기 쉽게 묘사할 수 있다. 2.호출될 때마다 인스턴스를 새로 생성하지 않아도 된다. 불변(immutable) 클래스인 경우나 매번 새로운 객체를 만들 필요가 없는 경우에 미..
Enum(열거형) 이란? 서로 연관이 있는 상수들을 묶어 놓은 집합이다. 우리가 자바에서 상수를 정의할 때 final static 을 이용해서 정의하던 문제점들을 보완할 수 있다. Enum의 장점 코드가 단순해지고 가독성이 좋아 구현 의도를 파악하기 쉽다. 인스턴스 생성,상속을 방지하여 상수의 타입안정성이 보장된다. 허용 가능한 값들을 제한할 수 있다. IDE의 적극적인 지원을 받을 수 있다.(자동완성,오타검증,텍스트 리펙토링 등등) 리펙토링시 변경 범위가 최소화된다.(Enum 코드만 고치면 됨) Enum을 사용함으로써 얻는 장점 gender1 = EnumExample.MALE; gender1 = EnumExample.FEMALE; 를 선언한 부분까지는 문제가 없어보이나 gender1='boy' 라는 값..
HashSet,HashMap,Hashtable 자료구조를 이해하려면 hashCode를 이해하고 있어야 해서 정리했다. 객체를 비교할 때 동일성 비교 == 연산자: ==연산자는 두 객체의 주소가 같은지를 비교해서 같으면 true 다르다면 false를 반환한다(primitive타입은 값을 통해서 비교한다). 동등성 비교 equals() 메서드: equals는 Object의 기본 메서드로 객체 내부의 값을 비교해준다. 우리가 자주 사용하는 클래스들은 equals를 따로 override해서 동등성 비교를 각 데이터들에 맞게 설정해주었다. 예를 들어 String은 리터럴 방식으로 선언하나 new String 객체로 생성하나 문자열 값만 같으면 equals를 true로 반환하게 만들어 주었고, Integer은 in..
Array,ArrayList의 구조와 차이점등이 궁금해서 정리해보려고 한다. 배열(Array) 여러 데이터를 하나의 이름으로 묶어서 관리하게 해주는 자료구조. index와 값으로 구성되어 있다. 배열에서 index는 어떤 값인지 알려주는 유일무이한 식별자이다. (list에서는 index가 몇번째에 있는지 데이터인지 알려주는 척도) 연속된 메모리에 저장되어 있고 배열을 정의하면 길이를 바꿀 수 없다. 또한 배열은 정적이므로 엘리먼트가 삭제되면 빈공간으로 두게 된다. 장점: 인덱스를 통한 검색이 빠르다, 연속적이므로 메모리 관리가 편하다. 단점: 삭제된 공간을 빈공간으로 두기 때문에 메모리 낭비가 있다,크기를 바꾸지 못한다. Collections 프레임워크 Array로만 모든 데이터를 다루게 되면 비효율적인..