상세 컨텐츠

본문 제목

프로그래머 도전기 38일차

프로그래머가 될거야!

by Choyee 2023. 10. 6. 23:53

본문

오늘은

오늘은 학원에서 자바에 대한 수업을 거의 마무리하고

데이터 베이스에 대해 새로 배우기 시작하였습니다

그에 따라 새로운 언어인 SQL도 배우게 됐는데

자바나 자바스크립트와는 꽤나 다른점이 많아서

집중을 해서 수업을 들었습니다

 

학원 수업

데이터(data) - 문자, 숫자, 객체, 이미지, 소리, 영상 등
정보(information) - 데이터에 의미나 가치를 부여
지식(knowledge) - 사물이나 현상에 대한 이해

데이터베이스(Database)
- 데이터를 모아놓은 것 (서로 관련된 것- 논리적으로 연관)
                             (메모장에 두서 없이 메모 => 데이터베이스X)
- 학사 관리(수강신청, 성적)를 위해 데이터 저장 => 데이터베이스O
- 은행(계좌정보), 병원(건강보험 데이터베이스)

소프트웨어 엔지니어링(자바 응용프로그램) - 웹, 앱개발자
네트워크 엔지니어링(TCP 채팅) - 네트워크 업무, 보안, 시스템 관리자
DB엔지니어링 - DBA, DB 개발자
UX, UI 엔지니어링 - 웹 프론트 개발자, 웹 퍼블리셔

데이터베이스 관리 시스템(DBMS Database Management System)
- 많은 양의 데이터를 구축, 관리하는소프트웨어
- 데이터 베이스 정의, 갱신, 질의, 보안 기능을 제공
- 주기억장치에서 실행(메모리사용)되며 컴파일러, 질의처리기, 트랜잭션 관리자
- Oracle사 : Oracle(상용), MySQL(상용,무료), MS사 : MSSQL 등

트랜잭션(Transaction) - COMMIT(수행완료), ROLLBACK(복원, 취소)

* Oracle DBMS 설치 - Run Oracle Database 21c XE on Windows
   sID = system     = user(계정)
   sPW = pw1234  = identified

* IDE : sql developer

SQL 언어 
구조적 데이터 질의(Query)언어이다 (=> 객체 지향 언어 아님)
DB(데이터베이스, 스키마(schema)) > 테이블(Table)
=> DDL(데이터 정의어), DML(데이터 조작어), DCL(데이터 제어어)

1. DDL (Data Dfinition Language) -  CREATE(생성), ALTER(변경), DROP(전체삭제 - 테이블 삭제)
CREATE database DB이름;
CREATE table 테이블이름(
   칼럼명  자료형 이름,     // 문자 = VARCHAR2
   킬람먕  지려향 이름      // 숫자 = NUMBER
);

-- 스키마:system
-- 테이블 생성
CREATE TABLE ex1(
    column1 CHAR(10),         -- 고정길이 문자 (10Byte) 
    column2 VARCHAR2(10)      -- 가변길이 문자 (10Byte) 
);


-- 데이터 추가
INSERT INTO ex1(column1, column2) VALUES ('abc', 'abc');   -- "" 사용X '' 사용O
INSERT INTO ex1 VALUES ('당산', '당산');            -- 칼럼 모두에 넣을 때는 생략 가능

-- 데이터 조회
SELECT column1, LENGTH(column1), column2, LENGTH(column2) FROM ex1;

-- 트랜잭션 : COMMIT, ROLLBACK
COMMIT;


- 트랜잭션 : COMMIT, ROLLBACK
INSERT, UPDATE, DELETE를 했을 때는 반드시  COMMIT 해야한다

-- 테이블 생성 (CREATE)
CREATE TABLE ex2 (
    col_date DATE,      -- 날짜 자료형 (시스템의 현재 날짜)
    col_timestamp TIMESTAMP    -- 날짜와 시간 자료형
);

-- 현재 날짜 삽입
INSERT INTO ex2 VALUES (SYSDATE, SYSTIMESTAMP);
INSERT INTO ex2(hire_date) VALUES ('2023-09-01');

COMMIT;

