DAY11

yejichoi·2022년 11월 27일
0
post-thumbnail

1. Algorithm tes

정수 제곱근 판별
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

//Reference Code ( for )
function solution(n) {
    let answer = -1;
    
    for( let i = 1; i * i <= n; i++ ) {
        if( i * i === n ) {
            // 제곱근을 찾은 경우 (제곱의 값이 n과 동일한 경우)
            answer = i + 1;
            return answer * answer

						// answer ** 2  -- 거듭제곱 연산자
						// Math.pow( answer, 2 )  -- 제곱 메소드
        }
    }
    // 제곱근을 찾지 못한 경우 (-1 을 리턴)
    return answer;
}
//Reference Code ( Math.sqrt, Number.isInteger )
function solution(n) {
    let sqrt = Math.sqrt(n);
    if( Number.isInteger( sqrt ) === true ) {
        // 제곱근일 경우 (= 정수인 경우) true 반환
        sqrt++;
        return sqrt * sqrt;
        
    } else {
        // 제곱근이 아닐 경우 (= 정수가 아닐 경우) false 반환
        return -1;
    }
}

제일 작은 수 제거하기
정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

//Reference Code ( for 반복문 )
function solution(arr) {
    const answer = [];
    
    // 1. 제일 작은 수 찾기
    let min = arr[0];
    for( let i = 1; i < arr.length; i++ ) {// 0번째는 이미 min이 할당되어 1부터 반복
        if(arr[i] < min) {
            min = arr[i];
        }
    }
    
		// 2. 제일 작은 수를 제외한 숫자만 배열에 추가
    for( let i = 0; i < arr.length; i++ ) {
        if(arr[i] !== min) {
            answer.push( arr[i] )
        }
    }
    
		// 빈 배열인지를 체크한 후
		// 빈 배열일 경우에는 배열에 -1을 담아서 리턴
		// 빈 배열이 아닐 경우에는 2번째 과정의 배열을 리턴
    return answer.length === 0 ? [-1] : answer;
}
//Reference Code ( filter )
function solution(arr) {
    // 배열 안에서 제일 작은 값을 저장
    const min = Math.min(...arr);
    
    const answer = arr.filter( num => {
        return num !== min
    })
    
    return answer.length === 0
        ? [-1]
        : answer
}

2. Backend Class

Class

특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀로, 객체를 정의하기 위한 상태(멤버 변수)와 메서드(함수)로 구성

// index.js

class Monster {
  power = 10; // let, const 사용X

    constructor(aaa) {
      this.power = aaa; //this는 Monster class를 의미
    }

  attack = () => {
    console.log("공격하자!!");
    console.log("내 공격력은 " + this.power + " 이야!!!");
  };

  run = () => {
    console.log("도망가자!!");
  };
}

const mymonster1 = new Monster(10);
mymonster1.attack();
mymonster1.run();

const mymonster2 = new Monster(50);
mymonster2.attack();
mymonster2.run(); 
  • 변수를 넣어줄 때는 변수를 선언할 때 사용한 let, const 등을 사용X
  • this 를 사용하여 클래스 내부에 존재하는 다른 함수 또는 변수를 함수 내에서 사용
  • 내장함수 constructor() 생성자를 사용하여 초기값을 생성
    => - mymonster2 는 넘겨받은 인수와 함께 constructor가 자동으로 실행
    이때 인수 50이 aaa라는 이름으로 this.power에 할당해 줌으로써 초기값이 다시 생성
//output
공격하자!
내 공격력은 10이야!!
도망가자!!
공격하자!!
내 공격력은 50이야!!
도망가자!!

Class 상속

extends : 같은 기능들을 사용할 때 코드의 효율성을 높이기 위해 중복되는 코드들을 최소화

// index.js

class Monster { //공통 기능
    power = 10

    constructor(aaa){
        this.power = aaa
    }

    attack = () => {
        console.log("공격하자!!")
        console.log("내 공격력은 " + this.power + " 이야!!!")
    }
}

class SkyMonster extends Monster { // 공통 기능을 상속받음 
    constructor(qqq){
        super(qqq) // 부모 오브젝트의 함수 호출 
    }

    run = () => {
        console.log("날라서 도망가자!!")
    }
}

class GroundMonster extends Monster {// 공통 기능을 상속받음
    constructor(www){
        super(www)
    }

    run = () => {
        console.log("뛰어서 도망가자!!")
    }
}

const mymonster1 = new SkyMonster(30)
mymonster1.attack()
mymonster1.run()

const mymonster2 = new GroundMonster(10)
mymonster2.attack()
mymonster2.run()

super : 부모 오브젝트의 함수를 호출할 때 사용
=> 생성자 constructor는 동일하게 사용할 수 있지만, power 변수가 상속해 준 Monster 내부에 존재하기에 Monster class 내부에 있는 constructor로 인수를 넘겨 주기 위해 사용

  • 참고: 파생 클래스에서 super() 함수가 먼저 호출되어 this 키워드를 사용할 수 있음. 그렇지 않을 경우 참조오류가 발생

Constructor

구글링하기

OOP (객체 지향 프로그래밍)

1. 추상화(Abstraction)

사물들의 공통적인 특징, 즉 추상된 특징을 파악해 인식의 대상으로 삼는 행위

2. 캡슐화(Encapsulation)

하나의 객체에 대해 그 객체가 특정한 목적을 위한 필요한 변수나 메소드를 하나로 묶는 것

  • 응집도 : 클래스나 모듈 안의 요소가 얼마나 밀접하게 관련 있는지를 나타냄
  • 결합도 : 어떤 기능을 실행하는 데 다른 클래스나 모듈에 얼마나 의존하는지 나타냄
  • 정보은닉 : 정보은닉을 통해 높은 응집도와 낮은 결합력**
  • private 키워드를 통해 데이터를 보호해 접근을 제한

3. 상속성(Inheritance)

기존 상위 클래스에 근거하여 새롭게 클래스와 행위를 정의
기존 클래스의 기능을 가져와 재사용할 수 있으면서도 새로운 기능을 추가할 수 있음
=>다형성을 확보 가능

4. 다형성(polymorphism)

상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해줌
즉, 다형성은 형태가 같은데 다른 기능을 하고 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력

오버라이딩(Overriding)

  • 부모 클래스에서 상속받은 자식 클래스에서 부모 클래스에서 만들어진 메서드를 자신의 입맛대로 다시 재정의해서 사용하는 것

오버로딩(Overloading)

  • 같은 이름의 메서드를 사용하지만 메서드마다 다른 용도로 사용되며 그 결과물도 다르게 구현할 수 있게 만드는 개념
  • 오버로딩이 가능하려면 메서드끼리 이름은 같지만 매개변수의 갯수나 데이터 타입이 다르면 오버로딩이 적용

FP (함수형 프로그래밍)

애플리케이션의 부수효과(side effect)를 방지 하고 상태 변이(mutation of state)를 감소 하기 위해 데이터의 제어 흐름과 연산을 추상(abstract) 하는 것

### 1. 1급 객체

2. 고차 함수

함수의 파라미터로 함수 전달
함수의 반환값으로 함수 사용

3. 불변성

데이터 변경이 필요한 경우, 데이터 복사본을 만들어 사용하여 작업을 진행

4. 순수함수

동일한 인풋에 항상 같은 값의 아웃풋 반환

3. HW

0개의 댓글