JavaScript에서 Class가 결국 함수라는 게 어떤 의미일까?
·
Backend/TypeScript
JavaScript에서 Class는 Function이다.자바스크립트의 클래스는 내부적으로 함수로 구현되어 있습니다. Person 클래스를 통해 어떤 의미인 지 이해해보도록 하겠습니다. Person 클래스는 name 필드와 생성자, sayHello 메소드를 갖고 있습니다. 먼저, 생성자 함수를 살펴보겠습니다.class Person { name: string; constructor(name) { this.name = name; } sayHello() { console.log(`Hello, I'm ${this.name}`); }} 생성자는 자바스크립트 내부적으로 아래와 같은 함수의 형태를 가집니다. this는 새로 생성되는 객체를 가리키고, constructor 내부의 코드가 여기서 실행됩..
추상클래스와 제네릭 (실습)
·
Backend/TypeScript
요구사항에 맞게 코드를 작성하는 과제입니다. 1. 클래스 구조- PublicOfficer: 추상 클래스로, 공무원의 기본 속성과 메서드를 정의- 하위 클래스: Police, Firefighter, Doctor가 상속 2. 핵심 static 클래스들- CentralArchives: 모든 공무원 정보를 중앙 저장소에서 관리- TrainingCenter: 공무원 객체 생성을 담당하는 팩토리 클래스 (제네릭 활용)- Extractor: 특정 타입의 공무원 목록을 필터링하는 유틸리티 클래스 3. 주요 기능- 공무원 등록/제거 (CentralArchives)- 타입별 공무원 목록 조회 (Extractor)- 근속연수(짝수/홀수)별 필터링 기능- 제네릭을 활용한 타입 안전성 보장// 1. PublicOfficer 를..
아이템13. type과 interface 차이점 알기
·
Backend/TypeScript
타입스크립트에서 named type을 정의하는 방법은 두 가지가 있습니다. 대부분의 경우에는 타입을 사용해도 되고 인터페이스를 사용해도 됩니다. 그러나 타입과 인터페이스 사이에 존재하는 차이를 분명하게 알고, 같은 상황에서는 동일한 방ㅂ버으로 명명된 타입을 정의해 일관성을 유지해야 합니다. type TState = { name: string; capital: string;}interface IState { name: string; capital: string;} type과 interface의 비슷한 점1. 인덱스 시그니처는 인터페이스와 타입에서 모두 사용할 수 있다.type TDict = { [key:string]: string};interface IDict { [key:str..
Interface (인터페이스)
·
Backend/TypeScript
기본적인 인터페이스 사용 방법타입 검사는 printLabel을 호출합니다. printLabel 함수는 string 타입 label을 갖는 객체를 하나의 매개변수로 가집니다. 이 객체가 실제로는 더 많은 프로퍼티를 갖고 있지만, 컴파일러는 최소한 필요한 프로퍼티가 있는지와 타입이 잘 맞는지만 검사합니다. function printLabel(labeledObj: {label: string}) { console.log(labeledObj.label);}let myObj = {size:10, label: "Size 10"};printLabel(myObj); LabeledValue 인터페이스는 숫자 타입의 size 프로퍼티와 문자열 타입의 label 프로퍼티를 가지고 있습니다. 다른 언어처럼 printLab..
Iteration Protocol (+Symbol)
·
Backend/TypeScript
이터레이션 프로토콜ES6에서 도입된 이터레이션 프로토콜은 데이터 컬렉션을 순회하기 위한 프로토콜입니다. ES6에서 도입되었으며 크게 두 가지로 구분됩니다.  1. 이터러블 프로토콜Symbol.iterator 메서드를 구현하여 이터레이터를 반환하고, 자바스크립트의 대표적인 이터러블한 데이터 컬렉션은 Array, String, Map, Set 등이 있습니다. for ... of 문으로 순회가 가능하며, ...(스프레드 연산자)를 사용할 수 있습니다. 2. 이터레이터 프로토콜next() 메소드를 갖고 있습니다. next() 메소드는 value와 done 프로퍼티를 가진 객체를 반환합니다. value는 현재 순회 중인 값을 나타내고, done은 순회 완료 여부를 나타내는 boolean 값입니다.   여기서 Sy..
non-null 단언 연산자(!), null 병합 연산자(??) 그리고 옵셔널 체이닝(.?)
·
Backend/TypeScript
! (Non-null assertion operator)!연산자는 개발자가 "이 값은 확실히 null/undefined가 아니다"라고 TypeScript 컴파일러에게 알려주는 것입니다. 하지만 실제 런타임에서는 아무런 체크도 하지 않기 때문에, 확실히 보장될때만 사용해야 하며, 가능하다면 if 문으로 null 체크를 하거나 옵셔널 체이닝을 사용하는 것이 더 안전한 방법입니다. 1. Null 체크 우회name은 string | null 이지만, 개발자가 이 시점에서 확실히 null이 아님을 알고 있을 때 사용하면 됩니다. // 1. NULL 체크 우회let name: string | null = "Ecount";let nameLength = name!.length;  2. 초기화 체크 우회클래스 필드 na..
가비지 컬렉션과 Minor/Major GC 동작 과정
·
Backend/Java
가비지 컬렉션은 더 이상 사용되지 않는 메모리를 자동으로 찾아내어 해제하는 메모리 관리 메커니즘이다. Java 개발에서 가장 중요한 특징 중 하나로, 개발자가 메모리 관리에 대한 부담을 덜 수 있게 해준다. 가비지(Garbage)란?프로그램을 개발하고 실행하는 과정에서는 더 이상 사용되지 않는 메모리인 '가비지(Garbage)'가 발생한다. 이는 다음과 같은 경우에 발생할 수 있다.// 1. 객체의 참조가 null이 되는 경우String text = "Hello";text = null; // 이전의 "Hello" 객체는 가비지가 됨// 2. 객체의 참조 범위를 벗어나는 경우public void createObject() { String localVar = "Hello"; // 메서드 종료 시 접..
volatile 이란?
·
Backend/Java
Volatile'Java 변수를 main memory에 저장하겠다' 라는 것을 명시하는 것매번 변수의 값을 read할 때 마다 cpu cache에 저장된 값이 아닌 메인 메모리에서 읽는 것변수의 값을 write할 때 마다 main memory에 까지 작성하는 것volatile 변수를 사용하고 있지 않는 멀티스레드 어플리케이션에서는 task를 수행하는 동안 성능 향상을 위해 메인 메모리에서 읽은 변수 값을 cpu cache에 저장하게 된다.  ExamplesharedObject를 공유하는 두 개의 스레드가 있다.스레드 1은 카운터 값을 더하고 읽는 연산을 한다. (read & write)스레드 2는 카운터 값을 읽기만 한다. (only read)public class SharedObject { public..
폴링과 인터럽트
·
Computer Science/Operating System
폴링특정 주기마다 스레드를 돌면서 시그널이 들어왔는지 확인하는 방식이다. (소프트웨어적으로 시그널을 확인하는 것) 이렇게 특정 주기마다 계속 확인해야 하기 때문에 시스템의 리소스를 많이 먹는다는 단점이 있다. 인터럽트프로그램 실행 도중에 예기치 않은 상황이 발생할 경우 현재 실행 중인 작업을 즉시 중단하고, 발생된 상황에 대한 우선 처리가 필요함을 CPU에게 알리는 것 (하드웨어적으로 시그널을 확인하는 것) 시그널이 들어온 정확한 타이밍을 알 수 있고, 반응 시간이 빠르며 시스템 부하가 적다.  인터럽트 처리 과정프로그램 실행 -> 인터럽트 요청 -> 프로그램 중단(수행중인 명령을 완료하고 PC, SR 저장) -> ISR 처리(인터럽트 벡터를 통하여 주소 접근) -> 프로그램 재시작(PC를 통해 접근) ..
시스템 콜
·
Computer Science/Operating System
시스템 콜이 무엇인가?시스템 콜은 응용 프로그램이 직접적으로접근하지 못하는 하드웨어 자원에 접근하기 위해 사용되는 인터페이스이다. 즉, 시스템 콜을 호출함으로서 해당 자원에 간접적으로 접근하게 된다.    우리가 사용하는 시스템 콜 예시와 동작 과정python의 import sys, time도 시스템 콜이고, 대표적으로 file I/O의 open, read, write 등이 있다. 한 파일에서 다른 파일로 데이터를 복사하는 프로그램을 예로 들어서 시스템 콜이 동작하는 과정을 살펴 본다.  시스템 콜 예시1. 아래 명령어와 같이, 복사할 input 파일과 output 파일의 이름을 작성한다.$ cp input.txt output.txt 2. 프로그램은 input 파일을 open(system call)하고,..
Spring Boot 의 동작 방식
·
Backend/Spring Boot
이번 시간에는 스프링과 스프링 부트가 무엇이며, 스프링 부트는 어떻게 동작하는 지에 대한 공부를 해보겠습니다.스프링 부트의 기본 의존성 중 하나인 spring-boot-starter-web 모듈을 사용하면, 기본적으로 내장 톰캣을 사용하는 스프링 MVC 구조를 기반으로 동작합니다. 클라이언트의 요청이 들어오면 서블릿이 이를 처리해야 하는데, 서블릿은 서블릿 컨테이너에서 관리하고, 톰캣이 서블릿 컨테이너의 역할과 WAS 역할을 담당합니다. 서블릿(Servlet)클라이언트의 요청을 처리하고, 결과를 반환하는 자바의 웹 프로그래밍 기술입니다. 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리합니다. 서블릿 객체는 싱글톤 패턴으로 관리되며, 멀티 스레딩을 지원합니다.   DispatcherServl..
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type java.time.LocalDateTime not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310"
·
Backend/Redis
리펙토링 중인 프로젝트의 엔티티에는 챌린지 startedDate, completedDate 컬럼이 존재하는데, 해당 컬럼의 타입은 LocalDateTime이었다. 해당 데이터를 직렬화하고 Redis에 저장한 후, 캐시 데이터를 조회할 때 역직렬화 과정을 거쳐야하는데 Jackson 라이브러리에서 LocalDate, LocalTime, LocalDateTime을 지원하지 않았다. 이를 처리하도록 사용하려면 com.fastxml.jackson.datatype:jsr310 모듈을 추가해야한다는 경고가 나타났고, 아래와 같이 추가해주었다. 그러나, 문제는 해결되지 않았다. Jackson을 공부하면서 ObjectMapper에 대한 이해가 필요함을 느꼈다. implementation 'com.fasterxml.jac..