Archive

2020-12-19 TIL

|

2020-12-19 TIL


  • 오늘 한 것
    1. 객체 응용문제 풀이 - vector를 활용해서 회원가입, 삭제, 수정이 가능한 회원관리 시스템을 만들었다. 수정, 삭제하고 싶은 vector 안의 객체의 멤버변수에 어떻게 접근할지 고민을 많이 했다. 2시간~3시간 걸렸나… 아주 간단한 프로그램이지만 만들고나니 뿌듯.

    2. 블로그 포스팅 (javascript Day5) - this……자바에서 쓰이는 this와 개념적으로 달라서 처음에 많이 헤맸다. 지금 자바에 너무 익숙해져있어서 그런가? 자바스크립트 연습문제도 많이 풀어서 얼른 적응해야겠다.

    3. Javascript30 Tutorial Day 29 - Countdown Timer를 만들었다. 입력시간에 setInterval로 1초마다 현재시간만큼 빼서 남은 시간을 계산한다. 그것을 분, 초 단위로 계산해서 화면에 보여준다. 이 이벤트를 버튼에 걸어서 버튼의 입력시간만큼 계산하는 타이머를 구현한다. 또, 사용자가 직접 입력을 할 수도 있다. Date 클래스와 setInterval 메소드를 활용하는 방법을 배웠다.


  • 내일 할 것
    1. 객체 응용문제 풀이(feat.주말숙제)
    2. Javascript30 Tutorial Day 30
    3. 블로그 포스팅 (Javascript Day 6)

  • 끝으로

내일은 하루종일 숙제만 해야겠군.

오늘의 한 줄 총평 : 숙제폭탄


JS Day 5 객체복사,this,생성자함수

|

JS Day 5 객체복사,this,생성자함수


  1. 객체 복사

    • 객체는 원시타입과 다르게 참조된 주소값을 저장하고 있다는 것을 알고 있다.
    • 객체 A가 있다치면 동일한 프로퍼티를 갖는 객체 B를 복사해서 만들고 싶다면 Object.assign 메소드를 사용한다.
    /*
    *	Object.assign(dest, src1, src2 ...);
    *	대상이 되는 dest에 src1, src2 객체의 프로퍼티를 복사한다
    *	동명의 프로퍼티가 있을 경우 기존 값에 덮어씌운다
    */
       
    const zoo = {
        rabbit : 9,
        fox : 4,
        mouse : 2
    };
    const clone = Object.assign({}, zoo);
    //clone = {rabbit: 9, fox: 4, mouse: 2}
    
    • 하지만, 목표 객체의 프로퍼티가 원시값이 아닌 객체라면 다시말해, 객체 안에 객체가 있을 경우에는 Object.assign()으로 복사 할 수 없다.
    • 그런 경우에는 lodash 라이브러리의 _.cloneDeep() 메소드를 이용하자.


  2. Arrow Function에서의 ‘this’

    • arrow function의 this는 상위 scope의 this를 가리킨다.
    • 객체 안에 함수를 정의 할 때(scope가 여러 단으로 나뉠때) function()으로 정의하는 것과 arrow function으로 정의하는 것에는 큰 차이가 있다.
    //how 1.
    const nowTime = {
        hour : 12,
        sayHour() {
            let notArrow = function(){
                console.log(this.hour);
            }//.bind(this);
            notArrow();
        }
    };
    nowTime.sayHour(); //undefined 출력
       
    //how 2.
    const nowTime = {
        hour : 12,
        sayHour() {
            let Arrow = () => console.log(this.hour);
            Arrow();
        }
    };
    nowTime.sayHour(); //12 출력
    
    • how2에서 arrow function의 this가 외부의 컨텍스트에서 this값을 가져온 것을 확인 할 수 있다. how1에서 같은 효과를 얻으려면 함수의 뒤에 .bind(this)를 붙여서 바인딩을 해주면 된다.


  3. 생성자 함수

    • 코드를 재사용하기 위해 함수를 생성자처럼 이용 할 수 있다.
    • 함수의 첫 글자는 대문자로 시작하고 new 연산자로 사용한다
    • 모든 함수가 생성자 함수가 될 수 있다.
    function Animal(name, kind) {
        this.name = name;
        this.kind = kind;
    }
    let fox = new Animal("foo", "fox");
       
    console.log(fox.name); //foo 출력
    console.log(fox.kind); //fox 출력
    
    • 생성자 함수 내에 메소드를 정의하여 유연한 코딩을 할 수도 있다.
    function Animal(name) {
        this.name = name;
        this.eat = () => console.log(this.name+"가 먹이를 먹습니다");
    }
    let foo = new Animal("foo");
       
    foo.eat(); //'foo가 먹이를 먹습니다' 출력
    