SELECT  *  FROM ex2;

-- 새로운 입사일 칼럼 추가 = 테이블 변경(ALTER)
ALTER TABLE ex2 ADD  hire_date VARCHAR2(20);


-- 테이블 삭제 (DROP)
DROP TABLE ex2;



- 제약조건
기본키 - primary key(중복 허용X), not null 포함O
null 불허 - not null 

-- ex3 테이블 생성
CREATE TABLE ex3(
    col_null    VARCHAR2(10),       -- NULL 허용
    col_not_null    VARCHAR2(10) NOT NULL   -- NULL 불허
);

INSERT INTO ex3 VALUES ('', 'hello');
INSERT INTO ex3 VALUES ('안녕', 'hello');
INSERT INTO ex3 VALUES ('안녕', '');           -- null 에러

COMMIT;

SELECT * FROM ex3;
-- ex4 테이블 생성
CREATE TABLE ex4(
    id VARCHAR2(10) PRIMARY KEY,         -- 기본키 제약조건
    password VARCHAR2(10) NOT NULL
);

INSERT INTO ex4 VALUES ('sky2003', 'u1234');
INSERT INTO ex4 VALUES ('sky2003', 'u54321');   -- 무결성 제약조건 위배
INSERT INTO ex4 VALUES ('todat123', 'u23456', 25);

COMMIT;

-- 나이(age) 칼럼 추가
ALTER TABLE ex4 ADD age NUMBER(3);

SELECT * FROM ex4;


2. DML (Data Manipulation Language) - INSERT(삽입), SELECT(검색), UPDATE(수정), DELETE(데이터 하나 삭제)
데이터 생성, 검색, 수정, 삭제 (CRUD)
생성(추가) - INSERT INTO 테이블이름 VALUES();
검색 - SELECT 칼럼명 FROM 테이블이름

데이터 모델(Model)
- 계층형 모델
- 네트워크형 모델
- 관계형 모델(현재 가장 많이 사용) : RDBMS(Relation DBMS) = 테이블 형태
- 객체-관계형 모델(관계 + 객체)
- 객체형 모델(현재 개발 실패)

 

 

 

JavaScript 공부

<구조 분해>
배열이나 객체에 적용 가능
해체해서 별개의 변수 형태로 만들 수 있음

* 배열 분해

const scores = [99, 94, 85, 89, 79, 75, 68];
// 1위와 2위 점수를 따로 꺼내서 보상을 주고 나머지는 별개의 변수로 분리
const highScore = scores[0];
const secondHighScore = scores[1];
// 분해 이용
const [gold, silver, ...everyoneElse] = scores;
=> gold => 99
     silver => 94
// 점수에 영향X = 배열에서 점수를 지워서 값을 꺼내는 것이 아님
// 개별 변수에 점수를 복사해 쓰는 것 => 계속 덧붙이기 가능 gold, silver, bronze ...



* 객체 분해
순서를 따르지 않거 값을 꺼낼 수 있기 때문에 배열 구조 분해보다 실용적이다

const user = {
     email: 'harvey@gamil.com',
     password: 'sCoTt1948sMiTh',
     firstName: 'Harvey',
     lastName: 'Milk',
     born: 1930,
     died: 1978,
     bio: 'Harvey Bernard Milk was an American politician and th first openly',
     city: 'San Francisco',
     state: 'California'
}

const firstName = user.firstName;
const lastName = user.lastName;
const email = user.email;
// 일일이 작성하려면 매우 귀찮음

// 구조 분해 구문 이용
const { email, firstName, lastName, city, bio} = user;
const { born: birthYear } = user;  // 변수가 born에서 birthYear로 된다

// 디폴트 값 추가
const user2 = {
     email: 'harvey@gamil.com',
     firstName: 'Stacy',
     lastName: 'Gonzlez',
     born: 1987,
     city: 'Tulsa',
     state: 'Oklahoma'
}

