[CH6. 객체지향프로그래밍1 ] 변수의 초기화

6. 변수의 초기화

6.1 변수의 초기화

변수를 선언하고 처읍으로 값을 저장하는것.
가능하면 선언과 동시에 초기화 하는게 바람직.

  • 멤버변수(클래스변수와 인스턴스 변수)와 배열의 초기화는 선택적이지만,
    지역변수는 반드시 초기화 후 사용해야함.

멤버변수 추기화 방법

  1. 명시적 초기화
  2. 생성자
  3. 초기화 블럭
    • 인스턴스 초기화 블럭: 인스턴스변수를 초기화 하는데 사용
    • 클래스 초기화 블럭: 클래스를 초기화 하는데 사용

6.2 명시적 초기화

변수 선언과 동시에 초기화 하는것

1
2
3
4
class Car{
int door= 4; //기본형 변수 초기화
Engine = new Engine(); // 참조형 변수 초기화
}

6. 3 초기화 블럭

  • 초기화 블럭 - 클래스변수의 복잡한 초기화에 사용
  • 인스턴스 초기화 블럭 - 인스턴스 변수의 복잡한 초기화에 사용
1
2
3
4
class InitBlock{
static{/* 클래스 초기화 블럭*/}
{/*인스턴스 초기화 블럭 */}
}

클래스 초기화 블럭은 클래스가 메모리에 올라가 갈 때 한번만 수행.
인스턴스 초기화는 인스턴스 생성될때 생성자보다 먼저 수행됨.

1
2
3
4
5
6
7
8
9
10
Car(){
System.out.println("Car인스턴스가 생성되었습니다.");
color= "withe";
gearType="auto";
}
Car(String color, String gearType){
System.out.println("Car인스턴스가 생성되었습니다.");
this.color= color;
this.gearType=gearType;
}

동일한 “Car인스턴스가 생성되었습니다.” 처리를 인스턴스 블럭으로 아래와 같이 처리

1
2
3
4
5
6
7
8
9
10
{ System.out.println("Car인스턴스가 생성되었습니다."); }

Car(){
color= "withe";
gearType="auto";
}
Car(String color, String gearType){
this.color= color;
this.gearType=gearType;
}

6.4 멤버변수의 초기화 시기와 순서

  • 클래스 변수 초기화 시점 - 클래스가 처음 로딩될 때 한번 초기화
  • 인스턴스 변수의 초기화 시점 - 인스턴스가 생성될 때마다 각 인스턴스별로 초기화 이루어짐

  • 클래스 변수 초기화 순서 : 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭

  • 인스턴스 변수 초기화 순서 : 기본값 -> 명시적 초기화 -> 인스턴스초기화 블럭 -> 생성자
1
2
3
4
5
6
7
8
9
10
11
class Product{
static int count =0; //생성된 인스턴스 수를 저장하기 위한 변수
int serialNo; //인스턴스 고유 번호

{
++count;
serialNo = count; // Product인스턴스가 생성될 때마다 count 값을 1증가시켜 serialNo에 저장
}

public product(){}
}

[CH7. 객체지향프로그래밍2] 상속

1. 상속

1.1 상속의 정의와 장점

기존의 클래스를 재사용하여 새로운 클래스를 작성하는것

1
2
class Parent{}
class Child extends Parent{}
  • 조상클래스 - 부모클래스, 상위클래스, 기반 클래스
  • 자손클래스 - 자식 클래스, 하위클래스, 파생된 클래스
  • 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
  • 자손 클래스의 멤버개수는 조상 클래스보다 항상 같거나 많다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Tv{
boolean power;
int channel;

void power(){power = !power;}
void channelUp(){++chnannel;}
void channelDown(){--channel;}
}

class CaptionTv extends Tv{
boolean caption;
void displayCaption(String text){
if(caption){
system.out.println(text);
}
}
}

1.2 클래스간의 관계 - 포함관계