참고 자료


JAVASCRIPT.INFO

2020-12-18 TIL

|

2020-12-18 TIL


  • 오늘 한 것
    1. 이것이 리눅스다 Chapter 11 데이터베이스 서버 구축과 운영 - 어제 만든 Server의 MariaDB에 DB를 생성하여 테이블과 레코드를 만들어 넣어보았다. 이것이 데이터베이스인가…! Server의 MariaDB와 Client의 Visual Studio를 연동하는 방법도 배웠다.

    2. 학원 비대면 수업 (여러가지 클래스들) - String과 관련된 클래스, Calendar, Math, Vector 등등을 배웠다. 뭐가 이리 많은것인지…

    3. 블로그 포스팅 (java day14 정리, Linux/CentOS MariaDB)

    4. Javascript30 Tutorial Day 28 - UI로 video 재생속도를 조절하는 방법을 배웠다. 세로 형태의 UI길이를 계산해서 video 속도에 대입하는 것. 좌표계산만 잘 하고 어떻게 더하고 뺄지만 좀 고민해보면 만들 수 있는 간단(?)한 튜토리얼이었다.


  • 내일 할 것
    1. 객체 응용문제 풀이(feat.주말숙제)
    2. Javascript30 Tutorial Day 29
    3. 블로그 포스팅 (Javascript Day 4)
    4. 가족행사

  • 끝으로

제어문,조건문까지는 할만했는데 객체지향으로 넘어오면서 슬슬 어려워지고 있다. 복습하자…

오늘의 한 줄 총평 : 구름 위로 둥둥~


CentOS8 MariaDB 운영,Visual Studio 연동

|

CentOS8 MariaDB 운영,Visual Studio 연동


이것이 리눅스다 의 Chapter11 데이터베이스 서버 구축과 운영의 실습내용입니다.



앞의 실습에서 구축한 MariaDB를 실제로 운영해보자.

Client 컴퓨터로 Server 컴퓨터의 MariaDB에 접속한다.

create database (이름) character set utf8; 로 데이터베이스를 생성한다.

뒤에 character set utf8은 한글 입출력을 위해 넣었는데 MariaDB version에 따라 생략해도 된다고 한다.

show databases;로 데이터베이스가 정상적으로 생성되었나 확인한다.

DB생성

여기 있는 database들은 하나의 디렉토리라고 한다. 실제로 server의 /var/lib/mysql/에서 리스트를 확인해보면 디렉토리로 존재하고 있음을 알 수 있다.


varchar와 char의 차이는 가변길이를 지원하느냐이다. varchar(10)으로 10바이트의 길이를 정해도 실제로 3바이트만 썼다면 3바이트만 소비된다. 고정길이 문자열인 char(10)는 10바이트를 무조건 확보 한 후 3바이트만 썼다면 나머지 7바이트는 버리는 셈이 된다.


이제 데이터베이스 안에 테이블을 생성하자.

use (데이터베이스명);

create table (테이블명) (

(필드명) (타입) (null값 허용?) (key) (default) (기타..)

(필드명) (타입) (null값 허용?) (key) (default) (기타..)

);

null값을 허용하지 않는다면 ‘no null’, 안적으면 yes가 default 값이다.

id, no 등 고유한 값을 가지는 key값을 ‘primary key’로 지정 할 수 있다.

