코드를 하나의 이름으로 묶어두고 사용하는 것
function func_1() {
console.log("function 키워드 다음에 함수 이름 설정");
}
func_1();
함수가 생성되기전에 호출하는 것
let을 이용해서 함수를 생성하면 Hoisting을 사용하면 에러발생
화살표 함수 - 함수를 다른 함수에 대입할때 이용
let func_3 = () => {
console.log("화살표 함수");
}
c언어는 연속적
함수의 수행을 종료하고 하나의 데이터를 호출한 곳으로 넘겨주고자 할 때 사용하는 명령어
return뒤의 문장은 수행되지 않습니다.
return은 함수의 수행을 종료하는것이고 break는 반복문을 빠져나오는 것.
동일한 입력에 동일한 출력을 만들어야 합니다.
외부 데이터를 변경하지 않아야 합니다.
결과는 리턴을 해야 합니다.
함수가 자기 자신의 함수를 리턴하는 경우
재귀를 사용하면 코드의 가독성이 높아지는데 메모리 사용량이 많아지고
시간이 오래걸릴수 있다.
재귀를 만들때는 반드시 종료하는 지점이 있어야 합니다.
함수가 일급 객체
함수도 하나의 자료형이므로 변수에 대입할수 있고 매개변수로도 사용할 수 있고 return 할수도 있음
callback함수: 이벤트나 상태변화가 발생하면 호출되는 함수
함수의 매개변수로 함수를 대입받는 형태로 많이 구현
Nested 함수 :함수 안에 함수를 만드는 것이 가능
High Order Function: 다른 함수를 리턴하는 함수로 currying이라고도 하면 디자인 패턴으로 간주하기도 함
Closure: 함수 안에서 함수를 리턴해서 함수외부에서 함수 내부의 데이터를 수정하는 것
ECMA2015에 추가된 문법
함수를 아래처럼 작성
(매개변수 나열) => {함수의 내용}
=>매개변수가 1개이면 ( ) 를 생략해도 됩니다.
함수의 내용이 한줄이면 { } 생략 가능
마지막 수행되는 문장의 결과를 return
함수 내부에서 this와 arguments를 사용할수 없음
arguments대신에 rest를 사용
=>앞에서 줄바꿈하면 에러이고 뒤에서 하는 것은 관계 없음
콜백 함수로 설정할 때 주로 이용
javaScript에서 제공하는 함수로 실제로는 window 객체의 메서드인데 window 객체를 이용해서 내부 요소를 호출할 때는 window.을 생략할수 있어서 전역 함수처럼 사용합니다.
메시지를 대화상자에 출력할 때 사용하는 함수
alert(메시지)형태로 사용하는데 return 되는 데이터가 없음
Encoding: 데이터를 컴퓨터에 저장하는 형태로 만드는 것
javaScript에서 서버에게 데이터를 전송할때 get방식을 사용하는 경우 query string ( parameter)은 반드시 encoding을 해서 전송해야 합니다.
query string에 한글이 포함되어 있는데 인코딩하지 않고 전송하면 글자가 깨짐
escape(문자열): 일부 특수문자(@, *, -, +, ., /)를 제외한 모든 문자를 인코딩
encodeURI(문자열): 인터넷 주소에 사용되는 문자를 제외한 모든 문자를 인코딩 - 주로사용
encodeURlComponent(문자열) : 알파벳과 숫자를 제외한 모든 문자를 인코딩
Decoding: 컴퓨터에 저장된 데이터를 출력하기 위한 형태로 만드는 것
1)Encapsulation(캡슐화)
불필요한 부분을 숨기고 하나로 만드는 것
클래스를 만드는것과 인스턴스 만드는것 그리고 접근 지정자를 학습
2)Inheritance(상속)
하위클래스가 상위 클래스의 모든것을 물려받는 것
3)Ploymorphsim(다형성)
동일한 메시지에 대하여 다르게 반응하는 성질
동일한 코드가 호출하는 객체에 따라 다른 메서드를 호출하는 성질
상속과 오버라이딩(가끔은 오버라이딩이 아니라 구현)으로 구현됨
데이터를 저장할수 있는 속성 (variable- property) 과 기능을 수행하는 메서드(function - method)를 모아놓은 것
종류
사용자 정의 객체 : 개발자가 필요에 의해서 생성
내장 객체: javaScript 에서 제공하는 객체 -API(Application Programming
사용자 정의 객체
1)생성
var(let 이나 const)이름 ={속성이름": 데이터, "메서드이름":메서드 코드...}
var(let이나 const) 이름 = new 생성자 (매개변수 나열)
2) 내부 요소 호출(.을 이용합니다.)
이름.속성이름
이름.메서드이름(매개변수)
대신에 [속성이름] 으로 속성 호출이 가능한데 이 때는 문자열 형태로 입력해야 합니다.
var obj = {"name":"adam"};
obj.name
obj["name"]
내부속성은 중복해서 만들어지지 않는다
3)for in
for(임시변수 in 객체){수행할 내용}
객체의 모든 속성의 이름을 임시변수에 문자열 형태로 대입하고 {} 안의 내용을 반복 수행
4)속성이름 in 객체
속성이 객체 존재하는지 여부를 판단해서 boolean으로 리턴
9)constructor (생성자)
생성자는 객체를 생성해서 메모리 할당을 하고 그 참조를 리턴하는 함수
일반 함수를 만드는것과 동일한 방법으로 만드는데 객체를 생성하고자 하면 내부에서 this를 이용해서 필요한 속성과 메서드를 정의하면 됩니다.
생성자 호출: new 생성자이름(매개변수)
생성자 (클래스)를 만드는 이유는 동일한 속성을 갖는 객체를 여러개 생성해야 하는 경우입니다.
유사한 모양의 객체를 만들기 위한 템플릿
생성자를 이용해서도 생성이 가능하지만 생성자를 이용하게 되면 모든 멤버를 생성자 안에서 만들어야 하기 때문 객체가 가져야하는 메서드가 많아지면 코드가 가독성이 떨어지게 됩니다.
ECMA2015 (ES6)에서 Class문법을 추가시킴
1)선언
기본적인방법
class 클래스이름{
클래스내용
}
상속을 받는경우
class 클래스이름 extends 상위클래스이름{
클래스내용
}
표현식을 이용
let 이름 = class(클래스 내용)
let 이름 = class 내부에서 사용할이름 {클래스 내용}
클래스 이름은 일반적으로 첫글자를 대문자로 표현합니다.
2)클래스를 이용한 객체 생성- 클래스를 이용해서 생성된 객체를 instance라고 합니다.
클래스의 생성자는 클래스 이름 과 동일하게 만들어지기 때문에 생성자 이름 대신에 클래스 이름을 기재해도 됩니다.
new (let 또는 const 가능) 이름 = new 생성자이름(매개변수);
new 연산자는 생성자를 호출해서 인스턴스를 heap 영역에 만들고 그 참조를 리턴하는 연산자입니다.
3)클래스 안에 멤버 속성 만들기
=>메서드 안에서 this 와 이름을 만들면 인스턴스의 속성이 됩니다.
4)javaScript에서의 class는 정적이지 않습니다.
javaScript 에서는 class의 내용을 수정할수 있습니다.
Class가 prototype 이라는 내부 객체를 이용해서 모든 속성을 저장합니다. prototype이 객체라서 확장이 가능합니다.
클래스를 선언할 때는 없었는데 나중에 추가하거나 변경하고자 하면
클래스이름.prototype.속성이름 = 내용 으로 클래스에 속성을 추가하는 것이 가능
5)이름
JavaScript에서는 변수, 함수, class 가 모두 동일한 레벨입니다.
기존의 이름에 값이 저장되어 있는데 함수를 대입하면 기존의 값은 사라지고 함수의 내용이 저장됩니다.