1
2
3
4
5
class Circle{
int x;
int y;
int r;
}

이 클래스를

1
2
3
4
5
6
7
8
9
class Point{
int x;
int y;
}

class Circle{
Point point = new Point();
int r;
}

이렇게 표현할 수 있다.
Engine, Door 클래스를 미리 작성 후 아래와 같이 사용 가능.

1
2
3
4
class car{
Engine e = new Engine();
Door[] d = new Door[4];
}

1.3 클래스간 관계 결정하기

어떨때 상속, 어떨때 포함관계를 맺을까?

  • 상속: ~은 ~이다(is-a)
  • 포함 : ~은 ~을 가지고 있다(has-a)

ex) 원은 점(point)이다 (X)
원은 점을 가지고 있다(O) -> 포함관계
SportCar는 Car이다(0) -> 상속 관계

1.4 단일 상속

부모클래스를 두개 이상 상속 받을 수 없다.

1
2
3
4
//불가능한 경우
calss TVCR extends TV, VCR{

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Tv{
boolean power;
int channel;

void power(){power = !power;}
void channelUp(){++chnannel;}
void channelDown(){--channel;}
}

class VCR{
boolean power;
int counter =0;
void power(){};
void play(){};
void stop(){};
void rew(){};
void ff(){};
}

class TVCR extends Tv{
VCR vcr = new VCR();
int counter =vcr.counter;

void play(){
vcr.play();
};
void stop(){
vcr.stop();
};
void rew(){
vcr.rew();
};
void ff(){
vcr.ff();
};

1.5 Object클래스 -모든 클래스의 조상

Object는 모든 클래스의 조상이다.

1
class Tv{}

이것은 따지고 보면

1
class Tv extends Object{}

이것임.
toString(), equals() 그냥 쓸 수 있는게 Object클래스에 정의 되어있어서 그렇다.

[CH6. 객체지향프로그래밍1] 오버로딩

4. 메서드 오버로딩

4.1 메서드 오버로딩이란?

한 클래스 내에 같은 이름의 메서드를 매개변수를 다르게 해서 여러개 정의 하는것.

4.2 오버로딩의 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.

4.3 오버로딩의 예

1
2
3
4
5
6
7
8
9
10
void println();
void println(booleand x);
void println(char x);
void println(char[] x);
void println(double x);
void println(float x);
void println(int x);
void println(long x);
void println(String x);
void println(Object x);
  • 매개 변수의 타입과 개수가 같아서 오버로딩 성립 안하는 예

    1
    2
    int add(int a, int b){ return a+b;}
    int add(int x, int y){ return x+y;}
  • 리턴 타입만 다른 경우 오버라이딩 성립 안함

    1
    2
    int add(int a, int b){ return a+b;}
    int add(int a, int b){ return (long) a+b;}
    • 같은 매개변수를 순서만 바꿔서 작성하면 오버로딩이지만 헷갈리는 좋지 않은 방법
      1
      2
      int add(int a, long b){ return a+b;}
      int add(long a, int b){ return a+b;}

4.4 오버로딩의 장점

  • 동일 기능의 메서드가 하나의 이름으로 정의될 수 있음
  • 메서드 이름 절약가능

5. 생성자(Constructor)

5.1 생성자란?

인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드

  1. 생성자의 이름은 클래스의 이름과 같아야함
  2. 생성자는 리턴 값이 없음
  • new 연산자가 인스턴스를 생성하는것이지, 생성자가 인스턴스를 생성하는것은 아님

5.2 기본 생성자(default constructor)

생성자를 안 만들어도 컴파일러가 기본으로 생성자 하나 만들어줌.
publid 클래스이름(){};

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Data1{
int value;
}

class Data2{
int value;

Data2(int x){
value = x;
}
}

class ConstructorTest {
public stataic void main(String[] args){
Data1 d1 = new Data1();
//컴파일 에러 발생
Data2 d2 = new Data2();
Data2 d2 = new Data2(int 1);
}
}

5.3 매개변수가 있는 생성자

인스턴스 생성할때 초기값을 넣어 초기화 할 수 있음

1
2
3
4
5
6
7
8
9
10
11
12
class Car{
String color;
String gearType;
int door;

Car(){}
Car(String c, String g, int d){
color= c;
gearType = g;
door =d;
}
}

이렇게 사용하면 됨

1
Car c = new Car("white", "auto", 4};

5.4 생성자에서 다른 생성자 호출하기 - this(), this

같은 클래스 내에서 생성자도 아래 조건을 만족 할 경우 서로 호출이 가능함

  • 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
  • 한 생성자엥서 다른 생성자를 호출할 때는 반드시 첫줄에서만 호출이 가능하다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class Car{
    String color;
    String gearType;
    int door;

    Car(){
    this("white", "auto", 4);
    }

    Car(String color){
    this(color, "auto", 4}

    Car(String color, String gearType, int door){
    this.color= color;
    this.gearType = gearType;
    this.door =door;
    }
    }
  • this - 인스턴스 자신을 가리키느 ㄴ참조변수, 인스턴스의 주소가 저장되어있다.
    모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.

    • this.(), this(매개변수) - 생성자, 같은 클래스의 다른 생성자를 호출 할 때 사용한다.

5.5 생성자를 이용한 인스턴스 복사

동일한 현재 상태를 갖는 인트턴스 하나 더 생성할때 생성자를 사용함.
어떤 상태인지 자세히 몰라도 똑같은 인스턴스 새로 추가 가능.

1
2
3
4
5
Car(Car c){
color= c.color;
gearType = c.gearType;
door =c.door;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Car{
String color;
String gearType;
int door;

Car(){
this("white", "auto", 4);
}

Car(Car c){
color= c.color;
gearType = c.gearType;
door =c.door;
}
Car(String color){
this(color, "auto", 4}

Car(String color, String gearType, int door){
this.color= color;
this.gearType = gearType;
this.door =door;
}
}

*** 인스턴스를 생성할 때는 아래 두가지 사항을 결정해야함

  1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
  2. 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할것인가?

[CH6. 객체지향프로그래밍1] 변수와 메서드

3. 변수와 매서드

3.1 선언위치에 따른 변수의 종류

변수의 종류 선언위치 생성시기
클래스변수 클래스 영역 클래스가 메모리에 올라갔을 때
인스턴스 변수 클래스 영역 인스턴스가 생성되었을때
지역변수 클래스 영역 이외의 영역 (메서드, 생성자, 초기화 블럭 내부) 변수 선언문이 수행되었을때
1
2
3
4
5
6
7
8
class Variables{
int iv; //인스턴스 변수
static int cv; //클래스 변수(static 변수, 공유변수)

void method(){
int iv; // 지역변수
}
}
  1. 인스턴스 변수
    • 클래스 영역에 선언, 인스턴스 생성때 만들어짐
  2. 클래스 변수
    • 인스턴스 앞에 static을 붙임.
      한 클래스의 모든 인스턴스들이 공통적 값을 유지해야 되는 경우 사용.
      public을 붙이면 프로그램 내 전역에서 사용가능
  3. 지역 변수
    • 매서드 내 선언. 메서드 내에서만 사용가능. 메서드 종료시 소멸.

3.2 클래스변수와 인스턴스 변수

1
2
3
4
5
6
 class Card {
String kind; // 카드 무늬 - 인스턴스변수
int number; // 카드 숫자 - 인스턴스 변수
static int width = 100; // 카드 폭 - 클래스 변수
static int height = 250; //카드 높이 -클래스 변수
}

인스턴스 변수는 인스턴스가 생성될 때마다 각기 다른 값을 유지,
클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유해서 항상 공통된 값 가짐

3.3 메서드

  • 하나의 메서드는 되도록 하나의 기능만 수행하도록 하는것이 좋다.
  • 반복적으로 수행되야 하는 여러 문장을 하나의 메서드로 정의해놓으면 좋다
  • 관련된 여러 문장을 하나의 메서드로 만들어 놓는 것이 좋다.

3.4 return 문

  • 메서드가 정상적으로 종료되는 경우
    1. 메서드의 블럭{}내의 마지막 문장을 수행했을 때
    2. 메서드의 블럭{}내에 있는 문장을 수행중 return 문을 만났을때.
  • return 문은 실행중인 메서드를 종료 후 호출 메서드로 되돌아감
    1. 반환값이 없는 경우 : return;
    2. 반환값이 있는 경우 : return 반환값;

3.5 메서드의 호출

참조변수.메서드이름();
참소변수.메서드이름(값1, 값2, ..);

3.6 JVM의 메모리 구조


  1. Method Area(메서드영역)
    클래스/데이터

  1. Call Stack(호출스택)
    Main

  1. Heap(힙)
    인스턴스

3.7 기본형 매개변수와 참조형 매개변수

기본형 매개변수 - 변수의 값 읽기만 할 수 있음
참조형 매개변수 - 변수의 값을 읽고 변경 할 수 있음.

3.8 재귀호출

f(n) = n* f(n-1)

3.9 클래스(static 메서드)와 인스턴스메서드

  1. 클래스 설계할 때, 멤버 변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static 을 붙인다.
  2. 클래스 변수(static변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
  3. 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
  4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

3.10 클래스멤버와 인스턴스멤버간의 참조와 호출

인스턴스 멤버가 존재할때는 클래스멤버는 항상 존재하지만,
클래스맴버가 존재하는 시점에 인스턴스멤버가 존재할수도 있고 없을수도 있음.

[CH6. 객체지향프로그래밍1] 클래스와 객체

1. 객체지향 언어

  1. 코드의 재사용성이 높다.
  2. 코드의 관리가 용이하다.
  3. 신뢰성이 높은 프로그래밍을 가등하게 한다.

2. 클래스와 객체

2.1 클래스와 객체의 정의와 용도

클래스: 객체를 정의 해놓은것으로 객체를 생성할때 사용한다.

클래스 객체
제품설계도 제품
TV설계도 TV
붕어빵 기계 붕어빵

2.2 객체와 인스턴스

클래스 —(인스턴스화)—> 인스턴스(객체)

2.3 객체의 구성요소 - 속성과 기능

1
2
속성(propertiy) - 맴버변수(member variable), 특성(attribute), 필드(field), 상태(state)  
기능(function)- 매서드(method), 행위(behavior), 함수(function)
  • TV의 속성과 기능
속성 기능
크기, 길이, 높이, 색상, 볼륨, 채널 등 켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 변경하기

속성-> 맴버변수
기능->매서드

  • TV 클래스
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Tv {
    //Tv의 속성(맴버변수)
    String color;
    boolean power;
    int channel;

    //Tv의 기능(매서드)
    void power(){ power=!power;}
    void channelUp(){++channel;}
    void channelDowun(){--channel;}
    }

2.4 인스턴스의 생성과 사용

클래스 변수명; // 클래스의 객체를 참조하기 위한 참조변수를 선언한다.
변수명 = new 클래스명(); // 클래스의 객체를 생성 후 , 객체의 주소를 참수변수에 저장한다.

Tv t;
t = new Tv();

  • TvTest.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    class Tv {
    //Tv의 속성(맴버변수)
    String color;
    boolean power;
    int channel;

    //Tv의 기능(매서드)
    void power(){ power=!power;}
    void channelUp(){++channel;}
    void channelDowun(){--channel;}
    }


    class TvTest{
    public static void main(String args[]){
    Tv t; // 메모리에 참조변수 t의 공간 생김
    t = new Tv(); // t에 객체 주소값이 저장, 메모리 공간에 TV 클래스 인스턴스가 생김
    t.channel = 7; //t에 저장된 주소에 있는 인스턴스 멤버변수 channel에 7저장
    t.channelDown(); //t가 참조하는 Tv인스턴스 channelDowun매서드 호출->channel1감소
    }
    }

2.5 클래스의 또 다른 정의

  1. 클래스 - 데이터와 함수의 결합

    1. 변수 - 하나의 데이터를 저장할 수 있는 공간
    2. 배열 - 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
    3. 구조체 - 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
    4. 클래스 - 데이터와 함수의 결합(구조체+함수)

    5. 클래스 - 사용자 정의 타입

서로 관련된 변수를 묶어서 하나의 타입으로 새로 추가

1
2
3
int hour;
int minute;
float second;

1
2
3
4
5
class Time{
int hour;
int minute;
float second;
}

[Hexo와 깃허브로 블로그 만들기] 블로그에 Google Analytics 설치하기

1. 구글 애널리틱스 사이트에 계정만들기

google analytics 회원가입 하러가기

2. GA홈에서 관리할 사이트 계정을 추가한다.

  1. 관리 클릭

  2. 계정만들기 클릭

  3. 정보 넣고 추적ID가져오기 클릭

  1. 추적 아이디 값 복사하기

3. /blog/themes/icarus/_config.yml 파일 수정

1
2
3
plugins:
google-analytics:
tracking_id: XXXXXX (required)

4. 사용자 분석

구글 애널리틱스 사용자 분석하러 가기

[Hexo와 깃허브로 블로그 만들기] disque로 댓글 기능 활성화 하기

1. disque 회원가입

disque 회원가입 하러가기

2. UserName변경

Account에서 Username을 변경한다.(disque에서 유일해야함.)

3. /blog/themes/icarus/_config.yml 파일 수정

1
2
3
comment:
type: disqus
shortname: xxxxxxxx

4. post.md 파일 Front-Matter부분 수정

1
2
3
4
# (optional) a unique id to identify the post in Disqus system
disqusId: xxxxxxxx
---
Post content...

[SQL] ORDER BY 정렬

1. ORDER BY 정렬

1
2
3
4
5
6
SELECT 칼럼명 [ALIAS명]
FROM 테이블명
[WHERE 조건식]
[GROUP BY 칼럼또는 표현식]
[HAVING 그룹조건식]
[ORDER BY 칼럼이나 표현식 [ASC 또는 DESC];

2.SELECT 문장실행 순서

5)SELECT
1)FROM
2)WHERE
3)GROUP BY
4)HAVING
6)ORDER BY

1
2
3
4
5
6
7
8
SELECT DNAME, LOC, DEPTNO
FROM DEPT
ORDER BY 1,2,3 DESC;

SELECT JOB FROM EMP
GROUP BY JOB
HAVING COUNT(*)>0
ORDER BY MAX(EMPNO), MAX(MGR), SUM(SAL), COUNT(DEPTNO), MAX(HIREDATE);

3. TOP N 쿼리

ROWNUM

1
2
3
4
5
6
7
8
9
10
--ORDER BY가 제일 늦게 실행되기 때문에 원하는 값이 안 나옴
SELECT ENAME, SAL FROM EMP
WHERE ROWNUM <4
ORDER BY SAL;

--2중쿼리 이용
SELECT ENAME, SAL
FROM (SELECT ENAME, SAL FROM EMP
ORDER BY SAL DESC)
WHERE ROWNUM<4;

[SQL] GROUP BY, HAVING절

1. 집계함수(AGGREGATE FUNCTION)

  • 여러 행들의 그룹이 모여 그룹당 하나의 결과를 리턴하는 함수
  • GROUP BY 절은 행들을 소그룹화 함
  • SELECT절, HAVING절, ORDER BY 절에 사용할 수 있음.

집계함수명([DISTINCT] 칼럼이나 표현식)

COUNT(*)

  • NULL값을 포함한 행의 수 출력

    COUNT(표현식)

  • 표현식의 값이 NULL값을 제외한 행의 수 출력

    SUM([DISTINCT] 표현식)

  • NULL값을 제외한 합계출력

    AVG([DISTINCT] 표현식)

  • NULL값을 제외한 평균출력

    MAX([DISTINCT] 표현식)

  • 표현식의 최대값 출력

    MIN([DISTINCT] 표현식)

  • 표현식의 최소값 출력

    STDDEV([D] 표현식)

  • 표현식의 표준편차 출력

    VARIAN([D] 표현식)

  • 표현식의 분산 출력

2. GROUP BY절

  • SQL문에서 FROM과 WHERE절 뒤에 위치, 데이터를 그룹으로 분류하여 소그룹에대한 항목별 통계정보를 얻을때 사용
1
2
3
4
5
SELECT [DISTINCT] 칼럼명 [ALIAS명]
FROM 테이블명
[WHERE 조건식]
[GROUP BY 칼럼이나 표현식]
[HAVING 그룹조건식];

GROUP BY, HAVING절의 특성

  • 그룹바이로 소그룹의 기준을 정한후, SELECT 절에 집계함수를 사용
  • 집계함수의 통계정보는 NULL값을 제외하고 수행함
  • WHERE절에는 집계함수 올 수 없음
  • HAVING절은 그룹바이절의 기준 항목이나 소그룹의 집계함수를 이용한 저건을 표시
  • 그룹바이절에 의해 소그룹별로 만들어진 집계데이터 중, HAVING 절에 제한 조건을 두어 만족하는 내용만 출력
  • HAVING절은 일반적으로 GROUP BY절 뒤에 위치
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT POSITION 포지션, AVG(HEIGHT) 평균키
FROM PLAYER;
-->>ERROR : 단일 그룹의 집계함수가 아니다라고 나옴


SELECT POSITION 포지션, AVG(HEIGHT) 평균키
FROM PLAYER
GROUP BY POSITION 포지션;
-->>ERROR SQL명령어가 올바르게 종료되지 않음-->그룹바이에 별명ALIAS쓸 수 없음

--포지션별 최대키, 최소키, 평균키 출력
SELECT POSITION 포지션, MAX(HEIGHT), MIN(HEIGHT), AVG(HEIGHT)
FROM PLAYER
GROUP BY PISITION;

3.HAVING 절

  • GROUP BY후에 조건을 달고 싶을때 WHERE 대신 씀
  • WHERE절은 GROUP BY절 전에 오기때문에 소그룹으로 묶인후의 조건을 걸 수없음.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT POSITION 포지션, ROUND(AVG(HEIGHT),2) 평균키
FROM PLAYER
WHERE AVG(HIGHT) >=180
GROUP BY POSITION
--3행오류 : 집계함수가 허가되지 않음. 그룹바이로 소그룹화 되기전에 집계함수를 사용했기때문.

SELECT POSITION, ROUND(AVG(HEIGHT),2)
FROM PLAYER
GROUP BY POSITION
HAVING AVG(HEIGNT)>=180;

--이렇게써야함
--예제)
--최대 키가 190CM이상인 선수를 가지고 포지션별 평균 키를 출력
SELECT POSICITON AVG(HEIGHT)
FROM PLAYER
GROUP BY POSITION
HAVING MAX(HEIGHT) >=190;

