

백엔드 언어, 프레임워크, 데이터베이스 추천: JavaScript, Nodejs, SQL

import pandas as pd
contacts_df = pd.read_csv('./contacts.csv')
for index, contact in contact_df.interrows():
name = contact['Given Name']
email = contact['Email 1 - Value']
subject = f'{name}님 수료를 축하드려요!'
body = ( '메일 내용' )
print(f'받는 사람: {email}\n제목: {subject}\n본문: {body}\n\n')
# 출력해서 내용이 잘 만들어진건지 확인
import yagmail
email = "보낼 메일 주소"
yag = yagmail.SMTP(발송 메일 주소, 발송 메일 비밀번호) # from
yag.send(보낼 메일 주소(email), 제목(subject), 내용(body)) # to (받는사람)
# 이 때 짧은 시간 내에 메일을 연달아보내면 스팸계정으로 분리되기 때문에 딜레이 주기
from time import sleep
sleep(30)
import os
from shutil import copy
for file in os.listdir('./data'):
file, ext = file.split('.')
name, position = file.split('__')
src = f'./data/{file}.{ext}'
dest_path = f'./data/{position}'
if not os.path.exists(dest_path):
os.makedirs(dest_path)
dest = f'./data/{position}/{file}.{ext}'
copy(src, dest)
from selenium import webdriver
from time import sleep
selenium 공식 웹사이트 참고: https://www.selenium.dev/documentation/for(let i = 0; i<3; i++){
console.log(15);
}
;;를 자동으로 붙여주는 기능이 존재함//, /* 주석내용 */"Hello", 'Hello' ← 더하기 기호는 문자열 데이터를 연결하는데에 사용됨let name; // 변수 선언
name = "minji"; // 값 할당
let name = "minji"; // 동시에도 가능
변수 작명 가이드
꼭 지켜야 하는 규칙 (지키지 않으면 오류)
(1) JavaScript 식별자는 '문자(a-z, A-Z)', '밑줄(_)' 혹은 '달러 기호($)'로 시작해야함. 두 번째 글자부터는 '숫자(0-9)'도 가능.
(2) '대문자'와 '소문자' 구별
myname과 myName은 다른 이름
(3) 예약어는 사용 불가
예약어 예시: if, for, let 같은 것들이 있습니다.
지키면 좋은 규칙 (더 좋은 스타일을 위해)
(1) 아래와 같은 의미 없는 이름은 가독성을 떨어트리므로 지양
let a, b, c, d;
(2) 너무 추상적인 이름 지양
let name; // 여러 이름이 나오는 상황이라면 어떤 이름인지, 더 구체적으로 사용하는 것이 보다 바람직함
(3) camelCase 활용
첫 번째 글자는 소문자로, 띄어쓰기가 있는 각 단어의 첫 문자를 대문자로 표기하는 방식
let bad_variable_name; // 비추천 방식
let goodVariableName; // 추천 방식
자바스크립트에서는 변수를 선언만 하고 사용하지 않는다고 해서 오류가 발생하지는 않음, 그러나 이러한 방식은 가독성, 성능 저하의 원인이 될 수 있으므로 지양하는 것을 권장함
기타 스타일 가이드 링크
https://github.com/ParkSB/javascript-style-guide
https://google.github.io/styleguide/jsguide.html
https://www.w3schools.com/js/js_conventions.asp
https://standardjs.com/rules-kokr.html
https://github.com/rwaldron/idiomatic.js/tree/master/translations/ko_KR
indent(들여쓰기) VScode 에디터 설정
- 설정창(Settings) - editor tab 검색 - Editor: Detect Indentation 체크 해제, Editor: Tab Size 를 2로 변경
- 기존 작성 코드에 변경사항 적용 방법
기존 작성 파일 접근 - Ctrl + a - 우클릭 - Format Document 클릭
연습문제
// 변수 설정
let espresso = 10;
let milk = 170;
let chocolateSyrup = 50;
let whippedCream = 60;
// 메뉴별 칼로리 테스트
console.log(espresso); // 에스프레소 칼로리
console.log(espresso + milk); // 라떼 칼로리
console.log(espresso + chocolateSyrup + milk); // 모카 칼로리
console.log(espresso + chocolateSyrup + milk + whippedCream); // 모카(휘핑 추가) 칼로리
// 함수 선언
function 함수이름(){
명령;
명령;
};
// 함수 호출
함수이름();
consol.log() 도 개발자들이 미리 작성해둔 함수임!// 여기에 코드를 작성하세요
function printChorus(){
console.log('무궁화 삼천리 화려 강산');
console.log('대한 사람 대한으로 길이 보전하세');
}
// 애국가 가사
console.log('1절');
console.log('동해 물과 백두산이 마르고 닳도록');
console.log('하느님이 보우하사 우리나라 만세');
printChorus();
console.log('2절');
console.log('남산 위에 저 소나무 철갑을 두른 듯');
console.log('바람서리 불변함은 우리 기상일세');
printChorus();
// 함수 선언
function 함수이름(파라미터){
명령;
명령;
};
// 여기에 코드를 작성하세요
function teraToGiga (tera) {
let giga = tera * 1024
console.log(tera + "TB는\n" + giga + "GB 입니다.")
}
function teraToMega (tera) {
let mega = tera * 1024 * 1024
console.log(tera + "TB는\n" + mega + "MB 입니다.")
}
// TB -> GB 테스트
teraToGiga(2);
// TB -> MB 테스트
teraToMega(2);
,를 사용해서 구분함// 여기에 코드를 작성하세요
function bmiCalculator(name, weight, height){
let bmi = weight / (height * height / 10000)
console.log(name + "님의 체질량지수는 " + bmi + "입니다.")
}
// 테스트 코드
bmiCalculator('홀쭉이', 43.52, 160);
bmiCalculator('코린이', 61.25, 175);
bmiCalculator('통통이', 77.76, 180);
// 여기에 코드를 작성하세요
function interestCalculator(amount, term, rate){
let interest = amount * term * rate / 100;
return interest;
}
// 조건 입력 테스트
let myMoney = 3650000; // 맡긴 금액 (원)
let saveTerm = 1; // 맡기는 기간 (년)
let interestRate = 4; // 이자율 (%)
// 수령액 계산 테스트
let myInterest = interestCalculator(myMoney, saveTerm, interestRate);
let totalMoney = myMoney + myInterest;
// 출력 테스트
console.log('맡긴 금액은 ' + myMoney + '원 입니다.');
console.log('이자는 ' + myInterest + '원 입니다.');
console.log('최종 받을 금액은 ' + totalMoney + '원 입니다.');
(1) 객체지향인가 아닌가
객체지향 도입 배경
Top-down 방식: 전체 프로그램을 기능만을 기준으로 작은 task들로 쪼갠 후 개발자들이 각각 task 하나씩을 맡아 작업하는 식으로 협업하는 방법 → 문제점: 모두의 task를 모두 함께 합쳐봐야 전체프로그램이 잘 동작하는지 아닌지를 확인할 수 있고, 기능 수정시에도 하나만 수정하기 어려움, 결국 전체 코드를 매번 점검해야 하는 불편함이 있음
Bottom-up(객체지향) 방식: 데이터와 데이터가 필요한 함수끼리를 묶어서 객체를 형성하면 각 객체별로 테스트도 가능하고, 수정도 가능함.

