본문 바로가기
깃허브 링크!
javascript

프로토타입,클로저,즉시 실행 함수 작성법, 이터러블

//자바스크립트 프로토타입:

// JavaScript는 프로토타입 기반 언어입니다. 
// 이것은 객체 지향 프로그래밍에서 클래스가 아닌 객체를 기반으로 한다는 것을 의미합니다.
//  자바스크립트에서 객체는 다른 객체를 상속하는데 사용되는 프로토타입 객체를 가집니다.
//   즉, 객체는 다른 객체를 기반으로 만들어지며, 
//   이러한 상속 관계를 사용하여 코드를 재사용할 수 있습니다.

// 프로토타입은 모든 객체가 가지고 있는 특수한 속성으로, 이전 객체에서 상속됩니다. 
// 객체를 만들 때 프로토타입을 지정할 수 있으며, 
// 이를 통해 해당 객체가 상속할 속성과 메서드를 정의할 수 있습니다.


// Person 생성자 함수를 정의
function Person(name,age){
    this.name = name;
    this.age = age;
}

// this는 자바스크립트에서 현재 실행 중인 함수의 객체를 가리키는 키워드입니다.

// 위의 코드에서 Person 함수는 생성자 함수로 사용되고 있습니다. 
// 생성자 함수는 new 연산자와 함께 사용하여 객체를 생성할 때 사용됩니다. 
// 이때 생성된 객체는 생성자 함수의 this 키워드를 통해 속성에 접근할 수 있습니다.

// 즉, this.name과 this.age는 Person 생성자 함수로부터 
// 생성된 객체의 name과 age 속성을 의미합니다. 
// 생성자 함수 내에서 this를 사용하면 해당 함수를 사용하여 
// 생성된 객체 내부에서 속성에 접근할 수 있습니다.
//person 생성자 함수의 프로토타입에 sayHello 메서드를 정의
Person.prototype.sayHello = function(){
    console.log("Hello, my name is" + this.name + ".")
}

// Student 생성자 함수를 정의 Person을 상속
function Student(name,age,grade) {
    Person.call(this,name,age); // student 객체 자신을 가리킨다.
    this.grade = grade;
    // 이를통해 student 객체도 person 객체의 프로퍼티인
    // name과 age를 상속받을수 있다.
    //this 뒤에 점을 붙인것은 student 객체의 프로퍼티인 grade를 설정하기 위함
    //student객체는 name,age,grade 세 가지 프로퍼티를 가지게 됨
}

// student 생성자 함수의 프로토타입에 study 메서드를 정의
Student.prototype.study = function(){
    console.log(this.name + " is studying in grade" + " 10")
}

//person 프로토타입에 introduce 메서드를 정의합니다.
Person.prototype.introduce = function(){
    console.log("My name is" + this.name+ "and i am 25 years old"+".")
}

// person과 student 객체를 생성합니다.
let person = new Person("Alice",25);
let student = new Student("Bob");

person.sayHello(); // 출력: "Hello, my name is Alice."
student.study(); // 출력: "Bob is studying in grade 10."
person.introduce(); // 출력: "My name is Alice and I am 25 years old."
// -----------
// 자바스크립트 클로저
// 클로저(Closure)는 함수와 그 함수가 선언됐을 때의 
// 렉시컬 환경(Lexical Environment)과의 조합입니다.
//  이 말은, 함수가 선언될 당시의 환경에서 가져온 변수들을 계속해서 기억하고 있어,
//  함수가 호출될 때에도 그 변수들을 사용할 수 있게 해주는 것을 의미합니다.


 function outerFunction() {
    const outerVariable = "I am outside!";
    function innerFunction() {
      console.log(outerVariable);
    }
    return innerFunction;
    //return innerFunction; 구문은 innerFunction 함수 자체를 
    // outerFunction 함수 외부로 반환(return)하도록 합니다. 
    // 이는 innerFunction 함수가 클로저(closure)를 형성하여 
    // outerVariable 변수에 대한 접근 권한을 가지고 있기 때문입니다.
  }
  
  const innerFunc = outerFunction();
  innerFunc(); // "I am outside!" 출력

  // 위 코드에서 outerFunction 함수는 innerfunction 함수를 반환한다.
  // 이때 innerfunction은 outerfunction의 렉시컬 환경과의 조합을 통해 클로저가 되어
  // outerVariable변수를 사용할수 있게 된다.

 

 // 즉시 실행 함수 작성법

  (function() {
    var message = "Hello, world!";
    console.log(message);
  })();

  (function() {
    var message = "Hello, IIFE!";
    console.log(message);
  })();
  
  var message = "Hello, global!";
  console.log(message);