4. CASE 표현을 활용한 월별 데이터 집계

  • 모델링의 제 1정규화로 반독되는 칼럼의 경우, 구분칼럼을 두고 여러개의 레코드로 만들어진 집합을 정해진 칼럼 수만큼 확장해서 집계 보고서를 만드는 유용한 기법

예제)
부서별 월별 입사자의 평균 급여를 조회, 입사후 1년마다 급여 인상이나 보너스 지급과 같은 일정이 정기적으로 잡히면 업무적으로 중요한 정보가 됨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
--STEPT1
--개별입사정보에서 월별데이터 추출
SELECT ENAME, DEPOTNO, EXTRACT(MONTH FROM HIREDATE) MONTH, SAL
FROM EMP;

--STEPT2 월별데이터 구분
SELECT ENAME, DEPTNO,
CASE MONTH WHEN 1 THEN SAL END M01, CASE MONTH WHEN 2 THEN SAL END M02,
CASE MONTH WHEN 3 THEN SAL END M03, CASE MONTH WHEN 4 THEN SAL END M04,
CASE MONTH WHEN 5 THEN SAL END M05, CASE MONTH WHEN 6 THEN SAL END M06,
CASE MONTH WHEN 7 THEN SAL END M07, CASE MONTH WHEN 8 THEN SAL END M08,
CASE MONTH WHEN 9 THEN SAL END M09, CASE MONTH WHEN 10 THEN SAL END M10,
CASE MONTH WHEN 11 THEN SAL END M11, CASE MONTH WHEN 12 THEN SAL END M12
FROM (SELECT ENAME, DEPTNO, EXTRACT(MONTH FROM HIREDATE) MONTH, SAL
FROM EMP);

