TIL47 [디자인패턴] 헤드퍼스트 디자인패턴 Chap.4 (Feat.팩토리) new를 사용하지 않을 수는 없음 디자인 원칙 OCP(Open-Closed Principle): 클래스는 확장에는 열려있어야 하지만 변경에는 닫혀 있어야 한다. 인터페이스 기반이면 어떤 클래스든 인터페이스를 구현하면 사용할 수 있음 (다형성) 구상 클래스를 사용하면 구상 클래스가 추가될 때마다 코드 수정 필요 => 변경에 닫혀있게 됨 => 새로운 구상 형식을 써서 확장할 때는 다시 변경에 열릴 수 있게 하자 Phone getPhone(String model){ Phone phone; // 폰 종류가 늘어날 때마다 코드가 바뀌어야 하는 부분 if(model.equals("galaxy s10"){ phone = new GalaxyS10(); }else if(model.equals("iphone 14"){ p.. 독서 기록/디자인패턴 2022. 10. 10. [디자인패턴] 헤드퍼스트 디자인패턴 Chap.6 (Feat.커맨드 패턴) 커맨드 패턴이란 request를 객체로 캡슐화하는 것이다. 예를 들어 형광등의 turnOff(), turnOn() 메소드가 있었다고 가정할 때, LightOffCommand, LightONCommand 같은 객체 형식으로 캡슐화하는 것이다. 이로서 이러한 request를 큐에 저장하거나 로그로 기록하거나 작업 취소 기능을 사용할 수 있습니다. 어떤 객체(A)에서 다른 객체(B)의 메서드를 실행하려면 그 객체(B)를 참조하고 있어야 하는 의존성이 발생합니다. 그러나 커맨드 패턴을 적용하면 의존성을 제거할 수 있습니다. 위의 예시에서 이어가면 리모콘 객체에서 형광등 객체의 turnOff(), turnOn() 메소드를 사용하면 리모콘 객체와 형광등 객체 사이의 의존성이 발생한다는 것이다. 또한 기능이 수정되거.. 독서 기록/디자인패턴 2022. 9. 28. [TIL] MicroServices Architecture(MSA) vs Monolithic Architecture 기본 개념 Monolithic Architecture: 한 프로젝트 안에 모든 것이 다 들어 있는 형식 MicroServices Architecture(MSA): 여러 프로젝트를 만든 뒤, 프로젝트들을 연결하여 사용 ex) 모놀리식은 네이버 웹 서비스 전체를 하나의 프로젝트를 만든 것이라 하면, MSA는 메일 프로젝트, 카페 프로젝트, 블로그 프로젝트 등등 으로 나누어 이를 연결한 형태 왜 MSA를 사용할까?... MSA의 장단점?? 반대로 네이버같은 유저 트래픽과 기능이 크고 많은 서비스를 모놀리식으로 구현했다고 가정할 때, 네이버 메일 기능을 업데이트하기 위해 서버를 내렸다가 다시 올렸는데 버그가 발생해서 몇시간 동안 서버가 먹통이 된다 라는 시나리오가 가능하다. 반면 MSA 구조라면 메일 기능은 마.. TIL/TIL 2022. 9. 26. [CS] 자료구조/알고리즘 관련(작성중...) 정렬 알고리즘 시간/공간 복잡도 Array vs LinkedList Array은 메모리상에 순서대로 데이터 저장 => 캐시의 지역성으로 인해 상대적으로 빠른 탐색 수행 인덱스로 조회할 수 있음 => 인덱스 조회 성능 높음 LinkedList는 다음 데이터의 위치에 대한 포인터를 가지고 있음 중간에 데이터를 삽입, 삭제하는 것이 용이 List vs Set List는 중복된 데이터를 저장하고 순서를 유지하는 선형 자료구조 Set은 중복되지 않은 데이터를 저장하고 순서 유지X, 선형 자료구조 Hash Function, Hash Table 해시 함수(특정 알고리즘)를 통해 key값을 해쉬 코드(작은 범위의 숫자)로 변환한다. key 값 과 해쉬 코드가 1:1 매칭이 되는 경우는 해쉬를 사용하는 의미가 없어짐, .. TIL/TIL 2022. 9. 26. [CS] 데이터베이스 관련 데이터베이스에서 인덱스를 사용하는 이유 및 장단점 검색 성능을 향상시키기 위해 사용 => 별도의 메모리 공간에 인덱스가 된 컬럼들을 기준으로 정렬하여 저장함 => 이미 정렬되어 있기 때문에 특정 조건 검색시 풀 스캔이 아닌 방법으로 더 빠르게 찾을 수 있음, 정렬 필요 없음 인덱스를 사용하는 단점으로는 인덱스를 구성하는 비용 발생 정렬 상태를 유지하기 위한 비용 발생 즉, CRUD시 인덱스를 형성하기 위한 추가적인 연산이 수행됨 인덱스를 사용하는 것이 효율적이기 위해서는 쿼리가 index를 사용하는지, Cardinality, Selectivity 같은 요소들이 고려된 인덱스가 생성되어야 함 트랜잭션(Transaction) 데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위 1개의 트랜잭션에서 여러.. TIL/TIL 2022. 9. 25. [CS] OS 관련 프로세스 생성과정 PCB가 생성되며 OS가 실행한 프로그램의 코드를 읽어들여 프로세스에 할당된 메모리의 Text Segment에 저장한다 초기화된 전역 변수 및 static 변수를 data segment에 할당 HEAP과 Stack은 초기 메모리 주소만 초기화됨 PCB에 여러 정보가 기록되면 Ready Queue에서 CPU를 할당받기까지 대기 프로세스와 쓰레드의 차이 프로세스는 운영체제로부터 자원을 할당 받은 작업의 단위 쓰레드는 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위, CPU 입장에서 최소 작업 단위 프로세스는 운영체제의 안정성을 위해 자신에게 할당된 메모리 내의 정보에만 접근할 수 있음 => 한 프로그램 처리할 때 프로세스를 여러개 사용 불가, 프로세스 말고 여러 작업을 처리하기 위해 .. TIL/TIL 2022. 9. 25. [디자인패턴] 헤드퍼스트 디자인패턴 Chap.2 (Feat.옵저버 패턴) public class WeatherData{ // 현재 기상 상황 갱신하는 메서드 public void measurementsChanged(){ // 최신값 불러옴 float temp = getTemperature(); float humidity = getHumidity(); float pressure = getPressure(); // 변화한 값 각 디스플레이에 갱신 display1.update(temp,humidity, pressure); display2.update(temp,humidity, pressure); display3.update(temp,humidity, pressure); } } 위의 코드에는 아래 같은 문제가 발생 인터페이스가 아닌 구체적인 구현을 바탕으로 함 새로운 디스플레이 생기.. 독서 기록/디자인패턴 2022. 9. 23. [디자인패턴] 헤드퍼스트 디자인패턴 Chap.1 상속만 사용한 경우 생길 수 있는 문제 서브 클래스에서 코드 중복 실행 시에 특징 바꾸기 어려움 모든 클래스의 동작 알기 어려움 슈퍼 클래스에서 코드 변경시 원치 않은 서브 클래스에도 영향 준다. => 인터페이스의 등장 다만 인터페이스를 사용하면 인터페이스를 상속하는 모든 서브 클래스들에서 코드를 구현해야함. ex) A,B,C,D,E,F 6개의 서브 클래스가 있을 때 x 라는 인터페이스를 만들어 동작을 구현했는데 이를 동일하게 수정하고 싶으면, A~F까지 모든 서브 클래스의 내용을 수정해야함. 즉 코드 재사용이 되지 않는 문제점이 있다는 것, 한가지 동작을 바꿀 때 마다 그 동작이 정의되어 있는 서브 클래스들을 전부 찾아서 코드를 고쳐야 하고, 그 과정에서 버그가 생길 수 있음 소프트웨어 개발 불변의 진.. 독서 기록/디자인패턴 2022. 9. 23. [JAVA] TIL final 키워드 필드에서 사용하면 수정 불가능 메소드에 사용하면 오버라이딩 불가능 클래스에서 사용하면 상속 불가능 상속 관련 public class InheritTest { public static class Parent{} public static class Child extends Parent{} public static void main(String[] args) { Parent parent = new Child(); // 가능 Child child = new Parent(); // 컴파일 에러 } } Marker interface / tag interface 상수도 메소드도 없는 완전히 비어있는 인터페이스 = Marker interface / tag interface 특별한 행동을 컴파일이나 J.. TIL/TIL 2022. 9. 6. [TypeScript] 이펙티브 타입스크립트 item 53 ~ 57 item 53 타입스크립트 기능보다 ECMAScript 기능을 사용하기 일반적으로 타입스크립트 코드에서 타입정보를 빼면 자바스크립트가 되지만 열거형, 매개변수 속성, 트리플 슬래시 임포트, 데코레이터는 타입정보를 제거한다고 자바스크립트가 되지는 않음 => 타입스크립트의 역활을 명확하기 위해 위에 말한 것들은 사용하지 않는 것이 좋음 item 54 객체를 순회하는 노하우 객체를 순회하며 키와 값을 얻을 때 keyof : 정확한 타입을 원할 때 interface Obj { one: string; two: string; three: number; } const A: Obj ={ one: '1', two: '2', three: 3 } let k: keyof Obj for (k in A){ const v = A[.. TIL/TypeScript 2022. 8. 16. [TypeScript] 이펙티브 타입스크립트 item 50 ~ 52 item 50 오버로딩 타입보다는 조건부 타입 사용하기 조건부 타입은 추가적인 오버로딩 없이 유니온 타입을 지원할 수 있음 // 오버로딩 타입 function double(x: number | string): number | string; // 조건부 조건 function dobule( x: T ): T extends string ? string : number; //=> string 의 부분 집합이면 string, 그외는 number function double(x: any) { return x + x; } item 51 의존성 분리를 위해 미러 타입 사용하기 필수가 아닌 의존성을 분리할 때는 구조적 타이핑을 사용 작성 중인 라이브러리가 의존하는 라이브러리의 구현과 무관하게 타입에만 의존한다면, 필요한.. TIL/TypeScript 2022. 8. 9. [TypeScript] 이펙티브 타입스크립트 item 45 ~ 49 item 45 devDependencies에 typescript 와 @types 추가하기 dependencies: 현재 프로젝트를 실행하는데 필수적인 라이브러리들 devDependencies: 현재 프로젝트를 개발하고 테스트하는데 사용되지만 런타임에는 필요없는 라이브러리들 peerDependencies: 런타임에 필요하지만, 의존성 직접 관리하지 않는 라이브러리들 ex) 플러그인 공통적으로 고려해야할 의존성 2가지 1. 타입스크립트 자체 의존성을 고려해야 함 시스템 레벨로 설치한다면 팀원들간의 버전 차이로 인한 비용이 발생할 것이기에, 시스템 레벨 보다는 devDependencies에 넣는 것이 좋음 2. 타입 의존성(@type)을 고려해야 함 사용하려는 라이브러리에 타입 선언이 포함되어 있지 않더라도 .. TIL/TypeScript 2022. 8. 8. 이전 1 2 3 4 다음 반응형