//위 코드에서는 함수를 정의하고 즉시 실행하며, 
//  함수 내부에서 message 변수를 선언하고 출력합니다. 
//  이 함수는 실행 후에 message 변수가 사라지므로 
//  전역 네임스페이스를 오염시키지 않습니다.
//또한, 함수 내부에서 선언된 변수는 외부에서 접근할 수 없기 때문에,
// 다음과 같이 변수 이름이 중복될 때 충돌을 방지하기 위해 
// 즉시 실행 함수를 사용하는 경우도 있습니다.
// 이터러블
// 이터러블(Iterable)은 반복 가능한 객체를 의미합니다. 
// 이터러블은 ES6부터 도입된 개념으로, 반복 가능한 객체를 만들기 위한 규칙을 정의합니다. 
// 이터러블을 사용하면 배열이나 문자열처럼 for...of문이나 Spread 연산자를 사용하여
//  간편하게 순회할 수 있습니다.

// 다음은 이터러블을 사용하여 반복 가능한 객체를 만들고 순회하는 예제입니다.

const myIterable = {
    [Symbol.iterator]: function* () {
      yield 1;
      yield 2;
      yield 3;
    }
  };
  
  for (const value of myIterable) {
    console.log(value);
  }
  
  // 출력:
  // 1
  // 2
  // 3

  //위 코드에서 myIterable 객체는 이터러블 객체로, [Symbol.iterator] 메서드를 구현하고 있습니다.
//    이 메서드는 제너레이터 함수로 구현되어 있으며, yield 키워드를 사용하여 순회할 값들을 반환합니다.

// 그리고 for...of 문을 사용하여 myIterable 객체를 순회하면, [Symbol.iterator] 메서드가 반환하는 이터레이터(iterator) 객체가 사용됩니다. 
// 이터레이터 객체는 next 메서드를 가지고 있으며, next 메서드를 호출할 때마다 다음 값을 반환합니다. for...of 문은 next 메서드가 반환하는 값을 반복하면서 순회합니다.

// 따라서 위 예제에서는 for...of 문이 myIterable 객체를 순회하면서 1, 2, 3을 차례대로 출력합니다.

이터러블(Iterable)과 이터레이터(Iterator)는 ES6에서 도입된 개념으로, 반복 가능한 객체를 만들고 순회하기 위한 규칙을 정의합니다.

이터러블은 반복 가능한 객체를 의미하며, [Symbol.iterator] 메서드를 가지고 있어야 합니다. 이 메서드는 이터레이터 객체를 반환하는 제너레이터 함수로 구현됩니다.

 

 

-----

위 코드는 iterable과 iterator의 개념을 이해하는데 도움이 되는 예제입니다.

  1. 이터러블 (Iterable)
  • 이터러블은 반복 가능한 객체로, Symbol.iterator 메소드를 포함하고 있습니다.
  • Symbol.iterator는 해당 객체를 순회할 수 있는 이터레이터를 반환합니다.

