-- Create a Calendar table 

CREATE TABLE dbo.dim_calendar (

    calendar_date DATE NOT NULL,

    day_of_week TINYINT NOT NULL,

    is_business_day TINYINT NOT NULL,

    is_holiday TINYINT NULL,

    holidy_name nvarchar(MAX)

CONSTRAINT PK_dim_calendar PRIMARY KEY (calendar_date)

);

 

-- 2015-01-01 부터 30년 동안의 날짜 입력

DECLARE @StartDate DATE = '20150101', @NumberOfYears INT = 30;

DECLARE @CutoffDate DATE = DATEADD(YEAR, @NumberOfYears, @StartDate);

 

INSERT dim_calendar([calendar_date], [day_of_week], [is_business_day]) 

SELECT d, (select DATEPART(dw, d)), 1

FROM

(

  SELECT d = DATEADD(DAY, rn - 1, @StartDate)

  FROM 

  (

    SELECT TOP (DATEDIFF(DAY, @StartDate, @CutoffDate)) 

      rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id])

    FROM sys.all_objects AS s1

    CROSS JOIN sys.all_objects AS s2

    ORDER BY s1.[object_id]

  ) AS x

AS y;

 

-- Update data

update hh_calendar set day_of_week = (select DATEPART(dw, calendar_date));

update hh_calendar set is_holiday = 0;

 

* 참고:

1) DATEPART (Transact-SQL)

https://docs.microsoft.com/en-us/sql/t-sql/functions/datepart-transact-sql?view=sql-server-ver15

 

DATEPART (Transact-SQL) - SQL Server

Transact-SQL reference for the DATEPART function. This function returns an integer corresponding to the datepart of a specified date.

docs.microsoft.com

2) Query

https://gist.github.com/gavincampbell/4a4d4aa581038c261d89eddddfcaf45c

 

Creates a calendar table in Azure SQL Data Warehouse

Creates a calendar table in Azure SQL Data Warehouse - CreateDateAzureSQLDW.sql

gist.github.com

 

1. Region(리전)

- 모든 서비스가 위치하고 있는 물리적 장소

- 전 세계 주요 지역에 위치 (네트워크 속도를 빠르게 하기위함, 큰 재해(지진, 태풍)에 대비)

- 리전안에는 가용영역(Avaliability Zone, AZ, aka. 데이터센터)이 여러개 있음

* 가용영역은 같은 지역이라도 멀리 떨어져 있음(큰재해에 대비하기 위해)

 

2. Edge Location(엣지 로케이션)

-  AWS ColudFront(CDN 서비스를 위한 캐시 서버) 

*CDN 서비스: CDN(Content Delivery Network) 서비스란, 콘텐츠(HTML, 이미지, 동영상 등)을 사용자들이 빠르게 받을 수 있도록 캐시 서버에 복제해주는 서비스

'개발 > AWS' 카테고리의 다른 글

AWS 개요  (0) 2020.06.24

1. EC2

- 가상서버, 컴퓨터

 

2. ELB (Elastic Load Balancer, 로드밸런서 )

- 여러 가용 영역을 만들어 트래픽 분배. 

-서버 중 하나가 작동하지 않아도 다른 가용영역에 있는 서버는 작동하기 때문에 사용자는 문제없이 웹페이지 접속 가능함.

 

3. Route 53 

- DNS 서비스

 

4. ColudFront

- 콘텐츠 배포 서비스, CDN 서비스

 

5. Cloud Formation

- 서버 구성을 자동화

 

6. S3

- 스토리지 서비스

 

 

'개발 > AWS' 카테고리의 다른 글

EC2에서 Region(리전), Edge Location(엣지 로케이션)  (0) 2020.06.24

1. 환경

 - Window10 64 bit

 - JDK 1.8

 - Eclipse 

 

 

2. 설치

1) Node.js 설치

https://nodejs.org/ko/ 에서 Node.js 다운로드 

2) Nodemon설치 (설치해도 되고 안해도되고)

변경사항이 있을때마다 서버 재구동 없이 변경사항 적용가능(30일간 무료)

설치 명령어: npm install -g nodemon

저장위치: C:\Users\윈도우계정ID\AppData\Roaming\npm\node_modules\nodemon\bin\nodemon.js

 

3. 이클립스에 Node.js 셋팅

Help > Eclipse Marketplace > NodeNodeclipse 검색 > Install Nodeclipse.github.io 1.0.2

 

4. Node.js 만들기

Project Exploer > 마우스 오른쪽버튼 > New.. > Node/Node.js Project 선택

> Project name 입력 > Template to use는 none/empty 선택

 

5. 패키지 설치(npm express)