extra는 말 그대로 기타 사항인데 ‘auto_icrement’는 자동으로 값이 증가한다는 말.

no에 저것을 적으면 데이터를 넣을때마다 1, 2, 3 등 순차적으로 순번이 붙는다.

테이블생성


desc (테이블명); 명령어로 작업내용을 확인하자.

테이블확인


이제 실제로 테이블에 레코드를 너어보쟈~

insert into (테이블명) values (필드1, 필드2, 필드3…); 필드에 넣을 문자열은 ‘‘으로 감싸자.

레코드를 모두 넣었다면 select * from (테이블명); 으로 확인 할 수 있다.

레코드추가

짜쟌~😀



이제 Visual Studio와 MariaDB를 연동해보쟈~

교재와 같은 실습환경을 구축하기위해 visual studio 2015를 설치한다.

다른 tool은 사용하지 않으므로 web developer tools만 선택한다.

VS설치


설치가 시간이 조금 걸린다…거의 한 8기가는 잡아먹은듯

설치가 끝났으면 Visual Studio와 MariaDB를 연결해주는 ODBC(Open DataBase Connetivity)를 설치하자. 이 역시 교재와 같은 버전으로 하기 위해 8.0.18을 설치하였다.

(dev.mysql.com/downloads/connector/odbc)에서 다운로드를 받자

다운로드


[제어판]의 [시스템 및 보안]에서 [관리도구]에 들어가면 ODBC 데이터 원본을 볼 수 있다

ODBC원본


[시스템DNS] 탭에서 추가를 눌러 MySQL ODBC 8.0 Unicode Driver를 선택하고 마치면

Connector/ODBC 창이 뜨는데 적당한 이름을 넣고 TCP/IP란에 MariaDB가 설치된 server 컴퓨터의 IP주소를 넣는다. server에서 생성해준 user ID와 Password를 넣고 해당 데이터베이스를 선택 한 뒤 마친다.

시스템DNS설정

커넥터설정


Visual Studio를 키고 웹사이트를 새로 만들고 ASP.NET 빈 웹사이트를 설정 한 뒤 확인.

오른쪽 솔루션 탐색기창의 [WebSite1] 우클릭 후 [추가]-[웹폼]을 클릭하여 default이름 그대로 확인.

웹폼


왼쪽 아래에서 [디자인]모드로 변경하고 [도구상자]를 열어 데이터의 SqlDataSource를 가져온다

SDS


[데이터 소스 구성]에서 새 연결로 Microsoft ODBC 데이터 소스를 선택하고 앞서 만든 사용자로 설정하고 로그인 정보를 입력한다. [연결 테스트]에서 성공하였다면 성.공.적

연결추가

[Select 문 구성]에서 사용자 지정으로 설정 한 뒤 select * from (테이블명)을 작성하고 넘어가면 [쿼리테스트]를 할 수 있다. 아래와 같이 나온다면 성.공.적.

쿼리테스트


다시 [도구상자]에서 [데이터]-[ListView]를 가져와서 데이터 소스 선택 후 [ListView 구성]을 누른다.

리스트뷰


적절한 레이아웃과 스타일을 고르자.

브라우저 보기 (Ctrl+Shift+W)로 확인을 해보면~~

짜쟌~🤩

외부에서도 DB서버의 정보를 볼 수 있는 웹브라우저를 만들었다.



참고자료


이것이 리눅스다 Chepter 11 데이버베이스 서버 구축과 운영

Java Day 14 여러가지 클래스들

|

