함수 중심 - 구조적 프로그래밍 : c
객체 중심 - 객체 지향 프로그래밍 : c++/java
--> javascript는 두 개 다 사용
자료
제어
사용자 정의 함수 - 개발자가 선언
내장 함수 - 프로그램 내에서 제공되는 함수
익명함수를 화살표 개념으로 쓴 것
<head>
<script type="text/javascript">
//익명 함수
const doFunc1 = function() {
console.log('doFunc1 호출');
};
//화살표 함수
const doFunc2 = () => {
console.log('doFunc2 호출');
};
//매개변수 넣은 화살표 함수
const doFunc3 = (one) => {
console.log('doFunc3 호출 : ' + one);
}
//리턴(정식)
const doFunc4 = (one, two) => {
return one + two;
}
//리턴을 간단하게 줄인 것(결과 doFunc4와 동일)
const doFunc5 = (one, two) => one + two;
</script>
</head>
<body>
<script type="text/javascript">
doFunc1();
doFunc2();
doFunc3(10);
console.log('결과 : ' + doFunc4(10, 20));
</script>
</body>
<head>
<script type="text/javascript">
const doFunc1 = function(data1, data2) {
console.log('doFunc1 호출 : ' + data1);
console.log('doFunc1 호출 : ' + data2);
};
</script>
</head>
<body>
<script type="text/javascript">
doFunc1(10, 20); //정석
//무조건 호출됨, data부분이 undefined로 출력(하나 집어넣어도 동일)
doFunc1();
</script>
</body>
(일반적인 경우는 아니고 특수한 경우에 사용)
<head>
<script type="text/javascript">
const doFunc1 = function(data1, data2=10) { -->직접 초기값 넣기
console.log('doFunc1 호출 : ' + data1);
console.log('doFunc1 호출 : ' + data2);
};
</script>
</head>
<body>
<script type="text/javascript">
doFunc1();
</script>
</body>
선언이 영향을 미치는 영역 (선언은 위에 써주는 것이 기본이나 항상 우선적으로 읽힌다.)
지역(local)/전역(static) 변수
<head>
<script type="text/javascript">
// scope : 선언이 영향을 미치는 영역
//선언한 변수들이 함수 내부에도 영향을 미친다(지역 변수가 없을 때), 선언은 항상 우선적으로 읽힌다.
//선언은 위쪽
//전역변수
let one= 100;
var two = 200;
const doFunc1 = function() {
//지역변수 --> 내부에서 사용하고 종료
let one= 110;
var two = 210;
console.log('doFunc1 호출 : ' + one);
console.log('doFunc1 호출 : ' + two);
};
console.log('one : ' + one);
console.log('two : ' + two);
</script>
</head>
<body>
<script type="text/javascript">
doFunc1();
</script>
</body>
<head>
<script type="text/javascript">
const outer = function() {
//내부 함수 - 내부적으로 선언한 함수는 밖에서 선언해줘야 함
//이 안에서만 사용할 때 쓴다.
const inner1 = function(){
console.log('inner1 호출');
}
const inner2 = function(){
console.log('inner2 호출');
}
console.log('outer 호출');
//밖에서 선언
inner1();
inner2();
};
</script>
</head>
<body>
<script type="text/javascript">
outer();
</script>
Number() - 숫자형변환
parseInt()/parseFloat() - 정수형 / 실수형 변환
String() - 문자형변환
Boolean() - 불린형변환
<body>
<script type="text/javascript">
let data1 = '10';
let data2 = '20';
// + : 문자열 연결
let sum = data1 + data2;
//숫자형 변환(Number)
let sum2 = Number(data1) + Number(data2);
console.log(sum);
console.log(sum2);
let data3 = '10일';
//NaN - Not a Number, 글자가 포함되어 있으면 숫자로 바꾸기 불가능
console.log(Number(data3));
//parseInt는 숫자만 추출하여 변환해줌(앞에 숫자가 있어야 함, Number와 다른점)
console.log(parseInt(data3));
//실수형으로 변환
console.log(parseFloat(data3));
</script>
</body>
Number - 문자가 포함되어 있으면 변환 불가능(NaN)
parseInt(Float) - 숫자만 추출하여 변환 가능(앞에 문자가 있을 시 NaN)
숫자가 아니면 true 숫자면 false
isXXX - true/false (주로 제어문과 같이 씀)
console.log( isNaN('1'));
console.log( isNaN('1e'));
console.log( isNaN('e1'));
문자열 변환
<body>
<script type="text/javascript">
let data1 = 10;
let data2 = 20;
let sum = data1 + data2;
//문자열 변환
let sum2 = String(data1) + String(data2);
//공백을 이용하여 변환 가능
let sum3 = data1 + '' +data2;
console.log(sum);
console.log(sum2);
console.log(sum3);
</script>
</body>
불린형변환 - true/false
console.log(Boolean(5+4));
console.log(Boolean("Hi~"));
console.log(Boolean("")); -->빈 공간은 false
console.log(Boolean(0)); --> 0도 false
console.log(Boolean(undefined)); -->이것도 false
알림창
<script type="text/javascript">
alert = 경고(알림)창
alert('알림창');
</script>
확인창
//confirm = 확인창(if문과 결합하여 자주 사용)
if(confirm('확인창')){
console.log('확인 선택');
}
else {
console.log('취소 선택');
}
->누르는 거에 따라 콘솔 창에 출력
입력창
<script type="text/javascript">
//입력창
// prompt('입력창'); -->일반 입력창
// prompt('입력창', '초기값'); -->초기값이 입력되어 있는 입력창
//변수에 할당하여 사용(취소시 null값 출력)
let value = prompt('입력창', '초기값');
console.log(value);
if(value){
//console.log에 사용되는 문자열 연결 연산
console.log('확인',value);
}
else {
console.log('취소');
}
</script>
시간 후 실행
<body>
<script type="text/javascript">
const work = function() {
console.log('work 함수 실행')
};
console.log('시작');
//setTimeout(work, 3000); //초 설정(3000이면 3초)
//callback함수 이용하여 setTimeout - 시스템이 실행
setTimeout(function() {
console.log('work 함수 실행');
}, 3000);
console.log('끝'); --> 시작과 끝이 실행되어도 3초 후에 실행됨(실행이 각각 진행된다(스레드))
</script>
</body>
시간마다 실행
setInterval(function() {
console.log('work 함수 실행');
}, 3000); --> 3초마다 실행
console.log('끝');
--> 웹 브라우저 종료되기 전까지 3초마다 계속 실행됨
타이머 종료
예시
<script type="text/javascript">
let counter = 0;
let timer = setInterval(() => { // --> 타이머 시작
console.log("안녕하세요?");
counter++;
if(counter == 5)
//counter가 5이면 타이머 종료
clearInterval(timer);
}, 2000);
</script>
문자열을 실행문으로 바꿔줌
<script type="text/javascript">
let expr1 = '2 + 3';
//eval => 문자열을 실행문
console.log(eval(expr1)); //5 출력
let expr2 = '';
expr2 += 'let num1 = 10;';
expr2 += 'let num2 = 20;';
expr2 += 'alert(num1 + num2);';
eval(expr2);
</script>
on + 이벤트기능 을 사용하여 함수와 연동한다.
<head>
<script type="text/javascript">
const doFunc1 = function() {
console.log('doFunc1 호출');
};
</script>
</head>
<body>
<script type="text/javascript">
//호출
//doFunc1();
</script>
<!-- 이벤트(: 동작) 필요 -> on + 이벤트종류 -->
<input type="button" value="함수 호출" onclick="doFunc1()">
<button onclick="doFunc1()">함수 호출~</button>
<a href="javascript:doFunc1()">함수 호출</a>
함수호출 클릭시 콘솔창에 doFunc1 출력
변수 / 상수 - 1개 값만 저장 가능
여러 개의 값을 저장 - 배열
배열명 = [값, 값, 값, ...]
<script type="text/javascript">
//배열의 선언
let arr1 = []; // 값이 없는 배열
//같은 종류 데이터를 입력(일반적으로)
let arr2 = [10, 20, 30, 40]; //4개의 숫자가 있는 배열
let arr3 = ['10', '20', '30', '40']; //4개의 문자가 있는 배열
console.log(arr2);
//배열의 타입은 객체
console.log(typeof arr2);
//배열 인덱스 접근 방법
console.log(arr2[0]);
console.log(arr2[1]);
//배열 각 인덱스 값 수정
arr2[0] = 100;
arr2[1] = 200;
console.log(arr2);
//배열 값의 갯수(중요)
console.log(arr2.length);
</script>
for(let i = 0; i<arr2.length; i++) {
console.log(arr2[i]);
}
<script type="text/javascript">
//배열 값의 합계..
let arr2 = [10, 20, 30, 40]; //4개의 숫자가 있는 배열
let sum = 0;
for(let i = 0; i<arr2.length; i++) {
sum += arr2[i];
}
console.log('arr2 배열의 합은 ' + sum);
</script>
let arr1 = [10, 20, 30, 40]; //4개의 숫자가 있는 배열
let arr2 = Array(10, 20, 30); //Array 사용
let arr3 = new Array(10, 20, 30); //new 사용
for(변수 in 객체)
<script type="text/javascript">
//배열 값의 합계..
let arr1 = [10, 20, 30, 40]; //4개의 숫자가 있는 배열
for(let i in arr1){
//console.log(i); -->인덱스 값 출력
console.log(arr1[i], i); --> 값, 인덱스 출력
}
</script>
문자열이나 배열과 같은 반복 가능 자료에서 사용하는 반복문
<script type="text/javascript">
const students = ["Park", "Kim", "Lee", "Kang"];
for(student of students) { --> students를 student 변수에 넣어주기
document.write(`${student}.`);
}
</script>
--> students이 하나씩 출력
문자열도 배열처럼 취급할 수 있다.
<script type="text/javascript">
let str1 = ['a', 'b', 'c', 'd', 'e'];
//문자열 = 문자배열
let str2 = 'abcde';
console.log(str1.length);
console.log(str2.length);
console.log(str1[0]);
console.log(str2[0]);
for(let value of str2) {
console.log(value);
}
</script>
<script type="text/javascript">
//배열과 함수
//가변인자(인자의 갯수를 자유롭게 결정하고 싶을 때)
const doFunc2 = function() {
//arguments - 파라미터에 대한 배열
console.log(arguments.length); --> (argument[0]을 출력하게 되면 0번째의 값 나옴)
};
doFunc2(10);
doFunc2(10, 20);
doFunc2(10, 20, 30);
</script>
argments와 같은 기능 수행
<script type="text/javascript">
function addNum(...numbers) {
let sum = 0;
for( let number of numbers)
sum += number;
return sum;
}
console.log(addNum(1, 3));
console.log(addNum(1, 3, 5, 7));
</script>
<head>
<script type="text/javascript">
let max = 0;
const viewMaxValue = function() {
for(let i = 0; i < arguments.length; i++){
if(max < arguments[i]){
max = arguments[i];
}
}
return max;
};
</script>
</head>
<body>
<script type="text/javascript">
viewMaxValue(10, 9, 21, 44, 92, 22, 28, 77, 101, 19, 22);
console.log('최댓값은 ' + max + '입니다.');
</script>
</body>
<head>
<script type="text/javascript">
let max = 0;
const viewMaxValue = function() {
for(const value of arguments) {
if(max <= value) {
max = value;
}
}
return max;
};
</script>
</head>
<body>
<script type="text/javascript">
viewMaxValue(10, 9, 21, 44, 92, 22, 28, 77, 101, 19, 22);
console.log('최댓값은 ' + max + '입니다.');
</script>
</body>
주소를 참조하여 데이터를 저장하는 것, 기존 저장 방식과는 다른 형태이다.
<body>
<script type="text/javascript">
let num1 = 10;
let num2 = num1; --> 10 값 대입( 값 자체를 전달하는 것 = 깊은 복사)
console.log(num1, num2); --> 둘 다 10 출력
num1 = 20;
console.log(num1, num2); --> num1에 20이 대입되어 20,10 출력
//참조 자료형( -> 객체 ) - 데이터 저장 구조가 기존것과는 다름
let arr1 = [1, 2, 3];
let arr2 = arr1; --> 1,2,3의 주소를 참조하여 대입된 것(주소, 참조값을 전달 = 얕은 복사)
console.log(arr1[0], arr1[1], arr1[2]);
console.log(arr2[0], arr2[1], arr2[2]);
arr1[0] = 100;
arr1[1] = 200;
arr1[2] = 300; --> 값이 바뀜에 따라 참조하고 있던 arr2까지 같이 바뀌는 것
console.log(arr1[0], arr1[1], arr1[2]);
console.log(arr2[0], arr2[1], arr2[2]); --> 둘 다 100, 200, 300으로 값이 같다.
</script>
</body>
2차원(행/열), 3차(x,y,z)... 이상의 배열
동일하게 array, new 등을 사용하여 배열 선언 가능하다.
<body>
<script type="text/javascript">
//다차원 배열 - 2차원(행/열), 3차(x,y,z)... 이상의 배열
let arr1 = [
[10, 20, 30],
[40, 50, 60],
[70, 80, 90],
];
console.log(arr1);
console.log(arr1[0]);
console.log(arr1[0][2]);
console.log(arr1[2][1]);
</script>
</body>
직접 그려본 것..
console.log(arr1.length); --> arr1[0], arr1[1], arr1[2] 3개라고 생각
console.log(arr1[0].length); --> arr1[0][0], arr1[0][1], arr1[0][2] 3개
//전체 데이터 값 구하기
for(let i = 0; i < arr1.length; i++) {
for(let j = 0; j<arr1[i].length; j++){
console.log(arr1[i][j]); -->전체 데이터 가져옴
}
}
for in,,을 활용하여 전체 값 구한 것
for(let i in arr1) {
for(let j in arr1[i]){
console.log(arr1[i][j]);
}
}
복잡하긴 하나 2차원 하는 거랑 비슷하다.
<script type="text/javascript">
//3차원 배열
let arr1 = [
[
[1, 2, 3],
[10, 20, 30]
],
[
[4, 5, 6],
[40, 50, 60]
]
]; -->3차원 배열 선언
//3차원 배열 전체 값 구하기
for(i in arr1){
for(j in arr1[i]) {
for(t in arr1[i][j]){
console.log(arr1[i][j][t]);
}
}
}
</script>
자동차 등 - 복합적인 형태 표현 하기 위해 객체 사용(새로운 자료형 만듦)
여러가지 자료들 하나로 묶은 것
자료형 - 보통 class 많이 씀
자료형 + 데이터 - object(객체)
ex> 자동차
그랜저
소나타
아반떼
-> 공통적인 내용 추출(추상화: abstraction)하여
-> 자동차 선언(개념) (개념은 정의지만 진리는 아니다)
-> 문법 추가하여(c,js,java ...)
-> class(설계도) 만듦 (인스턴스화 시키기) (설계도로 만든 객체 - 인스턴스)
-> 위의 각 자동차에 데이터를 추가하여 각각의 변수를 만듦(그랜저변수, 소나타변수, 아반떼변수)
사용자 정의 클래스 - 문법
내장객체
기본 - 자료형
문서 - DOM(Document Object Model)
웹브라우저 - BOM(Browser Object Model)
객체로 나뉨
외부객체(내장객체보다 훨씬 많이 쓰임)
class 클래스이름 {
}
-> 사용자 정의 클래스 객체변수로 할당
let 객체변수명 = new 클래스이름();
객체변수명을 통해 속성과 기능에 접근할 수 있다
<script type="text/javascript">
//Student1 클래스 선언
class Student1 {
}
class Student2 {
//속성 : 변수형태 - 멤버변수(멤버상수)
//기능 : 함수형테 - 메서드
//생성자(특수 함수) - 멤버 변수의 초기화(name, kor, mat이 student2의 변수가 된다.)
constructor() {
this.name = '홍길동';
this.kor = 90;
this.mat = 92;
}
}
//stu1 객체변수(인스턴스) 선언, new = 메모리 생성 연산자
let stu1 = new Student1(); --> 객체 생성
let stu2 = new Student2();
console.log(typeof stu1); --> object 타입 출력
// . -> 메모리 참조 연산자
console.log(stu2.name); -> .을 통하여 참조(접근)
console.log(stu2.kor);
console.log(stu2.mat);
</script>
<script type="text/javascript">
//변수 값 변경도 가능
stu2.name = '박문수';
stu2.kor = 96;
console.log(stu2.name);
console.log(stu2.kor);
//stu2의 주소값 stu3에 할당(얕은 복사)
let stu3 = stu2;
console.log(stu3.name);
console.log(stu3.kor);
</script>
<body>
<script type="text/javascript">
class Student1 {
constructor() {
this.name = '홍길동';
this.kor = 90;
this.mat = 92;
}
}
class Student2 {
constructor(name, kor, mat) {
//this.name은 멤버 변수(필드), name은 지역 변수
this.name = name;
this.kor = kor;
this.mat = mat;
}
}
//new로 인하여 각자 다른 객체를 사용하는 것임
let stu1 = new Student1();
let stu2 = new Student1();
console.log(stu1.name);
console.log(stu2.name);
//stu1과 2가 다른 객체를 참조하고 있는 것을 보여줌
stu2.name = '박문수';
//각각 다른 결과가 출력됨
console.log(stu1.name);
console.log(stu2.name);
//생성자에서 초기화하지 않고 객체를 생성시에 직접 초기화가 가능하다.
let stu3 = new Student2('박문수', 90, 91);
let stu4 = new Student2('이몽룡', 80, 89);
console.log(stu3);
console.log(stu4.name);
</script>
</body>
객체의 동작을 지정하는 함수(일반 함수 선언방법과 비슷하다)
<script type="text/javascript">
class Student1 {
constructor() {
this.name = '홍길동';
this.kor = 90;
this.mat = 92;
}
//메서드
getSum(){
console.log('getSum 호출',this.name);
console.log('getSum 호출',this.kor);
}
}
let stu1 = new Student1;
stu1.getSum();
</script>
<body>
<script type="text/javascript">
class Book2 {
//생성자
constructor(title, pages, done){
this.title = title;
this.pages = pages;
this.done = done;
}
//메서드
finish() {
let str = "";
this.done === false ? str = "읽는 중" : str = "완독";
return str;
}
}
//객체 생성 과정에서 직접 변수 초기화
let book1 = new Book2("웹 표준의 정석", 648, false);
let book2 = new Book2("점프 투 파이썬", 360, true);
console.log(`${book1.title} - ${book1.pages}쪽 - ${book1.finish()}`);
console.log(`${book2.title} - ${book2.pages}쪽 - ${book2.finish()}`);
</script>
</body>
함수로도 객체를 만들 수 있다.(생성자 함수)
<script type="text/javascript">
//생성자 함수
const makeStudent = function() {
this.name = '박문수';
this.kor = 90;
this.mat = 92;
};
let stu1 = new makeStudent();
console.log(typeof stu1);
console.log(stu1.name);
</script>
객체의 표기법 중 하나(new가 자동으로 돼서 나옴)
객체명 = {
키(속성명): 값,
키(속성명): 값,
...
}
<script type="text/javascript">
let stu1 = {
name: '박문수',
kor: 90,
mat: 80
};
console.log(typeof stu1);
console.log(stu1.name);
console.log(stu1.kor);
//배열처럼 접근 가능
console.log(stu1['kor']);
</script>