본문 바로가기
개발_TIL

개발_TIL | 2022-07-26 (68)

by Hee94 2022. 7. 26.

Local Scope

밖에서는 안이 보이지 않고, 안에서만 밖을 볼 수 있다. - 드림코딩 엘리

 

  1. Block Level Scope : 중괄호({ })를 사용하여 만든 블럭 내부에 있는 변수
  2. Global Level Scope: 블럭 외부에 있는 변수
let globalMessage = 'global';

function printMessage() {
    let message = 'hello'; // local variable
    console.log(message); 
    console.log(globalMessage);
    function printAnother() {
        console.log(message);
        let childMessage = 'babo';
        console.log(childMessage);
    }
  printAnother()
}
printMessage()
  • 블럭 안에서 사용된 변수는 밖에서는 사용할 수 없다.
  • 함수 내부의 함수에서 바깥에서 사용한 변수는 참조 가능하지만
  • 부모 함수에서는 자식 함수에서 사용한 변수를 사용할 수 없다

Return

  • 함수에서 파라미터를 받아 계산된 값을 리턴할 수 있음
function sum(num1, num2) {
    return num1 + num2
}
let result = sum(1,2);

Early Return

  • 조건이 많아 여러 블럭 안에 로직을 많이 작성해 많은 분기를 처리하게 된다면 가독성이 떨어진다
  • 따라서 특정 조건에 맞는 값을 빨리 리턴해버리는 Early Return을 사용하면 여러 블럭을 만들 필요 없이 조건문을 짧게 작성할 수 있다
function 공룡등장(내일배움캠퍼) {
    if (내일배움캠퍼 == "입실체크완료") {
        return "잘했어요^^";
    }
    console.log("저를 화나게 하지 마세요!");
}

let 황영상 = "입실체크완료";
공룡등장(황영상);

Function Expression

  • Javascript에서 function은 First-class(1급시민)
    • 변수에 function을 할당 가능
    • function의 parameter에 function을 할당 가능
    • 다른 function의 return에 function 할당 가능
  • function expression은 이러한 first-class 를 표현하는 방식

Function Declaration

  • 함수를 변수에 할당하는 것을 Function Declaration 이라고 한다
  • 변수에 함수를 지정하면 함수의 기본 선언형태를 따르지만,
  • 이름을 적어주지 않아도 변수 이름을 함수이름으로 인식하여 변수이름() 의 형태로만 호출이 가능하다 → Anonymous Function
  • 변수에 함수를 선언한 변수를 초기화하여 재사용할 수 있다.
  • 함수를 일일이 선언하고 호출하고 값에 담는 일련의 줄이 길어지는 과정을 단축시킨다
const print = function(){console.log('프린트');} // anonymous function
const print = function print_sentences(){console.log('프린트');} // named function

print();
const print_again = print;
print_again();

// 우리끼리 적어본 식
const source_sum = [1,2]
const result_sum = function(source_sum){return source_sum[0] + source_sum[1]}

const result_sul = (source_sum) => source_sum[0] + source_sum[1]
  • function declaration은 function hoisting 기능을 여전히 가지고 있다
    • 함수를 선언한 순간, 스크립트는 함수부터 읽는다.(함수가 코드 맨 위로 올라감)
    • 따라서 함수코드가 밑에 있어도, 위에서 함수를 실행할 수가 있게 된다!

Callback Function

  • 함수 안의 parameter는 value를 받지만, function도 받을 수 있다
  • 인자로 함수를 받아 호출한 함수를 Callback Function이라고 한다
function 쓰레기(고철, 버리자, 버리지말자){
    if (고철 === '깡통'){
        버리자();    
    } else {
        버리지말자();
    }
}
const 버리자 = function () {
    console.log('갖다버려 그냥 쓰레기야')
};
const 버리지말자 = function () {
    console.log('버리지말자 쓰레기 아닌거같애')
};
쓰레기('깡통', 버리자, 버리지말자)

Arrow Function

  • 함수를 간결하게 만들어주는 expression
  • Arrow Function은 항상 Anonymous Function 이다
  • 변수 = (parameter) ⇒ return; 형식으로 Arrow Function을 사용한다
  • 내용이 추가적으로 필요해 블럭을 사용한다면 평소처럼 return 키워드를 작성해줘야 return이 된다
  • 왜 쓰느냐? 라고 물어본다면 → 기존의 선언, 호출을 통한 절차를 줄여주고, 코드 길이를 줄여주어 가독성과 효율을 늘리기 위해서!