⭐ 즉, 작업 단위를 나누는 기준이 기준 / 데이터로 서로 다름
객체 지향의 장단점
장점: 유지 보수에 용이하다, 가독성이 높다, 재사용하기 좋다, 테스트가 쉽다
단점: 설계가 어렵다, 작은 규모의 프로그램에서는 객체 지향적으로 작성하는 것이 더 오래 걸릴 수 있다, 극도로 빠르거나, 주어진 자원을 극도로 활용해야 하는 경우에는 좋지 않다, 임베디드와 같은 특정 분야에는 부적합하다.
객체지향 언어 vs 절차지향 언어
(2) 변수선언 시 데이터타입이 정해지는가 아닌가
1. Dynamic typing: Python, Ruby, JavaScript, php
간결, 편리함. 작은 사이즈의 프로그램을 금방 만들기 좋음. 그러나 실행속도는 비교적 느림
2. Static typing: C, C++, Java
비교적 제약이나 규제가 많아 사람의 실수를 방지함, 크고 복잡한 프로젝트에 적합함, 실행속도가 비교적 빠름
→ 임베디드, 실시간 투자, 인공 지능 분야에서 활약

math_score, pascal 표기 MathScore, camel 표기 mathScore라이브러리
도서관에서 필요한 책을 찾아보듯, 내가 필요한 코드를 다른 사람이 만들어둔 내용을 그대로 가져올 수 있도록 하는 개념
프레임워크
이미 완성된 프로그램에 내가 원하는 내용들 몇가지만 추가해서 만드는 것
예: Ruby on Rails
장점: 개발자가 미처 생각하지 못한 부분 (보안, 암호화)까지 이미 완성되어있어서 편리함
라이브러리 vs 프레임워크
카페를 창업했다고 생각하자. 이 때 유명 레시피, 커피머신 등을 도입하는 것은 라이브러리다. 그러나 스타벅스같은 프렌차이즈를 창업한다면 가게 디자인, 재료 등등 하나부터 열까지 전부 프렌차이즈 본사에서 정해준다.
+, -, *, /), 나머지연산(%), 거듭제곱 (**)"문자열", '문자열'\) + 따옴표 (' or ")로 사용console.log(`한국 영화 역사상 아카데미상을 받은 것은 '기생충'이 처음이다.`)
console.log(`아리스토텔레스는 "인간은 사회적 동물이다."라고 말했다.`)

===, 다르다 - !==로 사용 (파이썬과 다른 부분, 나머지는 동일) - &&, OR: ||, NOT: !typeof 확인하고 싶은 수 - 문자열 형태의 string 등으로 나옴console.log(typeof 8 - 3) // typeof 연산자가 제일 우선순위가 높음 - NaN 발생
console.log(typeof (8 - 3)) // number 결과로 나옴
typeof (6 * 2 === 11 || 13 - 7 < 7 && !true);
typeof (6 * 2 === 11 || 13 - 7 < 7 && false);
typeof (12 === 11 || 6 < 7 && false);
typeof (false || true && false);
typeof (false || false);
typeof false; // 최종 결과: false
String(), 숫자형으로 바꾸려면 Number(), 진리형으로 바꾸려면 Boolean()을 사용하면 됨+는 양쪽 값 중 하나라도 문자열이라면 나머지 하나도 문자열로 변환해서 문자열 붙이기 기능으로 사용됨===, !== 일치 / 불일치: 형변환 발생 X 상태로 비교==, != 동등 / 부등: 숫자형태로 형변환 발생 후 비교function calcWage(name, time, wage) {
let total = time * wage;
console.log(`${name}님의 근무 시간은 총 ${time}시간이며, 최종 급여는 ${total}원 입니다.`); // 괄호 안에 코드를 작성하세요
}
// 테스트 코드
calcWage('김윤식', 208, 11340);
calcWage('성규재', 175, 12160);
calcWage('손태웅', 161, 13070);
calcWage('허우선', 222, 10980);
=)+=, *=, -=// 다음 두 줄은 같습니다
x = x + 1;
x += 1;
// 다음 두 줄은 같습니다
x = x * 2;
x *= 2;
// 다음 두 줄은 같습니다
x = x - 3;
x -= 3;
// 다음 두 줄은 같습니다
x = x / 2;
x /= 2;
// 다음 두 줄은 같습니다
x = x % 7;
x %= 7;
++, --// 다음 세 줄은 같은 의미입니다
x = x + 1;
x += 1;
x++;
// 다음 세 줄은 같은 의미입니다
x = x - 1;
x -= 1;
x--;
console.log()과의 차이function first() {
let message = "코드잇";
return message;
}
function second() {
let message = "codeit";
console.log(message);
}
function third() {
let message = undefined;
console.log(message);
return message;
}
// 출력부분
console.log(first()); // 코드잇
second(); // codeit
console.log(third()); // undefined undefined
function orderSetMenu(sandwich, drink = '스프라이트'){
console.log(`주문하신 ${sandwich}, ${drink} 세트 메뉴 나왔습니다!`)
}
// 테스트 코드
orderSetMenu('코드웨잇 클럽');
orderSetMenu('터키베이컨 아보카도', '코카콜라');
orderSetMenu('코드웨잇 멜트');
orderSetMenu('이탈리안 비엠티', '닥터페퍼');
orderSetMenu('에그마요', '환타 오렌지');
{...}) 안에서 정의된 변수는 블록문 안에서만 유효함=을 통해 다른 수로 변경이 불가함const MY_NAME;if (조건부분) {
동작부분;
} else{
동작부분;
}
function checkHeight(height) {
// 여기에 코드를 작성하세요
if (height >= 140){
console.log("탑승이 가능합니다.")
} else{
console.log("탑승이 불가능합니다.")
}
}
checkHeight(140);
checkHeight(135);
checkHeight(170);
function printGrade(midtermScore, finalScore) {
let totalScore = midtermScore + finalScore;
if (totalScore >= 90) {
console.log('A');
} else if (totalScore >= 80) {
console.log('B');
} else if (totalScore >= 70) {
console.log('C');
} else if (totalScore >= 60) {
console.log('D');
} else {
console.log('F');
}
}
switch (비교할 값) {
case 조건값_1:
동작부분;
break;
case 조건값_2:
동작부분;
break;
default:
동작부분;
}
let myChoice = 2;
// switch문: 암시적 형변환을 허용하지 않음
switch(myChoice) {
case 1:
console.log('토끼를 선택한 당신, ...');
break;
case 2:
console.log('고양이를 선택한 당신, ...');
break;
case 3:
console.log('코알라를 선택한 당신, ...');
break;
case 4:
console.log('강아지를 선택한 당신, ...');
break;
default:
console.log('1에서 4사이의 숫자를 선택해 주세요.');
}
//if문
if (myChoice === 1) { // 조건식에서 반드시 등호를 3개 입력해야 함
console.log('토끼를 선택한 당신, ...');
} else if (myChoice === 2) {
console.log('고양이를 선택한 당신, ...');
} else if (myChoice === 3) {
console.log('코알라를 선택한 당신, ...');
} else if (myChoice === 4) {
console.log('강아지를 선택한 당신, ...');
} else {
console.log('1에서 4사이의 숫자를 선택해 주세요.');
}
function checkPrice(grade) {
switch (grade) {
case 'VIP':
동작부분;
break;
case 'R':
동작부분;
break;
case 'S':
동작부분;
break;
case 'A':
동작부분;
break;
default:
동작부분;
}
}
for(초기값; 조건; 가감) {
동작부분;
}
for (let i = 1; i <= 10; i++) { // 이 때 i는 로컬변수!! 블록 밖에서 사용 불가!
console.log(`${i} 코드잇 최고!`);
}
// 추가동작, 초기화 부분 생략 가능
for (let i = 1; i <= 10;) {
console.log(`${i} 코드잇 최고!`);
i++;
}
let i = 1;
for (; i <= 10; i++) {
console.log(`${i} 코드잇 최고!`);
}
for (i = 1; i <= 50; i++) {
console.log(2 * i);
}
function printTriangle(height) {
let message = '';
for (let i = 0; i < height; i++) {
message += '*';
console.log(message);
}
}
// 테스트 코드
console.log('높이: 1');
printTriangle(1);
console.log('높이: 3');
printTriangle(3);
console.log('높이: 5');
printTriangle(5);
while(조건부분) {
동작부분;
}
let previous = 0;
let current = 1;
for (let i = 1; i <= 10; i++) {
console.log(current);
let temp = previous; // previous를 임시 보관소 temp에 저장
previous = current;
current = current + temp; // temp에는 기존 previous 값이 저장돼 있음
}
let codeit = {
속성명: 속성값,
속성명: 속성값,
...
속성명: { // 객체 안의 객체도 생성 가능
속성명: 속성값,
속성명: 속성값,
...
}
}
codeit.속성명codeit[속성명] ← 문자열 속성명의 경우 반드시 이 표기법을 사용해야 함let myVoca = {
// 여기에 코드를 작성하세요
function: '함수',
variable: '변수',
constant: '상수',
local: '지역의',
global: '전반적인'
};
console.log(myVoca);
console.log(myVoca.local);
console.log(myVoca.constant);
console.log(myVoca.function);
codeit.특성명 = "새로운 특성값"처럼 원래 존재하던 특성명으로 접근해서 새 특성값 할당하기codeit.ceo = "김민지" 처럼 원래는 존재하지 않던 특성명으로 접근해서 새 특성값을 할당해주기delete codeit.worstCourse; 처럼 delete 명령어로 삭제하기console.log(codeit.name !== undefined);
console.log('name' in codeit); // 'name': 특성명을 문자열로 표현해야함
let myVoca = {
function: '함수',
variable: '변수',
constant: '상수',
local: '지역의',
global: '전반적인',
};
// 이미 외운 단어 3개를 삭제해 주세요
// 여기에 코드를 작성하세요
delete myVoca.function;
delete myVoca.constant;
delete myVoca.local;
console.log(myVoca);
console.log(myVoca.constant);
// 오늘 외울 단어 4개를 추가해 주세요
// 여기에 코드를 작성하세요
console.log(myVoca);
console.log(myVoca.export);
// 3. default value의 뜻을 출력해 주세요
// 여기에 코드를 작성하세요
greetings.sayHello(); // 함수명: sayHello, 객체명: greetings
greetings['sayHello']();
let myVoca = {
// 여기에 코드를 작성하세요
addVoca: function (key, value) {
myVoca[key] = value;
},
deleteVoca: function (key) {
delete myVoca[key];
},
printVoca: function (key) {
console.log(`"${key}"의 뜻은 "${myVoca[key]}"입니다.`);
},
};
// addVoca메소드 테스트 코드
myVoca.addVoca('parameter', '매개 변수');
myVoca.addVoca('element', '요소');
myVoca.addVoca('property', '속성');
console.log(myVoca);
// deleteVoca메소드 테스트 코드
myVoca.deleteVoca('parameter');
myVoca.deleteVoca('element');
console.log(myVoca);
// printVoca메소드 테스트 코드
myVoca.printVoca('property');
for (let key in codeit){
console.log(key) // 특성명 출력
} // 특성값 출력? codeit[key]
let myObject = {
'2': '알고리즘의 정석',
'3': '컴퓨터 개론',
'1': '자바스크립트 프로그래밍 기초',
};
for (let key in myObject) { // 자바스크립트 프로그래밍 기초
console.log(myObject[key]); // 알고리즘의 정석
} // 컴퓨터 개론
console.log(courseRanking[2])members[5] = "sweetheart" 이런 식으로 객체와 유사하게 추가 가능delete members[4] - 완전한 삭제가 아님splice 메소드를 사용해야 함members.splice(4) : 4번 인덱스의 요소부터 끝까지 쭉 삭제members.splice(삭제할 인덱스, 삭제할 개수, 추가하고자 하는 요소들): 하나만 삭제할거라면 삭제할 개수 = 1로 설정해야 함members.splice(1, 0, "apple", "banana") // 삭제 없이 1번 인덱스 뒤에 요소 두개 삽입 가능
members.splice(1, 2, "apple", "banana") // 2개 삭제
배열의 첫 요소 삭제: 배열명.shift()
배열의 마지막 요소 삭제: 배열명.pop()
배열의 첫 요소로 값 추가: 배열명.unshift(추가할값)
배열의 마지막 요소로 값 추가: 배열명.push(추가할값)
for ... of 반복문: 간결한 코드 작성 가능
for (변수 of 배열){
동작부분;
}
for...in문보다는 for...of 문이 더 안전하고 적합한 방식임
배열명[0][2] - 첫번째 배열의 세번째 원소변환하고자하는수.toFixed(n) 메소드: 소수점 n자리수에서 반올림하거나 0으로 채워서 소수점 n자리로 자릿수를 맞추기변환하고자하는수.toString(n) 메소드: 변환하고자하는수를 n진수로 변환해줌.length indexOf()(앞부터), lastIndexOf()(뒤부터)toUpperCase(), toLowerCase()trim()slice(a, b) - a ~ b-1번 인덱스까지 접근