체이닝 방식을 이용한 해시 충돌 처리를 구현해보자! 체이닝 방식은 해시 테이블에서 충돌이 발생할 경우 충돌된 키를 연결 리스트 형태로 처리하는 방법이다. 충돌이 발생하면 동일한 해시 버킷에 속한 항목들을 연결 리스트로 연결하여 저장한다. 해시를 저장할 버킷을 링크드 리스트로 선언한다. 링크드 리스트에 키값 멤버를 가진 노드를 저장할 것이다. private static final int DEFAULT_BUCKET_SIZE = 1024; private List[] buckets; private int size; private int bucketSize; public MyLinkedHashTable() { this.buckets = new List[DEFAULT_BUCKET_SIZE]; this.bucketS..
분류 전체보기
Hash 해시는 key, value 쌍으로 이루어진 데이터 구조이다. key는 구현된 hashFunction을 통해 계산된 해시 값(인덱스)으로 bukets에 저장된다. int myhashFunction(K key) { int hash = 0; for (Character ch : key.toString().toCharArray()) { hash += (int)ch; } return hash % this.bucketSize; } hashFunction은 키를 인수로 받는 키를 구현된 로직으로 계산하여 일정 길이의 해시 값을 반환한다. 이러한 해시 값을 인덱스로 사용하여 값을 저장하고 검색한다. 데이터 접근 시 hashFunction으로 키를 계산하여 데이터에 접근하기 때문에 O(1)의 시간 복잡도를 가진다..
핵심 내용 모든 클래스와 멤버는 소프트웨어가 동작하는 한 가장 낮은 접근 권한을 부여하라. 꼭 필요한 것만 골라 최소한의 public API를 설계하자. public 클래스는 상수용 필드 외에는 어떠한 public필드를 가져선 안된다. public static final 필드가 참조하는 객체가 불변인지 확인하라. 📌 여기서 API란 어떤 클래스 혹은 인터페이스에서 제공하는 public 메서드로 다른 해당 클래스 혹은 인터페이스를 사용하는 코드에서 호출할 수 있는 메서드를 의미한다. 클래스와 멤버의 접근 권한을 최소화 하라 잘 설계된 컴포넌트는 클래스 내부 구현 정보를 외부로부터 얼마나 잘 숨겼는지에 판단된다. 자동차를 예로 들어보자. 운전자에게 제공되어야 할 기능(정보)는 자동차를 조작하기 위해 사용될 ..
OT이후 심정 변화 OT 이후에 강민철 강사님의 개발자 마인드 셋 특강을 들었는데 이번 부트캠프에 참여하길 잘했다는 생각이 들 정도로 유익한 강의였다. 주니어 개발자로 성장하기 위해 어떤 마음가짐을 가져야 하는지, 어떻게 성장해야 하는지에 대한 실제 사례를 바탕으로 한 얘기를 들을 수 있었다. 나는 대학교를 졸업하고 5개월동안 혼자 인터넷 강의를 보며 공부했다. 내가 직접 짠 커리큘럼, 일정, 학습 목표를 지키며 공부하였고, 점차 이러한 의문이 들었다. ‘지금 내가 정말 잘 공부하고 있는 것인가?’ 커리큘럼은 여러 교육 백엔드 교육과정의 커리큘럼을 참고하였고, 1일 1커밋과 같은 학습 동기부여 수단도 만들었으며, 학습내용을 정리하는 습관도 얻을 수 있었다. 하지만, ‘내가 잘 공부하고 있는 것인가’ 에 ..
객체 지향 프로그래밍과 함수적 프로그래밍을 혼합함으로써 더욱 효율적인 프로그래밍이 가능하도록 개발 언어가 변하고 있다. 자바 8에서도 함수적 프로그래밍을 위해 람다식을 지원하게 되었다. 함수적 프로그래밍 (Functional Programming) 함수형 프로그래밍은 거의 모든 것을 순수 함수로 나누어 문제를 해결하는 기법으로, 작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이하게 해준다. 람다란 무엇인가? 람다식은 익명 함수(anonymous function)을 생성하기 위한 식이다. → 보통의 메서드와 달리 이름이 없으므로 익명이라 표현한다. → 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부른다. 객체 지향 언어보다는 함수지향 언어에 가깝다. 자바에서 람다식을..
객체지향을 공부하였다면 SOILD 원칙은 모두 들어봤을 것이다. 의존성 역전 원칙에 대해 공부하던 중 의존성 역전 원칙이라는 건 알겠는데 왜 의존성 역전 원칙을 지켜야 하며, 코드를 어떻게 설계해야 하는지에 대해 의문이 생겼다. 따라서 먼저 의존성은 무엇이고 의존성 역전은 무엇인가에 대해 조사해보고 해답을 얻어 보고자 한다. 의존성? 객체의 세계에서 협력은 필수적이며, 객체가 협력한다는 것은 객체 간의 의존성이 존재한다는 것이다. 여기서 의존성이란 파라미터나 리턴 값 또는 지역변수 등으로 다른 객체를 참조하는 것이다. 컴파일타임 의존성 코드를 컴파일하는 시점에 결정되는 의존성 인터페이스가 아닌 구체 클래스에 의존하면 컴파일 타임 의존성을 갖게 된다. 결합도가 높으며 변경에 유연하지 못하다. 런타임 의존성..
동작 파라미터화를 사용하면 자주 변경되는 요구사항에 효과적으로 대응할 수 있다. 동작 파라미터화 (behavior parameterization)? 동작 파라미터화란 아직은 어떻게 실행할 것인지 결정하지 않은 코드를 블록을 의미한다. 동작 파라미터화를 추가하려면 쓸데없는 코드가 늘어나는데, 자바8은 람다로 이 문제를 해결한다. 변화하는 요구사항에 대응하기 변화에 대응하는 코드를 구현하는 것은 어려운 일이다. 농장의 재고목록 애플리케이션에 리스트에서 녹색 사과만 필터링하는 기능을 추가한다고 가정한다. 첫 번째 시도: 녹색 사과 필터링 enum { RED, GREEN } public static List filterGreenApples(List inventory) { List result = new Arra..
동기방식(Vector) vs 비동기 방식(ArrayList) 동기방식 요청을 보낸 후, 응답을 받아야 다음 과정이 동작하는 방식 동기 방식에서는 한 작업이 완료될 때까지 다른 작업은 대기한다. 이는 작업 간의 의존성을 관리할 수 있게 하며, 데이터의 일관성을 유지할 수 있다. 자바에서는 synchronized 키워드를 사용하여 동기화를 구현할 수 있다. Vector는 대부분의 메소드에 synchronized 키워드를 사용하여 동기화하였다. 동기 방식은 다른 방식보다 더 안정적이지만, 작업이 순차적으로 실행되기 때문에 처리 시간이 더 오래 걸릴 수 있다. 따라서 대규모 처리가 필요한 경우에는 비동기 방식을 고려해야 한다. 비동기 방식 요청을 보낸 후, 응답과는 상관 없이 다음 과정이 동작하는 방식 Thre..
컬렉션 프레임워크란 Colleciton: 요소를 수집해서 저장하는 것 프로그램 구현에 필요한 자료구조(Data Structure)를 구현해 놓은 JDK 라이브러리 이다. java.util 패키지에 구현되어 있다. 컬렉션 프레임워크의 주요 인터페이스로는 List, Set, Map, Queue가 있다. 해당 인터페스는 컬렉션을 사용하는 방법을 정의한 것이고, 아래는 이 인터페이스로 사용 가능한 컬렉션 클래스를 나타낸다. List, Set, Queue는 객체를 추가, 삭제, 검색하는 방법에 많은 공통점이 있기 때문에 이 인터페이스의 공통된 메소드들을 모아 Collection 인터페이스로 정의한다. List는 순서를 유지하며 저장하고, 중복 저장이 가능하다는 특징이 있다. Set은 순서를 유지하지 않고 저장하며..