본문 바로가기

Language

(11)
[EFFECTIVE JAVA 3/E] #2 생성자에 매개변수가 많다면 빌더를 고려하라 목차중점적으로 봐야 하는 내용선택적 매개변수가 많은 클래스는 생성자나 정적 팩터리 메서드만으로 표현하기 어렵다.점층적 생성자 패턴이나 자바빈즈 패턴은 유지보수성·안정성 측면에서 한계가 있다.이런 경우 빌더 패턴을 사용하면 가독성과 객체 일관성 면에서 유리하다.주요 개념 요약빌더 패턴은 복잡한 객체를 구성할 때 필수 매개변수와 선택 매개변수를 분리하고, 단계별 설정을 가능하게 하는 설계 기법이다.보통 클래스 내부에 정적 멤버 클래스로 Builder를 두고, 메서드 체인 방식으로 속성들을 설정한 뒤 build() 메서드로 객체를 생성한다.장점매개변수가 많은 경우 코드 가독성이 좋아진다.필수 매개변수와 선택 매개변수를 명확히 구분할 수 있다.메서드 체인(Fluent API)을 통해 설정이 직관적이다.계층적으로..
[EFFECTIVE JAVA 3/E] #1 생성자 대신 정적 팩터리 메서드를 고려하라 목차중점적으로 봐야 하는 내용클래스는 생성자와 별도로 정적 팩터리 메서드를 제공할 수 있다.정적 팩터리 메서드는 생성자와 달리 이름을 가질 수 있어 의도를 명확히 표현할 수 있다.또한, 하위 타입 반환, 인스턴스 재사용, 구현체 캡슐화 등 다양한 이점을 제공한다.주요 개념 요약정적 팩터리 메서드는 new 키워드로 객체를 직접 생성하지 않고,클래스 내부에 선언된 static 메서드를 통해 객체를 반환하는 방식이다. 예시:public class User { private final String name; private User(String name) { this.name = name; } public static User of(String name) { ret..
[TypeScript] 추상 클래스 vs 인터페이스 - 직원 조직도로 이해하기 목차 TypeScript에서 추상 클래스(abstract class)와 인터페이스(interface)는 둘 다 “규약”을 정의하는 도구이다. 하지만 실제 목적과 사용법은 다르다. 이번 글에서는 직원 조직도 비유를 통해 이 차이를 쉽게 정리해보고자 한다.추상 클래스 vs 인터페이스 — 핵심 차이인터페이스 (interface)컴파일 후 사라짐: 타입 정보만 제공, JS 출력 없음.구조적 타이핑: 이름이 아니라 모양(shape) 이 같으면 호환.다중 구현 가능: class A implements I1, I2선언 병합 가능: 같은 이름의 인터페이스를 여러 번 정의하면 자동으로 합쳐짐.상태(필드) 불가: 런타임 상태나 공통 구현은 가질 수 없음.추상 클래스 (abstract class)런타임에 남음: 공통 메서드..
[TypeScript] infer 목차타입스크립트를 조금만 깊게 쓰다 보면 infer라는 정체불명의 키워드를 보게 된다. ReturnType, Parameters, ConstructorParameters 같은 공식 유틸리티 타입들의 핵심에도 항상 숨어 있는 존재이다. 이번 글에서는 infer에 대해서 정리하고, infer가 실제로 타입스크립트 타입 시스템의 강력한 추론 엔진 역할을 어떻게 하는지 살펴보려고 한다. infer 란?infer는 조건부 타입(Conditional Types) 내부에서만 사용할 수 있는 키워드이다.문법은 다음과 같다:T extends SomeType ? U : Fallback 여기서 핵심은 infer U.타입스크립트에게 "여기서 타입을 추론해서 U라는 이름으로 쓰겠다"라고 지시하는 것이다.함수의 매개변수, 반환 ..
[TypeScript] ERROR: TS2550 tsconfig.json이 무시되는 이유와 해결 방법 목차npm run dev에서만 TS2550 오류가 발생하는 이유TypeScript를 쓰다 보면 동일한 코드임에도 실행 방식에 따라 오류가 발생하는 경우가 있다. 이번 글에서는 npm run dev에서만 findIndex 같은 ES2015 메서드가 인식되지 않는 TS2550 오류를 파헤치고, monorepo 환경에서 자주 겪는 tsconfig 무시 문제까지 확장해 보겠습니다. 문제 상황코드:const i = user.findIndex((u) => u.name === name); 직접 실행하면 정상 동작한다.tsc --target es2015 main.ts # 정상 컴파일 하지만 package.json에 다음과 같이 스크립트를 등록해 실행하면 에러가 발생한다. { "scripts": { "dev":..
[JavaScript] this 목차 자바스크립트를 하다 보면 가장 많이 헷갈리는 개념 중 하나가 바로 this이다. 특히 함수 선언식, 객체 메서드, 화살표 함수에서 각각 어떻게 동작하는지가 다르기 때문에 명확히 정리해두면 실수를 줄일 수 있다.this는 언제 결정될까?this는 함수가 정의된 위치가 아니라, 호출되는 방식에 따라 결정된다. 다만, 화살표 함수는 예외적으로 정의될 때 상위 스코프의 this를 그대로 물려받는다.함수 선언식에서의 thisfunction foo() { console.log(this);}전역 호출브라우저: windowNode.js: globalstrict mode: undefined명시적 바인딩foo.call({ a: 1 }); // { a: 1 } 즉, 함수 선언식은 호출 주체에 따라 this가 달라진다..
[Go] Go에서 랜덤값 생성하기 목차Golang을 사용해서 숫자 맞추기 게임을 만들어보았다. 게임을 만들면서 rand 패키지를 사용하여 랜덤값을 생성하였는데, 이때 학습한 내용을 간단히 정리하고자 한다. rand.Intn(range)math 패키지의 rand.Intn(range) | 0 함수를 사용하면 랜덤 한 int를 생성할 수 있다. 이때 range의 범위는 half-open [0, range)이다.여기서 주의할 점은 rand 패키지를 통해 생성되는 랜던값은 완전한 랜덤이 아닌 유사 랜덤값이다.유사 랜덤이란 어떤 알고리즘에 의해서 마치 랜덤인 것처럼 보이는 값을 말한다. 이는 컴퓨터의 논리 회로와 산술 연산은 같은 입력에 대해서 같은 결괏값을 만들어내기 때문이다. 그렇기 때문에 단순히 rand.Intn(range) 함수만 사용하면..
[JAVA] HashMap이란? 자바 Map에 대해서 공부하던 중 버켓(Bucket)이라는 단어를 접하게 되었다. 그래서 이번 글은 버켓에 대해서 자세하게 작성되어 있는 글을 정독하고, 정리한 글이다. 기존의 글에 개인적으로 이해하기 쉽도록 설명을 추가한 글로, 원 글을 다시 작성해 보면서 공부한 글이다. 원본: https://d2.naver.com/helloworld/831311 자바를 사용하다 보면 Map 자료구조를 많이 활용하게 된다. Map은 키와 값으로 이루어져 있고, 이때 키는 값을 구분하기 위한 유일한 값이다. 자바에서 Map은 인터페이스로 다양한 구현체를 제공한다. 가장 기본적으로 자주 사용되는 구현체는 HashMap, TreeMap, LinkedHashMap 등이 있다. 그리고 HashTable도 있다. HashMap은..