프로젝트 이름에서 마우스 우클릭 > StartExlporer > Start Shell Here 선택 > 설치 명령어 입력 > 설치 후 이클립스 돌아와서 프로젝트 refresh > npm 설치 확인

설치 명령어: npm install express --save

 

6.  새 소스 파일 추가

 1) HelloWorld.js 파일 추가 

 2) 샘플 코드 입력

var http = require('http');

http.createServer( function (req, res){
res.writeHead(200, {'Contnet-type':'text/html'});
res.end('Hello World!');
}).listen(8000);

 3) 코드 실행 테스트

  HelloWorld.js 오른쪽 버튼 > Run as > Node.js application 선택해서 Console 창에 에러없이 서버 실행되는 것 확인

  >주소창에 http://localhost:8000 입력 > "Hello world!" 출력되는지 확인

 

 

 

 

 

1.코드

package java01.test31;

public class Test31 {

 public static void main(String[] args) {
  
  Calculator c1 = new Calculator();
  Calculator c2 = new Calculator();
  
  c1.plus(10);
  c2.plus(5);
 }

}

public Calculator{

   private int result; 

 

   public void plus(int value){

      this.result += value;

   }

}

 

 

2. 실행순서

JVM2.pptx

 


3. JVM 구조

  • 나중에 주소 첨부


'개발 > Java' 카테고리의 다른 글

[JAVA] static  (0) 2017.01.02
[JAVA] import  (0) 2017.01.01
[JAVA] Class(클래스)  (0) 2017.01.01
[JAVA] Tip. 코드를 보고 알아보는 if문의 효율정리  (0) 2017.01.01
[JAVA] 제어문 VS 반복문  (0) 2017.01.01

---------------------------------------------------------------------------------------------------

변수의 static과 메소드의 static은 다르다!!!

---------------------------------------------------------------------------------------------------

 

1. 변수의 static

  • "변수를 저장하는 방법을 static이다" 라는 것!
  • 즉, stack의 영역에 저장되어 메소드가 끝이나면 사라지는 변수가 아니라
  • method area 영역에 저장되어 메소드가 끝이나더라도 사라지지 않는 변수의 특성을 말한다.
  • static 공통적으로 같은 값을 갖고 있고 수정의 필요가 없을 때 사용하므로 ​보통 final과 함께 쓰이는 경우가 많다.


 1.1 장점​

  • static 키워드를 붙이면 자바는 메모리 할당을 딱 한번만 하게 되어 메모리가 절약된다.
  • heap영역이 아니므로 가비지 컬렉터가 수거하지 않고 계속 메모리에 남아있다.
  • stack영역이 아니므로 class 또는 instance가 끝남과 동시에 메모리에서 사라지지 않는다.

 

1.2 단점

  • 메모리가 계속 남아있으므로 잘못사용할 시, 메모리가 낭비될 수 있다.

 

1.3 언제 사용하는가?

  • 여러개의 인스턴스가 동일한 값을 저장하는 변수를 갖고 있을 때, static으로 저장한다.


ex) 계산기를 만드는 클래스 Calurlator가 있다면, 각각의 결과값을 저장하는 result라는 변수는 static이 필요하지 않지만,

만약 모든 계산기의 이름이 "카*오"라는 이름을 갖고 있는 것을 저장한다면 static을 이용하여 method area에 저장한다. 

1) 그냥 선언할 경우

2) static으로 선언할 경우

public class Test{

   class Calulator{

      int result;

     String calName = "카*오";

   

      void plus(int value){  

         this.result += value;

      }

  }

   public static void main(String[] args){

      Calulator c1 = new Calculator();

      Calulator c2 = new Calculator();

   }

}

 

public class Test{

   class Calulator{

      int result;

     static String calName = "카*오";

   

      void plus(int value){  

         this.result += value;

      }

  }

   public static void main(String[] args){

      Calulator c1 = new Calculator();

      Calulator c2 = new Calculator();

   }

}

 Calulator로 인스턴스를 만들때마다 heap 영역에 calName이라는 공간이 쌓이게 된다. 만약 Calulator 인스턴스를 100개를 만든다면 100개의 "카*오"라는 동일한 값을 갖는 calName이 생긴다는 것이다

=> 메모리낭비

 claName을 static로 선언했으므로 method area영역에 한번만 메모리가 생성되고 만약 Calulator 인스턴스를 100개를 만든다면 하나의 calName을 서로 공유하게 된다

=> 메모리 효율적 관리 가능 

 

 

 

2. 메소드의 static

  • 메소드의 static은 어떻게 호출할 것인가 방법에 대한 것.
  • 즉, 함수 호출시 클래스로 호출할 것인가 아니면 인스턴스로 호출할 것인가에 문제
  • static 메소드의 변수는 메소드가 호출되지 않아도 method area영역에 변수의 메모리가 생성된다.
  • static메소드는 메소드를 호출하지 않아도 static 메소드안의 변수와 메소드가 JVM에 올라간다.
  • staic이 붙지 않는다면 instance method​

 