const { city, state, died } = user2; // died 값이 없기 때문에 undefined가 나온다
// 이럴 때 디폴트 값을 주려면  = 를 입력해서 died 값이 없으면 N/A가 뜨도록 해주면 된다
const { city, state, died = 'N/A' } = user2;
// 첫번째 user에 대해서 디폴트 값을 주어도 died에 이미 값이 있기 때문에
// N/A가 뜨지 않고 값이 제대로 출력된다



* 매개변수 분해 
함수를 정의할 때 괄호 안에 매개변수를 작성하면 
전달되는 값의 구조를 분해할 수 있다
= 객체에 주로 사용되는 방법

function fullName(user) {
     return `${user.firstName} ${user.lastName}`
}

// 구조 분해로 같은 값 만들기
function fullName(user) {
     cont { firstName, lastName } = user;
     return `${firstName} ${lastName}`
}  // 매개변수를 자주 사용할 경우 이렇게 작성하는 것이 좋다

// 이름 정보만 필요한 경우
function fullName({ firstName, lastName }) {
      return `${firstName} ${lastName}`
}



 

Coding Test Practice
Description
머쓱이는 친구들과 369게임을 하고 있습니다. 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. 머쓱이가 말해야하는 숫자 order가 매개변수로 주어질 때, 머쓱이가 쳐야할 박수 횟수를 return 하도록 solution 함수를 완성해보세요.
function solution(order) {
    var answer = [];
    var ord = String(order);
    for(var i = 0; i < ord.length; i++){
        if(ord[i] == 3 || ord[i] == 6 || ord[i] == 9){
            answer += ord[i];
        }
    }
    return answer.length;
}

 

 

 

Description
정수 num과 k가 매개변수로 주어질 때, num을 이루는 숫자 중에 k가 있으면 num의 그 숫자가 있는 자리 수를 return하고 없으면 -1을 return 하도록 solution 함수를 완성해보세요.
function solution(num, k) {
    var answer = 0;
    var str = String(num)
    if (str.indexOf(k,0) >= 0){
        return (str.indexOf(k,0) + 1)
    } 
    if(str.indexOf(k,0) < 0){
        return str.indexOf(k,0)
    }
}

 

 

 

Description
영어 대소문자로 이루어진 문자열 my_string이 매개변수로 주어질 때, my_string을 모두 소문자로 바꾸고 알파벳 순서대로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요.
function solution(my_string) {
    var answer = my_string.toLowerCase().split('')
    return answer.sort().join('');
}

toLowerCase() = 문자열 소문자로
split() = 문자열을 배열로
sort() = 배열 알파벳 순으로 정렬
join() = 배열을 문자열로

문자열과 배열의 차이로 인한 메서드 선택을 잘 해주어야 했던 문제

 

 

Description
음이 아닌 정수를 9로 나눈 나머지는 그 정수의 각 자리 숫자의 합을 9로 나눈 나머지와 같은 것이 알려져 있습니다. 이 사실을 이용하여 음이 아닌 정수가 문자열 number로 주어질 때, 이 정수를 9로 나눈 나머지를 return 하는 solution 함수를 작성해주세요.
function solution(number) {
    var sum = 0;
    for(var i = 0; i < number.length; i++){
        sum += Number(number[i]);
    }
    return sum % 9;
}

수학적 지식이 늘어난 것 같은 문제

 

 

Description
약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.
function solution(n) {
    var answer = [];
   
    for(var i = 2; i <= n; i++){
        var yaksoo = [];
        for(var j = 1; j <= i; j++){
            if( i % j == 0){
                yaksoo.push(j)
            }
        }
         if(yaksoo.length > 2){
              answer.push(i);
        }
    }return answer.length;
}

// 1,2,3,4,5,6,7,8,9,10
// 1,2,4 = 4
// 1,2,3,6 = 6
// 1,2,4,8 = 8
// 1,3,9 = 9
// 1,2,5,10 = 10;

yaksoo 변수의 선언 위치를 헤매어서 굉장히 고심했던 문제

yaksoo 변수를 첫번째 for문 안에 선언해주어야
두번째 for문에서 나온 약수정보가 전부 누적되지 않고
i값이 바뀔 때마다 초기화하여 다시 계산할 수 있도록 해준다

 

 

 

 

2023. 10. 06. (금)

관련글 더보기