본문 바로가기

자바

(19)
Hashtable, HashMap, ConcurrentHashMap 간단 비교 HashMap, Hashtable, ConcurrentHashMap Map 인터페이스를 구현하고 세가지의 구현체는 비슷하지만 조금씩 다른 차이점을 가지고 있다. Hashtable 해시 테이블은 형태로 데이터를 저장하는 자료구조 중 하나이다. 내부적으로 배열을 사용해 데이터를 저장하는데, 이 때 각각의 Key 값에 해시 함수를 적용해 이 배열의 고유한 index를 생성하고 값을 저장, 검색할 때 사용한다. 자바에서는 java.util 패키지 안에 Map 인터페이스를 구현한 HashTable을 사용할 수 있다. 메서드에 붙어있는 synchronized put 메서드를 보면 null 값을 허용하지 않고 있음을 볼 수 있다. Hashtable 클래스에서 구현하고 있는 모든 메서드를 보면 synchronized ..
[Java] 람다의 변수 범위 2021-03-19글 람다의 변수 범위 물론 위의 코드는 미션을 위해 일단 구현만을 목적으로 많은 리팩토링이 필요하니 참고 🥲 미션을 진행하다가 for 문 내에 stream을 쓰게 되었는데, i의 값을 람다식 내에서 사용하려니 컴파일 에러가 났다. "Variable used in lambda expression should be final or effectively final" 즉 람다식에서 사용되는 변수는 final이거나 effectively final이어야 한다. effectively final은 무엇이며, 람다의 변수 범위를 정확히 짚고 넘어가자. 람다의 변수 범위 다음과 같은 Lambda 클래스가 있고, 각각의 메서드를 호출해 클래스 필드인 i가 어떻게 바뀌는지 살펴본다 🔎 public class..
[Java] Lambda, Stream API 강의 정리 2021-03-16글 함수형 프로그래밍의 장점 ? 관심사의 분리 관심사의 분리란 무엇일까? 예제를 들어보자. List numbers = Arrays.asList(1, 2, 3, 4, 5); 리스트에 있는 원소마다 콜론을 추가하려 한다. 이때 forEach() 를 사용한다면 ? @Test public void ForEach를_활용하여_콜론을_추가하는_문자열_작성() { StringBuilder stringBuilder = new StringBuilder(); for (Integer number : numbers) { stringBuilder.append(number).append(" : "); } if (stringBuilder.length() > 0) { stringBuilder.delete(string..
[Java] Functional Interface 2021-03-06글 함수형 인터페이스 자바 8부터 자바는 객체지향 언어일 뿐만 아니라 함수형 언어도 지원할 수 있게되었다. 자바에서는 숫자, 문자 같은 원시 타입, 클래스를 통해 정의하는 참조 타입 객체들이 일급 객체가 될 수 있지만, (함수형 인터페이스가 등장하기 전까지는) 함수에 해당하는 메서드는 일급 객체가 아니었다. 덕분에 오늘 뜯어 볼 Functional Interface의 등장으로, 객체 안에만 존재했던 함수(메서드)를 일급 객체로 다룰 수 있게되었다. 🤔 일급 객체...? 어떤 개체가 다음 3가지 조건을 만족하는 경우, 이를 일급 객체라고 말한다. 파라미터로 전달할 수 있다. 반환값으로 사용할 수 있다. 변수나 데이터 구조 안에 담을 수 있다. 할당에 사용된 이름과 관계없이 고유한 구별이 ..
[Java] 추상 클래스와 인터페이스의 차이 2021-03-05글 추상 클래스 간단히 말하면... 클래스를 설계도라 하면, 추상 클래스는 미완성 설계도에 비유할 수 있다. (여기서 클래스가 미완성이라는 것은 추상 메서드를 포함하고 있다는 의미이다.) 예를 들면, 같은 크기의TV라도 기능의 차이에 따라 여러 종류의 모델이 있지만 설계도 90은 동일할테니, 어느정도 틀을 갖춘 상태에서 진행하는 것이 좋다. 이때 사용할 수 있는 것이 추상 클래스이다. 추상 메서드 ? 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것이 추상메서드이다. 추상 메서드는 상속받는 클래스에 따라 달라질 수 있다. 추상 클래스 규칙 추상 클래스는 키워드 abstract를 붙여 표현한다. 추상 메서드를 포함하지 않은 클래스에서도 abstract를 붙여서 추상 클래스로 지정..
[Java] 상속에 대하여 2021-03-04글 강의시간에 배운 상속 개념에 추가로 공부한 내용을 정리해본다 ✍️ 상속 먼저 상속이란 ? 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 예제를 보명서 상속의 필요성을 파악해보자 ! Example 카페에서 커피와 차를 판매한다. 커피와 차를 준비하는 과정을 살펴보자. 커피 물을 끓인다. 커피머신으로 커피를 내린다. 컵에 붓는다. 설탕과 우유를 추가한다.차 물을 끓인다. 차 티백을 담근다. 컵에 붓는다. 레몬을 추가한다. 그렇다면 각각의 과정들을 코드로 구현해본다. public class Coffee { void prepareRecipe() { boilWater(); brewCoffeeMachine(); pourInCup(); addSugarAndMilk(); } publ..
[Java] BigDecimal에 관한 고찰 🕵️‍♀️ 2021-03-01글 이번 미션에서 BigDecimal에 대한 언급이 많았는데, 도대체 그게 뭐지 🤷‍♀️ 나만 몰라 ❓ 에서부터 출발한 BigDecimal에 대한 고찰 ~ 이번주 회고에서 앞으로 포스팅을 내가 이해한 글을 설명하듯이 ! 작성하기로 다짐한 내용을 최대한 반영하려고 노력중 ✍️ 누군가 이 글을 읽고 있다면 아 얘가 이런짓을 하고 있구나 가볍게 봐주길 ㅎㅎ 🙈 BigDecimal을 왜 쓰지 ? Test 과연 위 테스트 케이스는 통과를 할까? 정답은 👀 허허 어이없게도 실패합니다. 왜 실패하냐구요 ? 자바는 IEEE 754 부동 소수점 방식을 사용해서, 정확한 실수를 저장하지 않고 최대한 완벽에 가깝기를 바라는 근사치 값을 저장하기 때문이다 ! 지금은 단순히 개발자 하나가 테스트를 위해 작성한..
[Java] Stream 부수기 2021-02-25 글 코드를 짜다보면 가독성과 간결함을 위해 stream을 자주 쓰게 된다. 프리코스 때 Stream에 대해 정리했었으나, 내가 쓴 글을 리팩토링(ㅎ) 해보면서 다시 개념을 익혀야 겠다. 스트림? 배열 또는 컬렉션 인스턴스에 저장된 데이터를 꺼내서 파이프에 흘려보낸다. 중간 연산 : 마지막이 아닌 위치에서 진행이 되어야 하는 연산 최종 연산 : 마지막에 진행이 되어야 하는 연산 스트림은 중간 연산과 최종 연산을 진행하기 좋은 구조로 배치된 복사본이라 할 수 있다. 스트림의 특성 가독성과 간결함 컬렉션이나 배열에 데이터를 담고 원하는 결과를 얻기 위해 for문과 Iterator를 이용해 작성한 코드는 가독성이 떨어지고 재사용성도 떨어진다. 데이터 소스 추상화 어떤 메소드로 처리하기 위해 ..