2.1 언제 사용하는가?

 1) 그냥 선언할 경우

 2) static으로 선언할 경우

public class NomalTest{

   public void printTest(){  

         System.out.println("Instance Method");

    } 

}

-----------------------------------------------------------

public class Test{

   public static void main(String[] args){

      NomalTestc1 = new NomalTest(); //객체 생성

      n1.printTest();

}

 public class StaticTest{

   public static void printTest(){  

         System.out.println("Static Method");

    } 

}

-----------------------------------------------------------

public class Test{

   public static void main(String[] args){

       StaticTest.printTest();

   }

}

  •  class이름으로 호출불가!
  • 인스턴스 이름으로 호출하여야함
  • plus함수 호출시 호출한 객체의 시작변수를 담고있는         히든변수 this가 생성됨
  • StaticTest.printTest();로 호출가능
  • "new"를 통해 객체 생성 필요X

 

* 2)번 보다는 1)번을 선호한다.

* .java 파일에서 .class로 컴파일 될 때, static 메소드들은 먼저  method area 메모리에 적재된다. 따라서 불필요한 method에 static을 붙일경우,

  불필요한 메모리 낭비가 일어날 수 있다.

 

 

2.2 main은 왜 반드시 static일까?

main method를 호출하는 명령어는 누구도 존재하지 않는다. 때문에 호출되지 않고도 변수와 method가 JVM에 위치하게 하려면 static이여야 하는 것이다.(static메소드는 메소드를 호출하지 않아도 static 메소드안의 변수와 메소드가  JVM에 생성되므로)
=> 따라서, main은 static을 쓴다!!

 

그렇다면 다른 method도 전부 static으로 하면 편하지 않을까?

아니다!! 만약, 다른 함수들도 static으로 선언된다면, 모든 method의 변수가 전부 다 JVM에 쌓이고 상주하므로 overflow가 발생하게 된다.

 

따라서, 적시적소에 static을 붙이는 것이 중요하다.   

 

 

3. static block

  • 클래스가 로딩된 후 클래스 변수를 초기화 하는 용도로 사용
  • 클래스 로딩은 단 한 번만 이루어지므로 static 블럭도 단 한번도 실행된다.
  • 실행순서: ​클래스 로딩 -> 클래스 변수 준비 -> static block 실행

 

3.1 쉬운 satic block 예시

< 예제코드 >

 public class Test45 {
   public static void main(String[] args) {
   
   System.out.println("클래스는 언제 로딩될까? => 1");
   ClassA obj1;
   System.out.println("클래스는 언제 로딩될까? => 2"); 
  

   //아래의 출력결과를 보면 1, 2사이에 클래스 로딩되었으므로 new를 하려고 할 때 해당 클래스가 없다면 로딩되는 것을 알 수 있다.
   obj1 = new ClassA();     
   System.out.println("클래스는 언제 로딩될까? => 3");
  
   System.out.println(ClassA.value);
 }
}

 public class ClassA {
   static int value = 100;
 
   static{
      System.out.println("ClassA의 static 블럭실행");
      value = 200;
   }
   static{
      System.out.println("static 블럭이 여러개일 경우 순차적으로 실행");
   }
}

 

< 출력결과 >

 클래스는 언제 로딩될까? => 1
 클래스는 언제 로딩될까? => 2
 ClassA의 static 블럭실행
 static 블럭이 여러개일 경우 순차적으로 실행
 클래스는 언제 로딩될까? => 3
 200 

 


4. 첨부

JVM.pptx


1. 다른 패키지의 클래스를 사용하는 방법

1.1 사용 할 때에 패키지 명시

public class Test{

   public static void main(String[] args){ 

       java.util.ArrayList list = new java.util.ArrayList

   }

}

 

1.2 import 사용

import java.util.ArrayList

 

public class Test{

   public static void main(String[] args){

        ArrayList list = new ArrayList();

   }

}

 * import java.util.* 로 하여 전부다 패키지를 불러오는 것보단 위의 방법으로 클래스이름까지 명확히 명시해주는 것이좋다

 * 정확히 명시해 줌으로써 패키지 전체를 뒤지지 않아도 되기 때문에 컴파일 속도가 빠르다

 * 후에 유지보수 할때에도 정확히 명시해주는 것이 소스코드를 해석하는데 도움이 된다.

 * 컴파일 하고 나서는 import문은 사라지므로, 크기의 걱정은 필요없다.

 

 

