스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍Young-Beom RheeJavascript 객체지향, 함수형 프로그래밍에 대해서 알아봅니다.
prototype을 이용하여 상속을 구현하는 방법, 그리고 Closure와 Function을 이용한 강력한 함수형(Functional) 프로그래밍
Javascript 함수(function) 개념, 호출패턴, this, prototype, scopeYoung-Beom RheeJavascript의 함수(Function)의 기본개념과, 호출패턴에 따라 달라지는 this, 상속을 가능하게 해주는 prototype, 다른 언어와 다른 scope에 대해 알아봅니다.
프론트엔드스터디 E03 - Javascript intro.Young-Beom RheeJavascript 흐름, 동적데이터타입(Dynamic typing), 연산자, 객체, 배열, 동적 파라미터, Script 선언위치 등 Javascript를 처음 접했을때 꼭 이해해야 되는 내용들에 대해서 알아봅니다.
Javascript introduction, dynamic data type, operatorYoung-Beom Rhee대상 : Javascript를 언어로 처음 접하는 개발자
범위 : Javascript의 흐름, 문맥(Context)를 모르면 이해할 수 없는 Dynamic typing(동적 데이터 타입), 멘붕을 마음껏 선사할 헷갈리는 연산자
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Young-Beom RheeJavascript의 함수가 실행될때 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context)에 설정되는 것들과 주의할 점들
골때리는 자바스크립트 발표자료욱진 양Sorry. for koreans only. I'll add english short description. or just visit http://wtfjs.com
아오 썅.
정정사항입니다.
객체 동일비교는 항상 valueOf 결과물로 나온 비교로 하는 데다가,
객체와 배열은 valueOf 해봐야 객체로 나오기 때문에
객체와 배열은 == 하나 === 하나 같은 비용으로 비교합니다.
[1,2,3]==[1,2,3] 은 false가 되므로
[1,,,2]==[1,undefined,undefuned,2] 는 무조건 false로 나옵니다.
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로Oracle KoreaOpenJDK로 Java 언어 개선 주도권이 넘어간 후 Java의 개선 속도가 몰라보게 빨라지고 있습니다. Java를 언어, 런타임, 표준 API로 나눌 때 프로그래머에게 가장 중요하다고 볼 수 있는 언어 관점에서 Java가 앞으로 어떻게 개선될 지, Java의 미래를 알아보려고 합니다.
iOS 메모리관리Changwon National University이 자료는 이영록강사님이 2011년 iOS 개발자 포럼에서 발표한 내용을 약간 개선하고 정리한 자료입니다.
iOS의 메모리관리 기법은 retain count라고 하는 독특하면서도 효율적인 방법을 사용하며 최근에 발표된 Xcode에서는 Automatic Reference Counting(ARC) 기법을 통해 release를 사용하에 객체를 소거하는 불편함을 많이 개선하였습니다.
본 자료에서는 이러한 점에 대한 비교적 상세한 설명을 담고 있습니다.
골때리는 자바스크립트 발표자료욱진 양Sorry. for koreans only. I'll add english short description. or just visit http://wtfjs.com
아오 썅.
정정사항입니다.
객체 동일비교는 항상 valueOf 결과물로 나온 비교로 하는 데다가,
객체와 배열은 valueOf 해봐야 객체로 나오기 때문에
객체와 배열은 == 하나 === 하나 같은 비용으로 비교합니다.
[1,2,3]==[1,2,3] 은 false가 되므로
[1,,,2]==[1,undefined,undefuned,2] 는 무조건 false로 나옵니다.
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로Oracle KoreaOpenJDK로 Java 언어 개선 주도권이 넘어간 후 Java의 개선 속도가 몰라보게 빨라지고 있습니다. Java를 언어, 런타임, 표준 API로 나눌 때 프로그래머에게 가장 중요하다고 볼 수 있는 언어 관점에서 Java가 앞으로 어떻게 개선될 지, Java의 미래를 알아보려고 합니다.
iOS 메모리관리Changwon National University이 자료는 이영록강사님이 2011년 iOS 개발자 포럼에서 발표한 내용을 약간 개선하고 정리한 자료입니다.
iOS의 메모리관리 기법은 retain count라고 하는 독특하면서도 효율적인 방법을 사용하며 최근에 발표된 Xcode에서는 Automatic Reference Counting(ARC) 기법을 통해 release를 사용하에 객체를 소거하는 불편함을 많이 개선하였습니다.
본 자료에서는 이러한 점에 대한 비교적 상세한 설명을 담고 있습니다.
PHP 7의 새로운 특징과 기능 요약정아 손안녕하세요!
2016년도에 작성한 문서입니다.
기존에 PHP5에 익숙하신 분들이 새로이 PHP7이 나오면서,
간략하게 나마 무엇이 바뀌었는지,
그리고 PHP 프레임워크를 시작하기 전에 표준적인 코딩은 어떤 것인지 알아보기 위해 문서를 작성하였습니다.
많은 분들에게 도움이 되길 바라며!! ^^
* 참고 : PHP 5.5.9 이상 버전에서도 위 예제코드가 됩니다! >.<
Multi-thread : producer - consumerChang Yoon Oh기본적인 thread에 대한 접근법에서 Producer - Consumer의 여러가지 형태를 설명
2014-07-22 게시
2014-07-24 readwritelock 수정
2014-08-30 내용 추가
자바에서 null을 안전하게 다루는 방법Sungchul Park여러 언어에서 null 안전성을 주요 마케팅 쟁점으로 내세우면서 null 안전성이 관심을 많이 받고 있습니다.
자바에서도 null을 잘 다루어야 소프트웨어 결함을 줄이고 견고하게 만들 수 있는데 null의 위협에서 코드를 안전하게 지키는 설계 지침을 정리하고 안전하다고 확인하는데 도움이 되는 도구를 소개합니다.
[IT기술칼럼#2] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원탑크리에듀(구로디지털단지역3번출구 2분거리)탑크리에듀(www.topcredu.co.kr), 송석원 교수의 IT기술칼럼#2
자바스크립트는 ES6버전에서 class 키워드를 도입했습니다. 자바스크립트는 객체지향 언어였지만 다른 객체지향언어처럼 사용하기에는 많은 불편함이 있었습니다. 심지어 자바스크립트는 객체지향언어라고 볼 수 없다고 하는 분들도 있었을 정도였죠. 최근에 선풍적인 인기를 얻고 있는 React, Angular 같은 기술은 클래스 문법을 채택했습니다. 따라서, 클래스 문법에 대한 이해가 깊다면 새로운 기술을 습득할 때 많은 도움이 될 것 입니다.
다른 객체지향 언어와 자바스크립트의 차이를 이해하지 못하고 사용하게 되면 많은 문제점이 발생합니다. 안타깝지만 자바스크립트를 사용하고 있는 개발자들 중에서도 제대로 이해하고 사용하시는분은 많지 않은 듯 합니다.
이를 해소하기 위해서 새로 도입한 문법이 class 키워드로 대표되는 클래스 문법입니다. 객체지향 개발방법의 익숙한 개발자들을 위해서 자바스크립트가 새로운 문법을 도입한 것 입니다. 개인적으로 “JavaScript: The Good Parts”의 저자이신 Douglas Crockford 님께서 이를 어떻게 생각하는지 궁금합니다. 자바스크립트를 자바처럼 사용하는 것에 우려를 표하셨었는데, 그 사이 많은 시간이 지났으므로 입장이 바뀌었을지 궁금하군요. 선도적인 개발자들은 ES6에서 도입한 클래스 문법이 좋은 것인가 나쁜 것인가를 갖고 토론을 하기도 합니다.
5. 일급객체 – First citizen
다음과 같은 조건을 만족할 때 일급
객체라고 말할 수 있다.
- 변수나 데이터 구조안에 담을 수
있다.
- 파라미터로 전달 할 수 있다.
- 반환값(return value)으로 사용할 수
있다.
1. 기본개념
var func = function () {};
return function(){};
func(function(){});
6. 함수 vs. 메서드
console.dir() 은 함수일까? 메서드일까?
vs.
1. 기본개념
function funcA() {
/* 코드 블록*/
}
var objA = {
funcA : function() {
/* 코드 블록 */
}
}
7. 함수 vs. 메서드
함수를 객체의 속성에 저장하는 경우
=> 메서드(method)
console.dir()의 dir역시
console 객체의 하나의 속성
1. 기본개념
9. 함수의 종류
FunctionDeclaration vs. FunctionExpression
* FunctionDeclaration은 Hoisting이 발생한다.
(단, 정식명칭은 아니다.)
1. 기본개념
Quiz.
funcA();
function funcA() {
console.log('funcA has called');
} // 호출됨
funcB();
var funcB = function() {
console.log('funcB has called');
}; // 에러
10. Quiz.
1. 기본개념
각각의 출력 결과는?
console.log(a);
function a() {};
var a = 1;
console.log(a);
console.log(a);
var a = 1;
function a() {};
console.log(a);
console.log(a);
var a = 1;
var a = function(){};
console.log(a);
11. 그 외의 함수들
즉시실행함수
1. 기본개념
중첩된 함수 혹은 내부함수
=> closure
(function(){
console.log("Right now!")
})();
function a() {
return function() {
}
}
12. 함수 전달인자 - arguments
=> 가변전달인자 varargs(variable length
arguments)
1. 기본개념
function maxNum(/* 어떤 값이 들어와도 상관 없음 */) {
var max = Number.NEGATIVE_INFINITY;
for(var idx in arguments) {
if(!isNaN(arguments[idx]) && arguments[idx]>max) {
max = Number(arguments[idx]);
}
}
return max;
}
maxNum(1, 21, 3, undefined, 5, 123, false, '1234', 'test');
13. Arguments 객체
- 함수 내부에 존재하는 객체
1. 기본개념
function dirArgu(/*파라미터 선언 없음*/) {
console.dir(arguments);
}
dirArgu(1);
dirArgu(1,2,3,4,5,6,7);
14. 1.기본개념부터 잡아보자
2.호출패턴에 따라 달라지는 this
3. 상속을 가능하게 해주는 Prototype
4. 다른 언어와 다른 유효범위 Scope
+@ 재귀함수를 구현하는 3가지 방법
15. 호출패턴과 this
1. 메서드 호출 패턴
- 호출하는 패턴에 따라 this라는 추가적인 매개변수를 다르게
초기화 한다.
2. 호출패턴에 따라 달라지는 this
var objA = {
sum : 0
, add : function(addVal) {
this.sum += addVal;
return this.sum;
}
}
objA.sum;
objA.add(2);
objA.add(3);
var directAddCall = objA.add;
directAddCall(2); this === objA
this === window
★ This -> 호출한 함수가
속한 오브젝트를 참조
16. 2. 함수 호출 – use strict
2. 호출패턴에 따라 달라지는 this
this === window
this === undefined
this === window
function funcA() {
console.dir(this);
};
console.dir(funcA());
function funcA() {
"use strict";
console.dir(this);
};
funcA();
window.funcA();
use strict : 따로 언급하지 않는 이상 window에 매핑되는 모호함을
허용하지 않음.
17. 3. 생성자에서 호출
2. 호출패턴에 따라 달라지는 this
this === FuncA
function FuncA() {};
var funcB = new FuncA();
FuncA.prototype.checkThis
= function(){
console.dir(this);
};
funcB.checkThis();
18. 4. call 과 apply
2. 호출패턴에 따라 달라지는 this
function A(a,b,c) {
console.log(this.x, this.y, a, b, c);
}
A();
A.call({x:1,y:2}, 3, 4, 5);
A.apply({x:1,y:2}, [6, 7, 8]);
명시적으로 this에
mapping시킬
프로퍼티들을 넘길 수 있다
19. +@ bind를 통한 this mapping
2. 호출패턴에 따라 달라지는 this
call, apply
-> 호출시점에 일시적인 매핑
bind
-> 영구적인 Binding
var newA = A.bind({x:3,y:4});
var newA2 = A.bind({x:3,y:4});
21. 함수의 프로토타입 상속
3. 상속을 가능하게 해주는 Prototype
=> __proto__ 는 생성자의 prototype을 바라보고 있다.
function FuncA() {}
var funcA1 = new FuncA();
console.dir(funcA1);
FuncA.prototype.addedMethod =
function(){ console.log("I'm added"); };
console.dir(funcA1);
22. function Person(name) {
this.name = name;
}
Person.prototype.getName = function () {
return this.name;
}
Person.prototype.setName = function (name) {
this.name = name;
}
var personA = new Person("personA");
var personB = new Person("personB");
var personC = new Person("personC");
console.log(personA.getName());
console.log(personB.getName());
console.log(personC.getName());
공통속성을 추가하는 경우
– Prototype을 이용
Instance마다 개별적으로
가져야 할 프로퍼티
공통으로 가져야 할
프로퍼티
24. 변경이 발생했을 때
Person.prototype.getName = function () {
return 'Hello, ' + this.name;
}
console.log(personA.getName());
console.log(personB.getName());
console.log(personC.getName());
Hello, personA
Hello, personB
Hello, personC
Prototype을 참조하고 있는
다른 모든 Instance에도 모두 적용
25. Prototype의 몇 가지 속성
name : name / hasOwnProperty : true
name : getName / hasOwnProperty : false
name : setName / hasOwnProperty : false
for (var obj in personA) {
console.log('name : ', obj, ' / hasOwnProperty : ' +
personA.hasOwnProperty(obj));
}
- 마치 자신의 속성처럼 열거할 수 있다.(for in 사용)
- hasOwnProperty() 메서드를 사용해 소유여부(자신이
소유하고 있는지, prototype으로 참조하는지)를 확인할
수 있다.
26. function Circle(r) {
this.r = r;
}
Circle.prototype.PI = 3.14;
Circle.prototype.getArea = function () {
return 2 * this.r * this.PI;
}
var r2 = new Circle(2);
console.log(r2.getArea());
var r3 = new Circle(3);
console.log(r3.getArea());
var r3Alien = new Circle(3);
r3Alien.PI = 4.74; // PI 재정의
console.log(r3Alien.getArea());
내부의 property가 있는 경우에 prototype을 참고하지 않는다.
이런 경우를 다른 property가 가렸다(shadows) 혹은
숨겼다(hides)라고 한다
- Prototype property가 참조되지 않을 수 있다.
27. Function.prototype.addMethod = function (name, func) {
if(!this.prototype[name]) {
this.prototype[name] = func;
}
}
function Person(name) {
this.name = name;
}
Person.addMethod('setName', function(name) {
this.name = name;
});
Person.addMethod('getName', function () {
return this.name;
});
var personA = new Person("personA");
var personB = new Person("personB");
var personC = new Person("personC");
크락포드옹 스탈
Overriding 을 방지할 수 있다
28. Function의 용도가 2가지
: 실행을 위한 함수, 생성자 함수
혼란을 피하기 위해 생성자 함수는 대문자로
시작하도록 권고
크락포드옹님 주의사항
29. * prototype chaining 맛보기
3. 상속을 가능하게 해주는 Prototype
var a = {
func : function(){ console.log(this.val); }
};
var b = Object.create(a);
var c = Object.create(b);
var d = Object.create(c);
var e = Object.create(d);
b.val = 'b.val';
a.val = 'a.val';
e.func(); // b.val
e .__proto__ .__proto__ .__proto__ .__proto__ === a; // true
30. 1.기본개념부터 잡아보자
2.호출패턴에 따라 달라지는 this
3. 상속을 가능하게 해주는 Prototype
4. 다른 언어와 다른 유효범위 Scope
+@ 재귀함수를 구현하는 3가지 방법
31. Quiz.
a = ?
4. 다른 언어와 다른 유효범위 Scope
function aa() {
var a = 1;
function b() {
var a = 2;
c();
}
function c() {
console.log(a);
}
b();
}
aa();
32. Quiz. 항목별 유효범위
4. 다른 언어와 다른 유효범위 Scope
항목별 Scope는
어떻게 될까?
outer()
inner()
x, a, b, c
function outer() {
debugger;
inner();
var a = 1;
function inner() {
var x = 2;
}
var b = 2;
if(a==1) {
var c = 3;
}
console.log(c);
}
outer();
33. 항목별 유효범위
4. 다른 언어와 다른 유효범위 Scope
* JavaScript의 Scope는
블록단위가 아니라 함수 단위
function outer() {
debugger;
inner();
var a = 1;
function inner() {
var x = 2;
}
var b = 2;
if(a==1) {
var c = 3;
}
console.log(c);
}
outer();
!! If 블록을
넘어간다.
Scope 결정요소 :
어디에
선언되었느냐?
변수냐? 함수냐?
outer()
inner()
x a b c
34. 블록 vs. 함수 유효범위
C, Java 등의 언어의 유효범위 : { } (Block)
블록이 끝났다고(})
유효범위가 끝나지
않는다.
⇒ JavaScript의
유효범위 : 함수
4. 다른 언어와 다른 유효범위 Scope
if(window) {
var x =123;
}
console.log(x);
35. 1.기본개념부터 잡아보자
2.호출패턴에 따라 달라지는 this
3. 상속을 가능하게 해주는 Prototype
4. 다른 언어와 다른 유효범위 Scope
+@ 재귀함수를 구현하는 3가지 방법
36. Quiz.
+@ 재귀함수를 구현하는 3가지 방법
arguments?
callee?
괄호는 왜 2개?
function factorial() {
return function(x) {
if (x <= 1)
return 1;
else
return x * arguments.callee(x-1);
};
}
factorial()(5);
37. Quiz.
+@ 재귀함수를 구현하는 3가지 방법
function factorial() {
return function(x) {
if (x <= 1)
return 1;
else
return x * arguments.callee(x-1);
};
}
factorial()(5);
arguments? -> 함수가 실행될 때 생성되는 객체
callee? -> 자신을 호출한 객체
괄호는 왜 2개? -> 첫 번째 괄호는 실행 후에
function(x)를 리턴. 두 번째 괄호를 통해
function(x)를 실행.
38. 재귀 - Function Declaration
=> 어느 곳에서든지 이름으로 호출 가능
+@ 재귀함수를 구현하는 3가지 방법
function factorial(x) {
if (x <= 1) return 1;
else return x * factorial(x-1);
}
factorial(5);
39. 재귀 – 메서드(Function Expression)
=> 익명 함수에 이름을 주면 함수 내에서 사용할
수 있다.
+@ 재귀함수를 구현하는 3가지 방법
var factorial = function recurs(x) {
if (x <= 1) return 1;
else return x * recurs(x-1);
}
factorial(5);
40. 재귀 – arguments.callee (deprecated)
=> 함수가 호출되는 시점에 자신을 호출한
객체를 arguments.callee에 할당한다.
+@ 재귀함수를 구현하는 3가지 방법
var factorial = function(x) {
if (x <= 1) return 1;
else return x * arguments.callee(x-1);
}
factorial(5);