Java Day 14 여러가지 클래스들


  1. String 클래스

    • ① 암묵적 객체 생성 : String s1 = “TEST”;
    • ② 명시적 객체 생성 : String s2 = new String(“TEST”);
    • 무엇이 다를까?
    • 1번으로 같은 값을 가진 여러 객체를 생성했다고 하자. 값이 같기 때문에 각각의 객체들은 같은 주소값으로 registry & constant 영역의 값을 참조하고 있다.
    • 동일하게 2번으로 여러 객체를 생성했을 경우, 값이 같아도 각각 다른 주소로 heap영역의 값이 담긴 번지수를 참조하고 있다.
    • 코드로 확인을 해보자
    String s1 = "foo";
    String s2 = "foo";
    String s3 = new String("foo");
    String s4 = new String("foo");
       
    System.out.println(s1==s2); //true
    System.out.println(s3==s4); //false
    //문자열 비교 메소드
    System.out.println(s3.equals(s4)); //true
    
    • 이처럼 값이 같다하더라도 다른 결과가 나올 수 있다.
    • 문자열의 값을 비교하고 싶을때는 equals() 메소드를 활용하자.
    • 그 밖의 String 클래스의 메소드들
    String str = "java";
    System.out.println(str.charAt(3)); //a 출력, 해당 인덱스의 문자 반환
    System.out.println(str.length()); //4 출력
    System.out.println(str.toUpperCase()); //str을 대문자로 변환, 반대는 toLowerCase()
    String num = String.valueOf(123); //숫자를 문자열로 변환
    System.out.println(str.indexOf('a')); //1 출력, 해당 문자가 위치한 첫번째 인덱스값
    System.out.println(str.lastIndexOf('a')); //3 출력, 해당 문자를 뒤에서부터 검색
    System.out.println(str.substring(1,3)); //av 출력, 문자열의 시작점과 종료점-1까지 반환
    


  2. StringBuffer, StringBulider 클래스

    • String 객체의 문자열은 수정을 할 수 없다. 새로운 값을 더해도 기존의 객체를 수정하는 개념이 아니라 새로운 객체를 만들어 참조하는 것이다. 기존의 객체는 참조가 끊기고 JVM의 Garbage Collector에 의해 수거되어 메모리에서 삭제된다. 그럼 뭐가 문제인가?
    • 하나의 문자열객체에 +로 계속 이어붙이게되면 heap영역에 참조할 객체를 계속해서 생성해야하기 때문에 성능면에서 떨어질 수 밖에 없다.
    • StringBuffer, StringBulider 클래스는 내부 buffer에 임시로 문자열을 저장해두고 얼마든지 추가,수정,삭제가 가능하다. 주로 문자열의 변경이 잦을때 사용한다.
    • 그렇다면 두 클래스의 차이는 무엇일까? 멀티쓰레드 환경에서 synchronized를 지원하느냐이다. 결론적으로 StringBuffer는 멀티쓰레드 환경에서 적합하고 StringBuilder는 싱글쓰레드 환경에서 적합하다. 아직 쓰레드는 배우지 않았으므로 이렇게만 알아두자.
    • 두 클래스의 사용법은 동일하므로 여기선 StringBuffer를 사용한다.
    /*
    * 초기값으로 16개의 문자를 저장 할 수 있다
    * 숫자를 넣으면 숫자만큼 크기가 늘어난다
    * 문자열을 넣으면 문자열을 초기값으로 갖고 +16개의 문자를 더 저장 할 수 있다
    * 용량이 부족하면 자동으로 버퍼 크기가 늘어난다
    */
    StringBuffer sb = new StringBuffer();
    StringBuffer sb = new StringBuffer(30);
    StringBuffer sb = new StringBuffer("Hello");
    


    /*
    * append( Stirng str ) : 문자열 끝에 문자를 붙여준다
    * insert( int offset, String str ) : offset index에 문자열을 삽입한다 
    * delete( int start, int end ) : start부터 end-1의 문자열을 삭제한다
    * deleteCharAt( int index ) : 문자열에서 index의 문자를 삭제
    * replace( int start, in end, String str ) : start와 end-1의 문자열을 str로 치환
    * reverse() : 문자열의 순서를 뒤집는다
    * toString() : Buffer가 가지고 있는 문자열을 String형으로 반환
    */
       
    StringBuffer sb = new StringBuffer("Hello World!");
    sb.append(" I'm foo"); //'Hello World! I'm foo' 출력
    sb.delete(17,20); //'Hello World! I'm' 출력
    sb.insert(17, "panda"); //'Hello World! I'm panda' 출력
    sb.replace(17,22,"limu"); //'Hello World! I'm limu' 출력
    


  3. StringTokenizer 클래스

    • java.util 패키지에 포함
    • 문자열이 한 종류의 구분자(delimiter)로 연결되어 있을 때, 문자열(token)을 분리
    • ex) “2020/01/03” ——> “2020”, “01”, “03”으로 분리
    /*
    * 1. 생성자
    * StringTokenizer(String str) : 구분자 미표기시, white space, tab, new line으로 분할
    * StringTokenizer(String str, String delimiter) : delimiter로 str을 분할
    * StringTokenizer(String str, String delimiter, boolean isAsset) : 분할 할 때 isAsset으로 구분자를 토큰에 넣을지말지 결정
    *
    * 2. 메소드
    * hasMoreTokens() : 토큰이 있으면 true, 없으면 false 반환
    * countTokens() : 전체 토큰 수 반환
    * nextToken() : 토큰을 하나씩 꺼내옴
    */
       
    String text1 = "2020/12/18";
    String text2 = "안녕 나는 리무야";
       
    //countTokens()를 이용한 방법
    StringTokenizer st1 = new StringTokenizer(text1, "/");
    int count = st1.countTokens();
    for(int i=0; i<count; i++){
        String token1 = st1.nextToken();
        System.out.println(token1);
    }//"2020", "12", "18" 출력
       
    //hasMoreTokens()를 이용한 방법
    StringTokenizer st2 = new StringTokenizer(text2);
    while(st2.hasMoreTokens()) {
        String token2 = st2.nextTokens();
        System.out.println(token2);
    }//"안녕", "나는", "리무야" 출력
    


    • spilt() 메소드와 StringTokenizer의 차이
    • split() 메소드는 공백도 count를 하지만 StringTokenizer는 무시한다
    • ex) “monkey,rabbit,,fox”의 문자열이 있다고 가정하자
    • split을 사용하면 “monkey”, “rabbit”, “”, “fox” 를 반환한다
    • 반면, StringTokenizer는 “monkey”, “rabbit”, “fox”를 반환한다


  4. Date, Calendar 클래스

    • java.util 패키지에 포함
    • Date()는 현재 날짜를 영문으로 반환한다
    • Calendar 클래스는 추상클래스이므로 new 연산자로 인스턴스를 생성 할 수 없다
    /*
    * 1. Date 클래스
    */
    Date date = new Date();
    String now = date.toString();
    System.out.println(now); //영문 날짜 출력
       
    /*
    * 2. Calendar 클래스
    * Calendar.getInstance() 메소드로 Calendar 객체를 불러온다
    * YEAR,MONTH,DATE,HOUR,MINUTE 등의 날짜정보를 get() 메소드로 가져온다
    * 반대로 set() 메소드로 설정을 할 수도 있다
    */
    Calendar now = Calendar.getInstance();
    int year = now.get(Calendar.YEAR); //년도
    int month = now.get(Calendar.MONTH); //월
    int date = now.get(Calendar.DATE); //일
    


  5. Vector 클래스

    • java.util 패키지에 포함
    • Vector 클래스는 객체의 주소값을 저장하는 가변 길이의 배열이다
    • 배열의 중간이 비면 뒤에서 땡겨오고 마찬가지로 추가되면 뒤로 한 칸씩 밀린다
    class Num {
        int a;
        num(int a){
            this.a = a;
        }
    }
    //main 함수
    Vector vc = new Vector();
    vc.add(new Num(1));
    vc.add(new Num(2));
    vc.add(new Num(3));
    vc.add(new Num(4));
    vc.add(new Num(5));
    vc.add(1, new Num(10)); //index 1에 new Num(10) 저장
    for(int i=0; i<vc.size(); i++){
        Num number = (Num)vc.elementAt(i);
        System.out.print(number.a);
    }//1,10,2,3,4,5 출력
    




참고 자료


이것이자바다

자바프로그래밍100% 실전가이드

KG아이티뱅크 자바 강의자료