1. Algorithm Self Study

콜라츠 추측
1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.
1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.

//Reference Code ( for 반복문 : return )
function solution(num) {
    let count = 0;
    
    for( let i = 0; i < 500; i++ ) {
        if( num === 1 ) {
            return count // 0이 아니라 count를 해줘야 하는 이유는 처음 들어온 num이 1일 때 뿐 만이 아니라
          //나눠주다가 1인 경우도 생각을 해야하기 때문에
        }
        count++;
        
        num = num % 2 === 0
                ? num / 2
                : (num * 3) + 1
    }
    return -1;
}
//Reference Code ( forEach )
function solution(num) {
    let answer = 0;
    
    const result = new Array(500) // 500개의 elements를 가지는 배열 생성하고 1로 채워줌 
                    .fill(1) // 1로 베열 초기화 
                    .forEach(( el ) => {
                        if( num !== 1 ) {
                            answer++
                            num = num % 2 === 0
                                ? num / 2
                                : (num * 3) + 1
                        }
                    })
    
    return num !== 1 ? -1 : answer
  //500번을 반복했는데 1이 안된다면 -1
  // 1이 되었다면 answer 
}

두 개 뽑아서 더하기
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.

//Reference Code ( for )
function solution(numbers) {
    const answer = [];
    
    for( let i = 0; i < numbers.length; i++ ) {
        for( let l = i + 1; l < numbers.length; l++ ) { //l = 1 로 하면 
//i값에 영향을 안주기 때문에 'i + 1'로 
            const sum = numbers[i] + numbers[l];
            
            if( answer.includes(sum) === false ) { // 없으면 
                answer.push(sum);
            }
        }
    }

    return answer.sort( (a, b) => a - b ); //오름차순 
}
//Reference Code ( for : new Set )
function solution(numbers) {
    const answer = new Set([])//배열형태
    
    for( let i = 0; i < numbers.length; i++ ) {
        for( let l = i + 1; l < numbers.length; l++ ) {
            const sum = numbers[i] + numbers[l];
            
						answer.add(sum);
        }
    }
    
    return Array.from(answer).sort( (a, b) => a - b );
}

Set
Set 객체는 자료형에 관계 없이 원시 값과 객체 참조 모두 유일한 값을 저장

  • Set.prototype.add(value)
  • Set.prototype.clear() : Removes all elements
  • Set.prototype.delete(value)
  • Set.prototype.has(value) : Returns a boolean asserting

Array.from()
유사 배열 객체(array-like object)나 반복 가능한 객체(iterable object)를 얕게 복사해 새로운Array 객체를 만듦

2. Backend Class

Tight-coupling & Dependency

강한 결합(Tight Coupling)은 클래스와 객체가 서로 의존(Dependency)하고 있는 것
하나의 객체를 변경하게 되면 다른 객체들을 변경을 요구되어 변경점들을 확인하고 쉽게 놓칠 수 있습니다.
결합이 강하게 되어있어 결합이 되어있지 않으면 사용을 할 수 없게 됩니다.

  • new를 선언할 때마다 컴퓨터 메모리를 사용하게 되는데 비교적으로 강한 결합에서 new를 더 많이 사용해 메모리를 많이 잡아먹게 됩니다.

Loose-coupling & Dependency

느슨한 결합(Loose Coupling)이란 "객체들 간에 결합이 되어있긴 하는데 헐겁게 됐다."로 해석할 수 있으며, 다른 클래스를 직접적으로 사용하는 클래스의 의존성을 줄이는 것

  • 클래스/클래스를 느슨하게 결합되어 새로운 기능을 개발하거나 기존 기능을 수정하고 확장하는게 쉽습니다.
  • 코드의 유지 보수가 쉽습니다.
  • 테스트 대역으로 치환하기가 쉬워 유닛 테스트가 용이합니다.

강한 결합(Tight Coupling)을 했을 때는 모듈을 불러와야 했지만(import) 느슨한 결합(Loose Coupling)은 모듈을 불러오지 않아도됨

Singleton Pattern

  • new 한 번으로 모든 곳에서 사용 가능
  • 강하게 결합되어 있는 상태에서 느슨한 결합으로 풀리게됨

DI(Dependency Injection) 의존성 주입

TypeScript

자바스크립트에 타입을 부여한 언어

  • 에러의 사전 방지
  • 코드 가이드 및 자동 완성(개발 생산성 향상)

    String Type
    Number Type
    Boolean Type
    Array Type
    Object Type : interface 사용
    Function Type

// 객체타입
interface IProfile {
    name: string
    age: number | string
    school: string
    hobby?: string //필수적으로 존재하지 않아도 될 때
}
let profile: IProfile = {
    name: "철수",
    age: 8,
    school: "다람쥐초등학교"
}
profile.age = "8살"
profile.hobby = "수영"

Decorator

실행하려는 사용자가 구조를 수정하지 않고 기존 객체에 새로운 기능을 추가할 수 있도록 하는 디자인 패턴
=> 커맨드 라인이나 tsconfig.json에서 experimentalDecorators :true 옵션을 추가

public / private / protected / readonly

public : public이 붙은 변수, 메소드는 어떤 클래스에서라도 접근이 가능
private : private이 붙은 변수, 메소드는 해당 클래스에서만 접근이 가능
readonly : 읽기전용으로 클래스 내부에서도 해당 값을 변경할 수 는 없음

3. HW

Quiz

1-2. string[], number[], (number[] | string[]), (boolean | string)[]
1-3-a. interface ICreateBoard { 
         writer: string,
         title: string,
         contents: string 
       }

       ICreateBoard

1-3-b. interface IUpdateBoard { 
         writer: string,
         title?: string,
         contents: string 
       }

       IUpdateBoard

       IUpdateBoard
2-1.1. Dependency Injection
2-1-2. 아니다 (DI라고 해서 항상 싱글톤인건 아니고 nest.js에서는 싱글톤이 기본 설정일 뿐인 것)
2-1-3. Inversion of Control container
2-1-4. 네
2-1-5. 네
2-2. DI는 강한 결합을 느슨한 결합으로 전환 시키는 방법이며, DI를 설정하며 제어권이 개발자에서 프레임워크로 넘어가게 됩니다. 느슨한 결합이 되면서 의존성이 줄어들어 코드의 유지보수가 쉬워지며 재사용성이 높아지는 장점이 존재합니다. 

// a : interface ICreateBoard { 
         writer: string,
         title: string,
         contents: string 
       }
// b : interface IUpdateBoard { 
         writer: string,
         title?: string, // infer that there is no 'title'
         contents: string 
       } 
****자신이 이해한 DI 내용을 페어에게 설명해 보세요
DI는 강한 결합을 느슨한 결합으로 전환 시키는 방법이며,
DI를 설정하며 제어권이 개발자에서 프레임워크로 넘어가게 됩니다.
느슨한 결합이 되면서 의존성이 줄어들어 코드의 유지보수가 쉬워지며
재사용성이 높아지는 장점이 존재합니다. 

1개의 댓글

comment-user-thumbnail
2022년 12월 19일

오..

답글 달기