// 블럭은 열고 리턴은 없는 버전
const 버스카드찍기 = (age) => {
    if (age > 20){console.log("감사합니다");}
    else {console.log("안녕하세요");}
}
버스카드찍기(21);

// 블럭을 안열고 리턴이 있는 버전
const 입실체크 = (했니) => console.log(했니);
const 했니 = "했어";
입실체크(했니);

// 블럭을 열고 내용과 리턴이 있는 버전
const 복약관리 = (질병) => {
    let 약;
    if (질병 == "피로") {약="피로회복제";}
    else if (질병 == "고혈압") {약="혈압약";}
    else {약="당신은 건강하시네요!"}
    return 약
}
console.log(복약관리("고혈압"));
const simple = () => console.log('simplesimple');
simple()

const 나머지 = (a, b) => {
    return a % b;
};
나머지(10,3)
const mix =()=>리턴 값;
// 정답을 보고 썻네.......
const add = (a, b) => a + b;

퀴즈. command, num1, num2를 인자로 받는 계산기 함수를 작성해보시오. Arrow Function을 사용하시오.

const calculator = (command, num1, num2) => {
    switch(command) {
        case 'add':
            return num1 + num2;
        case 'substract':
            return num1 - num2;
        case 'multifly':
            return num1 * num2;
        case 'divide':
            return num1 / num2;
        case 'remainder':
            return num1 % num2;
        default:
            throw Error('unkown command')
    }
}
caculator("add", 1,2);

IIFE

  • 함수를 선언하고 괄호를 묶고, 뒤에 괄호를 써주면 바로 함수를 실행할 수 있다
(function hello(){console.log('IIFE');})();

📌 Class


자바스크립트 6. 클래스와 오브젝트의 차이점(class vs object), 객체지향 언어 클래스 정리 | 프론트엔드 개발자 입문편 (JavaScript ES6)

What is Class?

  • 클래스는 조금 더 연관있는 데이터를 묶어놓은 일종의 컨테이너
  • 만약 클래스가 없었다면, 규모있는 프로젝트를 진행하기가 힘들었을 것이다
  • 클래스는 캡슐화, 상속 등을 통해서 객체지향적 프로그래밍을 지향한다
  1. 클래스
- 클래스는 붕어빵틀이다
- 클래스는 여러 번 재사용 가능하게 하는 템플릿과 같은 역할을 수행한다
- 클래스는 단 한 번 선언하면 된다
- 클래스 자체에는 데이터가 들어있지 않다
  1. 오브젝트
- 클래스를 이용해서 데이터를 넣은 것을 오브젝트라고 한다
- 클래스는 메모리에 들어가지 않지만, 인스턴스로 생성한 오브젝트는 데이터 메모리에 할당된다
- 붕어빵 틀에 내용물을 넣고 만들어낸 붕어빵이 오브젝트에 해당한다

Class Declaration

  • 클래스는 템플릿이며, 클래스의 인스턴스를 오브젝트라고 한다
  1. 클래스 선언
  • 클래스는 키워드 , 이름, 생성자, 필드, 메서드를 선언하여 작성한다
class 클래스{
    생성자(필드1, 필드2){
        this.필드1 = 필드1;
        this.필드2 = 필드2;
    }
    메서드(){
        메서드 내용
    }
}
  1. 오브젝트 선언
  • 오브젝트를 선언하기 위해서는 변수 = new 클래스(필드) 를 사용하여 선언한다
// class declaration
class Person {
    // 생성자
    constructor(name, age) {
    // 필드
    this.name= name;
    this.age= age;
    }
    // 메서드
    speak() {
        console.log(`${this.name}: hello!`);
    }
}class Person {
    // 생성자
    constructor(name, age) {
    // 필드
    this.name= name;
    this.age= age;
    }
    // 메서드
    speak() {
        console.log(`${this.name}: hello!`);
    }
}

const ellie = new Person('ellie', 20);
console.log(ellie.name);
console.log(ellie.age);
ellie.speak();

Getter & Setter

  • 클래스 내부에서 값을 방어적으로 변경해주기 위해 세팅하는 메서드
  • 값을 변경하기 위해서는 getter, setter가 동시에 사용되어야 합니다
  • 일반적으로 변수를 초기화하는 작업을 내부에서 변경하기 위해서는 getter&setter가 그 과정을 수행하게 됨
  • getter는 필드 값을 호출하기 위해 필요한 메서드
  • setter는 필드 값의 밸류를 새로 할당하기 위해 필요한 메서드
class Person {
    constructor(firstName, lastName) {
        this.firstName= firstName;
      this.lastName = lastName;
        this.age= age;
    }