위 예제에서 myIterable 객체는 iterable입니다. 왜냐하면 Symbol.iterator 메소드가 구현되어 있기 때문입니다.

  1. 이터레이터 (Iterator)
  • 이터레이터는 이터러블 객체를 순회하며, 반복할 때마다 값을 반환합니다.
  • 이터레이터는 next() 메소드를 호출하여 다음 값을 반환합니다.
  • 다음 값이 없을 경우, done: true가 반환됩니다.

위 예제에서 for-of 구문은 myIterable 객체의 이터레이터를 만들어서 순회합니다. 이때, 이터레이터는 Symbol.iterator 메소드로부터 반환된 함수가 생성됩니다.

이터레이터는 내부적으로 next() 메소드를 호출하여 반복하며, yield 키워드를 만나면 해당 값을 반환합니다. 따라서 위 예제에서는 1, 2, 3이 차례대로 출력됩니다.

즉, 이터러블은 반복 가능한 객체를 뜻하며, Symbol.iterator 메소드를 통해 이터레이터를 반환합니다. 이터레이터는 이터러블 객체를 순회하며, next() 메소드를 호출하여 값들을 반환합니다. 이 두 가지 개념은 JavaScript에서 반복 처리를 위한 중요한 개념입니다.

-------

 

메소드는 객체가 가지고 있는 함수를 의미한다.

symbol.iterator 는 객체 내부에 구현되어 있는 메소드 이름으로,

이터러블 객체에서 이 메소드를 구현하면 해당 객체를 iterable로 만들수 있다.

 

이터레이터 객체를 반환하는 이유

이터레이터 객체는 next()메소드를 가지고 있어서,호출할 때마다 이터러블 객체에서 값을 차례로 반환 가능하기 때문이다.

이터레이터 객체를 통해 이터러블 객체의 각 값에 접근할 수 있게 된다.

 

next() 메소드는 이터러블 객체에서 다음 값을 반환하며,반환값은

{value,done}형태의 객체이다.

value은 반환된 값이고,done은 이터러블 객체의 끝까지 모든 값이 반환되었는지 여부를 나타냄

done이 true라면 이터러블 객체의 모든 값이 반환된 것이다.

 

 

------

 

야구게임

// 1.빈 숫자 배열을 선택
// 2.for 루프를 사용하여 1부터 9까지의 숫자를 숫자 numbers 배열에 추가
// 3.빈 결과 배열을 생성
// 4. for루프를 사용하여 3번 반복
// 5. math.random함수를 사용하여 0이상 1미만의 무작위 숫자를 생성
// 6.numbers 배열의 길이9와 위에서 생성한 무작위 숫자를 곱하여
//   0이상 8이하의 무작위 정수를 생성
// 7.result 배열에 numbers 배열에서 생성한 무작위 인덱스에 해당하는 값을 추가
// 8.numbers.splice(randomindex,1)코드를 사용하여
//   numbers 배열에서 위에서 선택한 숫자를 제거한다.
//   이렇게 함으로써 중복되지 않는 임의의 숫자 3개를 선택 가능하다.
// 9. 콘솔.log결과 코드를 사용하여 선택된 3개의 숫자를 출력해준다.

let numbers = [];
for (let i = 1; i <= 9; i++) {
  numbers.push(i);
}
let result = []; // ->이 배열에는 뒤에서 선택된 3개의 숫자가 들어갈것이다.

for (let i = 0; i < 3; i++) {
  let randomIndex = Math.floor(Math.random() * numbers.length);
  result.push(numbers[randomIndex]);
  //result 배열의 무작위 인덱스에 해당하는 값을 추가하는 코드
  numbers.splice(randomIndex, 1);
}

console.log(result); // 선택된 3개의 숫자 출력

 

'javascript' 카테고리의 다른 글

배열메소드  (0) 2023.04.06
야구 미니게임  (0) 2023.04.06
자기소개 웹사이트 만들기  (0) 2023.04.03
클래스의 생성자 함수와 static함수  (0) 2023.03.31
3/13 했던 업다운  (0) 2023.03.29