--STEPT3 2의구분을 부서별로 그룹화
SELECT DEPTNO,
AVG(CASE MONTH WHEN 1 THEN SAL END) M01, AVG(CASE MONTH WHEN 2 THEN SAL END) M02,
AVG(CASE MONTH WHEN 3 THEN SAL END) M03, AVG(CASE MONTH WHEN 4 THEN SAL END) M04,
AVG(CASE MONTH WHEN 5 THEN SAL END) M05, AVG(CASE MONTH WHEN 6 THEN SAL END) M06,
AVG(CASE MONTH WHEN 7 THEN SAL END) M07, AVG(CASE MONTH WHEN 8 THEN SAL END) M08,
AVG(CASE MONTH WHEN 9 THEN SAL END) M09, AVG(CASE MONTH WHEN 10 THEN SAL END) M10,
AVG(CASE MONTH WHEN 11 THEN SAL END) M11, AVG(CASE MONTH WHEN 12 THEN SAL END) M12
FROM (SELECT ENAME, DEPTNO, EXTRACT(MONTH FROM HIREDATE) MONTH, SAL
FROM EMP)
GROUP BY DEPTNO;

5.집계함수와 NULL처리

  • 빈칸을 NULL이 아니라 0으로 처리하기 위해 NVL()을 사용하는 경우가 있는데, 오히려 불필요할 수 있음
  • 행 함수는 건수가 NULL인 행을 빼고 계산함. SUM, AVG,..등 굳이 0을넣어 불필요하게 더 계산할 필요가 없음
  • ELSE 절 생략하면 DEFAULT 값이 NULL임
  • 출력시 NULL이 아닌 0을 표현하고싶으면 NVL(SUM(SAL),0)이렇게 하면됨

[Hexo와 깃허브로 블로그 만들기] Hexo 블로그 포스트 쓰기

1. ~/blog/source/_posts/ 아래에 postname.md 파일 만들기.

파일을 만든 후 아래 내용을 입력한다.

1
2
3
4
5
6
7
8
9
10
11

---
title: "[Hexo와 깃허브로 블로그 만들기] Hexo 블로그 포스트 쓰기"
categories:
[test]
tags:
[test]

---

## Hello World!

2. jekyll 포스트 hexo로 옮기기

jekyll migratorn 참고 링크

  1. 지킬 프로젝트에서 _posts/하위 폴더 다 복사 후 hexo 프로젝트 /source/_posts/에다 붙여넣기.
  2. 포스트 제목을 2019-01-01-name.md의 형식을 name.md로 변경.
  3. 포스트 내용의 Front-matter 부분을 알맞게 수정
  4. 포스트안에 이미지나 다른 첨부 내용이 있다면 같이 옮겨줌.
    • 지킬의 /assests/images/ 폴더를 hexo의 blog/source/assets/images 로복사해줌
  5. 이미지 첨부가 맞지 않을 경우 hexo 서버가 에러가 남.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×