    get age() {
        return this._age;
    }

    set age(value) {
        this._age = value < 0 ? 0 : value;
    }
}
const user1 = new User('Steve', 'Job', -1);
console.log(user1.age);

Public & Private Field

  • 생성자를 쓰지 않고 필드를 사용할 수 있음
  • #privateField 처럼 해시태그를 사용해서 내부에서만 쓰거나 변경할 수 있도록 작성할 수 있음
class Experiment {
    publicField = 2;
    #privateField = 0;
}

Static Field, Method

  • 인스턴스를 이용해서 생성한 오브젝트와 상관없이 클래스 자체에 연결되어 있는 공통적으로 자주 사용하는 필드를 활용할 수 있음
class Article {
    static publisher = 'Dram Coding';
    constructor(articleNumber) {
        this.articleNumber = articleNumber;
    }

    static printPublisher() {
        console.log(Article.publisher);
    }
}

const article1 = new Article(1);
const article2 = new Article(2);
console.log(Article.publisher);
Article.printPublisher();

상속 & 다양성

  • 하나의 객체를 다양하게 표현하기 위해서는 무엇이 필요한가?
  • 예) 삼각형, 사각형, 원을 클래스를 사용한 오브젝트로 어떻게 표현할까?
    • 너비와 높이 같은 반복되어지는 것을 계속 따로 만들어 반복해야 할까?
    • Shape이라는 속성을 한 번 만들어서 각 개체가 가져가 쓴다면 효율적이겠다!
class MarvelCinematicUniverse {
    constructor(name, hero, villian) {
        this.name = name;
        this.hero = hero;
        this.villian = villian;
    }

    명대사() {
        console.log(`이 영화에서 명대사를 말한 인물은 ${this.villian}입니다!`) 
    }
}

class Ironman extends MarvelCinematicUniverse {}
class Spiderman extends MarvelCinematicUniverse {} 
const rdj = new Ironman('ironman2', '토니 스타크', '울트론');
rdj.명대사()
const 토비맥과이어 = new Spiderman('spiderman3', '피터 파커', '그린 고블린');
class Shape {
    constructor(width, height, color) {
        this.width = width;
        this.height = height;
        this.color = color;
    }

    draw() {
        console.log(`drawing ${this.color} color of`);
    }

    getArea() {
        return width * this.height;
    }

// 사각형이라는 클래스에 쉐이프 클래스 상속
class Rectangle extends Shape {}
class Triangle extends Shape {
    draw() {
        super.draw();
        console.log('⚠')
    }
    getArea() {
        return (this.width * this.height) / 2;
    }
}
const rectangle = new Rectangle(20,20,'blue');
rectangle.draw();
console.log(rectangle.getArea());
const triangle = new Triangle(20,20,'red');
triangle.draw();
console.log(triangle.getArea());
  • 상속은 자식 클래스를 선언할 때 extends 부모클래스 라고 추가로 작성하는 것으로, 부모클래스를 자식클래스가 상속하게 된다
  • 부모클래스를 상속받은 자식클래스는 동일한 필드와 메서드를 작성한 셈이 되며, 그대로 사용할 수가 있게 된다.
  • 물론 오브젝트를 선언할 때에 부모 클래스가 요구하는 필드 값을 작성해주어야 한다

Overriding

  • 부모 클래스의 메서드를 덮고 다른 내용으로 해당 메서드를 작성하고 싶을 때 사용한다
  • 자식 클래스에서 동일한 메서드를 선언하고, 내용을 작성하게 되면 부모클래스의 메서드는 출력하지 않는다.
  • 부모 클래스의 메서드 또한 사용하고 싶다면, super.메서드() 를 사용하여 둘 다 사용할 수 있다

InstanceOF

  • 인스턴스와 클래스가 서로 상관관계가 있는지 체크하는 메서드 (true, false로 반환한다)
  • 인스턴스 instanceof 클래스 형태로 사용한다
console.log(rectangle instanceof Rectangle); // true
console.log(triangle instanceof Rectangle); // false
console.log(triangle instanceof Triangle); // true
console.log(triangle instanceof Shape); // true
console.log(triangle instanceof Object); // true

'개발_TIL' 카테고리의 다른 글

개발_TIL | 2022-07-28 (70)  (0) 2022.07.31
개발_TIL | 2022-07-27 (69)  (0) 2022.07.27
개발_TIL | 2022-07-25 (67)  (0) 2022.07.26
개발_TIL | 2022-07-22 (66)  (0) 2022.07.22
개발_TIL | 2022-07-21 (65)  (0) 2022.07.21