2. import 사용이유

  • 1.1 로 할경우에는 매번 쓸때마다 적어야 하므로 코드가 길어지고 복잡해진다.
  • 반면에, 1.2(import 사용)의 경우 한번만 선언하고 앞부분을 생략해서 쓸수 있으므로 훨씬 간결하다.


1. 클래스란?

  • 역할에 따라 메소드와 변수를 정의한 것, 묶어놓은 것

 

2. 클래스 사용방법

 [공개여부 class 클래스이름{ ... }

 *공개여부: public, protected, (default), public

 

2.1 공개여부(접근제어자)

  • private: 클래스 멤버만 접근 가능
  • protected: 같은 패키지 클래스에서 접근가능, 다른 패키지이지만 자식 클래스 접근 가능
  • (default): 같은 패키지의 클래스만 접근 가능
  • public: 모두 접근 가능

         * 참고: [JAVA] 제어자

 

3. 클래스 사용이유

  • 재사용성이 높아짐 => 검증된 코드 사용 =>  안전성 높아짐 => 개발 비용 절감
  • 코드의 간섭(cohesion, coupling)이 줄어듬 => 유지보수가 쉬워짐 => 개발 비용 절감 


'개발 > Java' 카테고리의 다른 글

[JAVA] static  (0) 2017.01.02
[JAVA] import  (0) 2017.01.01
[JAVA] Tip. 코드를 보고 알아보는 if문의 효율정리  (0) 2017.01.01
[JAVA] 제어문 VS 반복문  (0) 2017.01.01
[JAVA] method(메소드)  (0) 2017.01.01

 

 1의 경우

2의 경우 

3의 경우 

 코드

 

 

public static void main(String[] args) {
  int num = 1;

  while (num <= 100){
   if (num % 4 == 0) {
    System.out.print(num + "   ");

}​
    if (num % 20 == 0) {
     System.out.println();

}​
     if (num % 60 == 0) {
      System.out.print("@");
     }
  
   num++;

 

}

 

public static void main(String[] args) {
  int num = 1;

  while (num <= 100){
   if (num % 4 == 0) {
    System.out.print(num + "   ");
    if (num % 20 == 0) {
     System.out.println();
     if (num % 60 == 0) {
      System.out.print("@");
     }
    }
   }
   num++;

  }

}

 

 public static void main(String[] args) {
  int num = 4;

  while (num <= 100){
    System.out.print(num + "   ");
    if (num % 20 == 0) {
     System.out.println();
     if (num % 60 == 0) {
      System.out.print("@");
    }
   }
   num += 4;

  }

}

 

 출력결과

 
  4   8   12   16   20  
  24   28   32   36   40  
  44   48   52   56   60  
  @64   68   72   76   80  
  84   88   92   96   100 

 효율

 if문을 각각 3번 돌렸으므로

(if문을 한 번 실행하는데 1초로 가정)

100 + 100 + 100 = 300

 if문안에 if문이중첩되어 있는 구조이믈

 100

 4씩 더하면서 하므로 if문 한번을 없앨 수 있으므로

100 / 4 = 25

 * 다 같은 결과를 나오지만, 효율로 따진다면 3의 경우가 가장 효율적이라고 할 수 있다.

'개발 > Java' 카테고리의 다른 글

[JAVA] import  (0) 2017.01.01
[JAVA] Class(클래스)  (0) 2017.01.01
[JAVA] 제어문 VS 반복문  (0) 2017.01.01
[JAVA] method(메소드)  (0) 2017.01.01
[JAVA] array(배열)  (0) 2017.01.01

1. 제어문

1.1 if문

 if(조건){ 실행문... }

 

1.2 if~else문

 if(조건){

   실행문...

}else if(조건){

   실행문...

}else if(조건){

   실행문...

} ....

 

else(){

    실행문 ...

}

 

1.3 switch문

 switch(조건){

    case 경우:

          실행문;

          break;

    case 경우:

           실행문;

            break;

    ....

    default:

           실행문;

}

 * 조건:  4byte이하 정수값, byte, short, char (JDK7 부터는 String도 조건에 넣을 수 있다)

 

 

2. 반복문

2.1 while문

 while(조건){

     반복할 내용;

     증감문;

}

  

2.2 do~while문

 do{

   반복문;

}while(조건)

 * 조건이 맞지 않더라도 최소한 1번은 do안의 반복문이 실행된다. 

 

2.3 for문

 for(초기화; 조건; 증감문;){

   반복문;

}

 

'개발 > Java' 카테고리의 다른 글

[JAVA] Class(클래스)  (0) 2017.01.01
[JAVA] Tip. 코드를 보고 알아보는 if문의 효율정리  (0) 2017.01.01
[JAVA] method(메소드)  (0) 2017.01.01
[JAVA] array(배열)  (0) 2017.01.01
[JAVA] 객체  (0) 2016.12.31

+ Recent posts