728x90
반응형

슬라이딩 윈도우 알고리즘은 배열 요소의 일정 범위 값을 비교할때 사용하면 유용한 알고리즘 입니다.

동작방식

일정 정수로 이루어진 배열 int[] arr= {3,1,5,3,4,1,5,7,5,1,8} 가 있다면, 길이가 5인 배열의 합계가 가장 큰 것은 무엇인가? 라는 문제에 사용될 수 있습니다. 일반적으로 아래와 같이 0번째 부터 4번째 (길이가 5이므로) 합을 구하고 저장합니다. 그리고 1번째 부터 5번째까지의 합을 구하고 저장후 처음에 구했던 값과 비교를 하여 큰것을 가지고 있습니다. 이렇게 반복을 하면 됩니다. 하지만 이 방법은 매번 for 루프로 모든 배열의 요소를 지정된 길이만큼 순회하며 합계를 구해 최대값을 구해야하므로 비효율적 입니다.

[3,1,5,3,4],1,5,7,5,1,8 ==> 합: 16, 최대값: 16
3,[1,5,3,4,1],5,7,5,1,8 ==> 합: 14, 최대값: 16
3,1,[5,3,4,1,5],7,5,1,8 ==> 합: 18, 최대값: 18 
...
==> 비효율적

이것을 간단히 생각해보면 처음에 해당 길이만큼 합계를 구하는 것은 어쩔수 없습니다. 하지만, 그 이후부터 매번 돌지 않고 인덱스 1~5까지의 합은 처음에 길했던 0~4까지의 합계에 0번째 배열의 값을 빼고, 5번째 배열의 값을 더한 값과 같습니다. 바로 이 부분에서 처음 구했던 0~4까지의 합계를 재사용하며 다음값을 구할 수 있는데, 이것이 슬라이딩 윈도우 알고리즘의 핵심입니다.

참고사이트

https://blog.fakecoding.com/archives/algorithm-slidingwindow/
 

[알고리즘] 슬라이딩 윈도우 알고리즘

슬라이딩 윈도우(Sliding Window) 알고리즘은 배열이나 리스트의 요소의 일정 범위의 값을 비교할때 사용하면 유용한 알고리즘이다. 예를들어 정수로 이루어진 배열 [2, 4, 7, 10, 8, 4, 5, 6, 7, 1] 에서 길

blog.fakecoding.com

기본코드

위 설명의 예제를 구현한 코드입니다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class SlidingWindow_example {
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));    

    static int[] arr= {3,1,5,3,4,1,5,7,5,1,8};
    static int n;

    static int getFive(int index)
    {
        int sum= 0;
        for (int i = 0; i<5; i++) {
            sum += arr[i + index];
        }
        return sum;
    }

    public static void main(String[] args) throws IOException {        

        n = arr.length;
        int max = -9999;

        int sum = getFive(0);

        for (int i = 0; i <= n - 5; i++) {
            if (sum > max) max = sum;

            // 마지막순간에는 다음 것을 준비할 필요 없음
            if (i == n - 5) break;

            // 다음 것을 준비
            sum += arr[i + 5];
            sum -= arr[i];
        }

        System.out.println(max);

        bw.close();
        br.close();
    }        
}

결과는 26이 나옵니다.

728x90
반응형
728x90
반응형

DAT는 자료구조입니다. 값을 배열의 index를 활용하는 것이 포인트 입니다. 

 

동작방식

배열을 사용하여 레코드를 해당 키에 매핑할 수 있는 데이터 구조입니다. 직접 주소 테이블에서 레코드는 키 값을 인덱스로 직접 사용하여 배치됩니다. 빠른 검색, 삽입 및 삭제 작업을 용이하게 합니다.

출처: https://www.geeksforgeeks.org/direct-address-table/

최대값에 1을 더한 크기의 배열을 만든 다음(0 기반 인덱스로 가정) 값을 인덱스로 사용합니다. 예를 들어 다음 다이어그램에서 키 21은 인덱스로 직접 사용됩니다.

시간복잡도

탐색,삽입,삭제 연산을 모두 O(1)

참고사이트

https://www.geeksforgeeks.org/direct-address-table/
 

Direct Address Table - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

기본코드

아래는 글을 입력받아 가장 많이 나온 문자를 찾아내는 간단한 코드입니다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;


public class DAT_example {
	
	/**
	 * DTA : Direct Address Table 자료구조 
	 * ==> 값을 index로 활용하는 것인 포인트
	 */
	
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

	public static void main(String[] args) throws IOException  {
		
		// 입력
		String input = br.readLine();
		int[] arr = new int[200];
		int max = 0;
		String maxChar = "";
		for(int i=0; i<input.length(); i++){
			arr[input.charAt(i)] += 1;
			if(arr[input.charAt(i)]  > max){
				max = arr[input.charAt(i)] ;
				maxChar = input.charAt(i)+"";
			}
		}
		
		// 풀이
		System.out.println(maxChar);
		
		br.close();
		bw.close();
	}

}

결과

AMDKIDD   <== 입력
D              <== 결과
728x90
반응형
728x90
반응형

지난번 VMware에 CentOS Stream 8을 설치해 보았습니다. 이번에는 PostgreSQL13을 설치해 보도록 하겠습니다.

1. PostgreSQL 인스톨

dnf 명령을 실행하여 내장 PostgreSQ: 모듈을 비활성화 합니다.

[root@TypilerServer pgsql]# dnf -y module disable postgresql

PostgreSQL rpm 링크를 아래 사이트에서 찾아 링크 주소를 복사합니다.

https://yum.postgresql.org/repopackages/
 

Repo RPMs - PostgreSQL YUM Repository

9.4 RHEL 8 - x86_64, RHEL 7 - x86_64, RHEL 6 - x86_64, RHEL 6 - i386, RHEL 5 - x86_64, RHEL 5 - i386

yum.postgresql.org

CentOS 8-x86_64 링크에 마우스를 올리고 오른쪽 마우스 버튼을 클릭하여 링크 주소 복사합니다. 콘솔에 아래와 같이 명령어를 입력합니다. 

[root@TypilerServer ~]# yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

2. PostgreSQL 서버 패키지 설치

[root@TypilerServer pqsql]# yum -y install postgresql13-server

설치가 완료되면 postgres 계정이 생성된 것을 확인할 수 있습니다.

 

4. 데이터베이스 클러스트 작성

데이터 베이스 클러스트는 데이터 베이스를 저장하는 영역입니다.

[root@TypilerServer pgsql]# su - postgres -c '/usr/pgsql-13/bin/initdb -E UTF8'

5. 데이터베이스 기동

systemctl 을 이용해서 기동을 하려니 동작을 안합니다. 그래서 데몬에 postgresql-13.service 를 등록해 줍니다.

[root@TypilerServer ~]# systemctl daemon-reload
[root@TypilerServer ~]# systemctl enable postgresql-13.service

그리고 데몬을 실행해 봅니다.

[root@TypilerServer ~]# systemctl start postgresql-13.service
[root@TypilerServer ~]# systemctl status postgresql-13.service

정상적으로 구동이 완료되었습니다.

6. 상태확인

[postgres@TypilerServer ~]$ ps -ef | grep pgsql

6. test 데이터베이스 생성

postgres 계정으로 로그인한 뒤 test 데이터 베이스를 생성합니다. 

[postgres@TypilerServer ~]$ createdb test
[postgres@TypilerServer ~]$ psql test

생성 후 psql -l 로 데이터베이스 목록을 확인하면 아래와 같이 test가 추가 되었음을 알 수 있습니다.

 

지금까지 CentOS Stream 8 에 PostgreSQL 13 설치를 진행해 보았습니다. 예전에 설치를 했을때보다 확실히 간소화 되고 자동으로 설정을 진행해줘 설치에는 어려움이 없는것 같습니다. 아직 설정할 것이 남았는데 조금씩 진행해 보도록 하겠습니다. 

https://tylee82.tistory.com/33
 

RadHat9 - postgresql 설치 (성공)

############################################################# # # Title : postgresql 8.3.6 source version install for RadHat9 (Success) # date : 2009.02.26 # Lee Tae Young # ########################..

tylee82.tistory.com

 

728x90
반응형
728x90
반응형

 

Vue 사용 웹 앱을 개발하기 위해 알아야하는 페이지 이동 방법을 알아보도록 하겠습니다. 페이지 이동방법은 뷰 라우터라는 것이 있습니다. 뷰 라우터는 뷰에서 라우팅 기능을 구현할 수 있도록 지원하는 공식 라이프러리입니다. 이것을 이용하면 뷰로 만든 페이지간 간에 자유로운 이동이 가능해 집니다. 

[참고]
라우팅이란 ?
 웹 페이지 간의 이동방법, 싱글 페이지 애플리케이션에서 주로 사용, 화면전환이 매끄러움, 사용자 접근성 향상

뷰 라우터를 구현하는 태그는 아래와 같습니다.

<script src="https://unpkg.com/vue-router/dist/vue-router.js"> : 라우터 라이브러리
<router-link to="URL 값"> : 페이지 이동 태그
<router-view> : 페이지 표시 태그

직접 아래 예제를 확인해 보도록 하겠습니다.

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue Router Sample</title>
  </head>
  <body>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
    <div id="app">
      <h1>뷰 라우터 샘플</h1>
      <p>
        <!-- 1 : URL 값을 변경하는 태그 -->
        <router-link to="/foo">Foo 이동</router-link>
        <router-link to="/bar">Bar 이동</router-link>
      </p>
      <!-- 2 : URL 값에 따라 갱신되는 화면 영역 -->
      <router-view></router-view>
    </div>
    <script>
      // 3 : 컴포넌트 정의
      var Foo = { template: '<div>foo</div>'};
      var Bar = { template: '<div>bar</div>'};

      // 4 : 각 URL에 맞춰 표시할 컴포넌트 지정
      var routes = [
        { path:'/foo', component:Foo },
        { path:'/bar', component:Bar }
      ];

      // 5 : 뷰 라우터 정의
      var router = new VueRouter({
        routes
      });

      // 6 : 뷰 인스턴스에 라우터 추가
      var app = new Vue({
        router
      }).$mount('#app');

    </script>
  </body>
</html>

아래는 실행 결과입니다.

 

뷰 기본 라우팅 방식을 이용하여 페이지를 전환하는 예제입니다. 

  1. <router-link>는 화면 상에서 <a> 버튼 태그로 변환되어 표시됩니다. to="" 정의된 텍스트 값이 브라우저 URL 끝에 추가됩니다.
  2. <router-view>는 갱신된 URL에 해당하는 화면을 보여주는 영역입니다. 이곳에 나타낼 화면은 <script>에서 정의합니다.
  3. Foo, Bar 컴포넌트에는 template 속성으로 각 컴포넌트를 구분할 수 있는 정도의 HTML 코드를 정의합니다.
  4. routes 변수에는 URL 값이 /foo 일때 Foo 컴포넌트를, /bar 일때 Bar 컴포넌트를 표시하도록 정의합니다.
  5. router 변수에는 뷰 라우터를 생성하고, routes 를 삽입해 URL에 따라 화면이 전환될 수 있게 정의합니다.
  6. 새 인스턴스를 생성하고 라우터의 정보가 담긴 router를 추가합니다. 
$mount() API란?
el 속성과 동일하게 인스턴스를 화면에 붙이는 역할을 합니다. 인스턴스를 생성할 때 el 속성을 넣지 않아도 $mount()를 이용하면 강제로 인스턴스르 화면에 붙일 수 있습니다.

기본 코드에서는 컴포넌트 1개만 표시되기 때문에 간단합니다. 하지만 실제 구현은 화면에 여러개의 컴포넌트로 분할된 경우가 많습니다. 그럼 여러 개의 컴포넌트를 동시에 표시할 수 있는 라우터인 네스티드 라우터와 네임드 뷰 라는 두가지가 있습니다. 

 

네스티드 라우터

네스티드 라우터는 라우터로 페이지를 이동할 때 최소 2개 이상의 컴포넌트를 화면에 나타낼 수 있습니다. 상위 컴포넌트 1개에 하위컴포넌트 1개를 포함하는 구조로 구성됩니다. 아래와 같은 구조입니다.

출처: https://router.vuejs.org/kr/guide/essentials/nested-routes.html

네스티드 라우터를 이용하면 URL에 따라서 컴포넌트의 하위 컴포넌트가 다르게 표시됩니다. 

아래는 간단한 네스티드 라우터 코드입니다.

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue Nested Router Sample</title>
  </head>
  <body>
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
    <div id="app">
      <p>
        <router-link to="/user/foo">/user/foo</router-link>
        <router-link to="/user/foo/profile">/user/foo/profile</router-link>
        <router-link to="/user/foo/posts">/user/foo/posts</router-link>
      </p>
      <!-- 1 : User 컴포넌트가 뿌려질 영역 -->
      <router-view></router-view>
    </div>
    <script>
    // 2 : 컴포넌트의 내용 정의
      var User = {
        template: `
          <div class="user">
            <h2>User {{ $route.params.id }}</h2>
            <router-view></router-view>
          </div>
        `
      };
      const UserHome = { template: '<div>Home</div>' };
      const UserProfile = { template: '<div>Profile</div>' };
      const UserPosts = { template: '<div>Posts</div>' };

      // 3 : 네스티드 라우팅 정의
      var routes = [
          { path: '/user/:id', component: User,
            children: [
              // UserHome will be rendered inside User's <router-view>
              // when /user/:id is matched
              { path: '', component: UserHome },

              // UserProfile will be rendered inside User's <router-view>
              // when /user/:id/profile is matched
              { path: 'profile', component: UserProfile },

              // UserPosts will be rendered inside User's <router-view>
              // when /user/:id/posts is matched
              { path: 'posts', component: UserPosts }
            ]
          }
        ];

      // 4 : 뷰 라우터 정의
      var router = new VueRouter({
        routes
      });

      // 5 : 뷰 인스턴스에 라우터 추가
      var app = new Vue({ router }).$mount('#app')

    </script>
  </body>
</html>

아래는 실행 결과 입니다.

User 컴포넌트를 상위 컴포넌트로 놓고 URL에 따라 각각의 컴포넌트를 표시하는 코드입니다. 네스티드 라우터와 기본 라우터의 차이점은 최상위 컴포넌드에도 <router-view>가 있고, 최상위 컴포넌트의 하위 컴포넌트(User)에도 <router-view>가 있다는 것 입니다. 네스티드 라우터는 화면을 구성하는 컴포넌트의 수가 적을 때는 유용하지만 많은 컴포넌트를 표시하는데는 한계가 있습니다. 이것을 해결할 수 있는 방안이 네임드 뷰입니다.

 

네임드 뷰

네임드 뷰는 특정 페이지로 이동했을 때 여러 개의 컴포넌트를 동시에 표시하는 라우팅 방식입니다. 네스티드 라우터 방식은 상위 컴포넌트가 하위 컴포넌트를 포함하는 형식이지만, 네임드 뷰는 같은 레벨에서 여러 개의 컴포넌트를 한 번에 표시합니다.

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue Named View Sample</title>
  </head>
  <body>
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
    <!-- 1 : 라우팅 영역 정의 -->
    <div id="app">
      <router-view name="header"></router-view>
      <router-view></router-view>
      <router-view name="footer"></router-view>
    </div>

    <script>
      // 2 : 컴포넌트의 내용 정의
      var Body = { template: '<div>This is Body</div>'};
      var Header = { template: '<div>This is Header</div>'};
      var Footer = { template: '<div>This is Footer</div>'};

      // 3 : 네스티드 라우팅 정의
      var routes = [
          { path: '/', components: {
              default : Body,
              header : Header,
              footer : Footer
            }
          }
        ];

      // 4 : 뷰 라우터 정의
      var router = new VueRouter({
        routes
      });

      // 5 : 뷰 인스턴스에 라우터 추가
      var app = new Vue({ router }).$mount('#app')

    </script>
  </body>
</html>

아래는 실행 결과 입니다.

위 코드를 실행하면 URL 값 '/'에 의해 네임드 뷰가 바로 실행됩니다. 코드를 살펴보면 아래와 같습니다.

  1. <router-view>에 name 속성을 추가하는데 name 속성은 아래 components 속성에 정의하는 컴포넌트와 매칭하기 위한 속성입니다. name 속성이 없는 것은 default로 표시될 컴포넌트를 의미합니다.
  2. Body, Header, Footer 컴포넌트의 내용에 담길 객체를 선언합니다.
  3. 라우팅정보를 정의합니다.
  4. 뷰 라우터를 정의합니다.
  5. 뷰 인스턴스에 라우터를 추가합니다.

네임드 뷰를 활용하면 특정 페이지로 이동했을 때 해당 URL에 맞추어 여러 개의 컴포넌트를 한 번에 표시할 수 있습니다.

 

 

참고사이트

https://router.vuejs.org/kr/guide/#html
 

시작하기 | Vue Router

시작하기 Vue와 Vue 라우터를 이용해 싱글 페이지 앱을 만드는 것은 매우 쉽습니다. Vue.js를 사용한다면 이미 컴포넌트로 앱을 구성하고 있을 것입니다. Vue 라우터를 함께 사용할 때 추가로 해야하

router.vuejs.org

 

728x90
반응형
728x90
반응형

지난 포스트에 이어서 VMware에 CentOS Stream 8 을 설치하도록 하겠습니다. 지난 포스트는 아래를 참고하여 주십시오.

https://tylee82.tistory.com/311
 

[VMware] CentOS Stream 8 설치(1)

많은 고민 끝에 VMware에 설치할 OS 를 선정하였습니다. CentOS Stream 8 입니다. 우분투를 한번도 사용하지 않아서 설치를 해볼까 했는데, 아무래도 서버를 공부하기에는 우분투보다는 CentOS가 더 좋을

tylee82.tistory.com

 

설치는 간단하게 진행됩니다. 각자 사용목적에 맞게 설치를 진행하면 되며, 요즘 나오는 리눅스는 자동화가 잘 되어있을거라 생각하여 간단한 설정만 하고 설치를 진행하였습니다. 그리고 나중에 필요한건 추가로 설치를 하도록 하겠습니다.

CentOS Stream 8 설치 과정

1. VMware 의 상단 메뉴에 플레이 버튼으로 앞에서 작성된 CentOS Stream 8 가상머신을 구동합니다.

2. 설치를 위하여 "Install CentOS Stream 8-stream" 을 선택하여 엔터를 누릅니다.

3. 설치 마법사 화면이 아래와 같이 나타나며, 언어를 선택하여 줍니다.

4. 설치에 대한 요약을 살펴보고 필요한 부분의 설정을 시작합니다.

4-1. 소프트웨어 선택입니다. 저는 서버로 사용을 할 목적으로 만드는 것이라, 기본환경은 서버입니다. 그리고 추가 소프트웨어는 "FTP서버" 와 "개발용 툴" 정도만 선택을 하고 완료를 눌러주었습니다. 나중에 필요한 부분이 있으면 설치를 할 수 있습니다.

4-2. 설치 목적은 "자동설정"을 사용하였습니다.

4-3. root 계정의 암호를 설정하여 줍니다.

4-4. 사용자를 생성하여줍니다. 저는 새로 생성된 사용자를 관리자로 지정하였습니다.

4-5. 네트워크 설정을 진행합니다. 간단하게 이더넷을 켬으로 바꾸니 아래와 같이 설정됩니다. 그리고 Host Name은 이곳에서 변경이 가능합니다.

4-6. 시간대를 설정하여 줍니다.

5. 모든 설정이 완료되었으면 "설치 시작" 버튼을 클릭하여 설치를 진행합니다. 설치가 완료되면 "시스템 재시작" 버튼을 눌러 재시작하여 줍니다.

6. 재시작 후 아래와 같이 터미널이 나타나며, 생성한 계정으로 로그인을 할 수 있습니다.

설치를 마치며

예전에 제가 CentOS5 버전을 설치하는 글이 있었습니다. 

참고 : 2009.06.15 - [Programe Note/OS] - [CentOS5.2] Install

저도 오랫만에 새로운 버전으로 설치를 진행하였는데, 전보다 더 간편해지고 크게 어려운 부분은 없습니다. 일단 사용을 하면서 필요한 것들은 설치를 하고, 혹시 다시 재install을 진행한다면 이곳에 변경되는 부분을 남기도록 하겠습니다. Stream 버전이라고해서 크게 달라진 부분이 많은 것 같지 않아, 개인 서버로 사용할 사용자에게는 CentOS7 혹은 8보다는 최신 버전이 나을것 같다는 개인적인 생각입니다.

728x90
반응형
728x90
반응형

클로저란?

내부 함수가 정의될 때 외부 함수의 환경을 기억하고 있는 내부 함수를 말합니다. 외부 함수 안에서 선언된 내부 함수는 그 외부 함수의 지역 변수가 함수에 접근하여 사용할 수 있습니다. 클로저는 Javascript 고유개념은 아닙니다. 함수를 일급 객체로 취급하는 함수형 프로그래밍 언어에서 사용되는 특징중에 하나입니다. 그래서 ECMAScript 명세에 클로저의 정의는 없다고 합니다. MDN에서는 아래와 같이 정의를 하고 있습니다.

“A closure is the combination of a function and the lexical environment within which that function was declared.”
클로저는 함수와 그 함수가 선언됐을 때의 렉시컬 환경(Lexical environment)과의 조합이다.

역시나 말이 어렵습니다. 간단하게 다시 설명을 하면, 자바스크립트의 함수는 일종의 객체입니다. 그래서 다른 객체와 같이 임의의 키를 추가가 가능합니다. 클로저는 함수를 구성하는 코드와 함수가 생성될 당시의 스코프 환경(공식적으로 위에서 설명한 렉시컬 환경)으로 구성됩니다. 클로저는 스코프 환경을 알고 있기 때문에, 함수가 생성될 당시의 모든 변수를 기억해 두었다가 함수가 호출될 때 사용할 수 있습니다.

사용이유

클로저는 자바스크립트의 강력한 기능으로 비록 메모리 차원에서 손해를 볼 수 있긴하지만, 적극적으로 사용해야합니다. 아래의 이유로 사용을 할 수있습니다.

  1. 상태유지: 현재 상태를 기억하고 변경된 최신 상태를 유지할 수 있다.
  2. 전역 변수의 사용 억제: 상태 변경이나 가변 데이터를 피하고 오류를 피하는 안정성을 증가 시킬수 있다.
  3. 정보의 은닉: 클래스 기반 언어의 private 키워드를 흉내낼 수 있다.

각각의 예제는 아래 사이트를 통해서 확인 가능합니다.

https://poiemaweb.com/js-closure
 

Closure | PoiemaWeb

클로저(closure)는 자바스크립트에서 중요한 개념 중 하나로 자바스크립트에 관심을 가지고 있다면 한번쯤은 들어보았을 내용이다. execution context에 대한 사전 지식이 있으면 이해하기 어렵지 않

poiemaweb.com

 

 

참고사이트

https://hyunseob.github.io/2016/08/30/javascript-closure/
 

JavaScript 클로저(Closure)

클로저란?MDN에서는 클로저를 다음과 같이 정의하고 있다. 클로저는 독립적인 (자유) 변수를 가리키는 함수이다. 또는, 클로저 안에 정의된 함수는 만들어진 환경을 ‘기억한다’. 흔히 함수 내

hyunseob.github.io

https://developer.mozilla.org/ko/docs/Web/JavaScript/Closures
 

클로저 - JavaScript | MDN

클로저는 함수와 함수가 선언된 어휘적 환경의 조합이다. 클로저를 이해하려면 자바스크립트가 어떻게 변수의 유효범위를 지정하는지(Lexical scoping)를 먼저 이해해야 한다.

developer.mozilla.org

https://tislwlstnf.tistory.com/8
 

클로저의 의미와 사용하는 이유

클로저란? 클로저는 내부 함수가 정의될 떄 외부 함수의 환경을 기억하고 있는 내부 함수를 말합니다. 외부 함수 안에서 선언된 내부 함수는 그 외부 함수의 지역 변수나 함수에 접근하여 사용

tislwlstnf.tistory.com

https://medium.com/sjk5766/javascript-closure%EB%8A%94-%EC%99%9C-%EC%93%B8%EA%B9%8C-81bcdef6352
 

JavaScript Closure는 왜 쓸까?

쬐끔 알고 있던 Closure를 최근에 좀 더 알게 되었고, 음.. 근데 언제? 무슨 이유로 개발할 때 Closure를 쓸까 궁금해서 찾아보게 되었습니다. 검색해서 찾은 여러 글 들 중에 고개를 끄덕거린 답변을

medium.com

 

728x90
반응형
728x90
반응형

Hoist 라는 사전적 정의는 "(흔히 밧줄이나 장비를 이용하여) 들어 올리다, 끌어 올리다" 입니다. Javascript에서 호이스팅은 함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것을 말합니다. 클러저(Closuer)같은 문법들의 효용성을 이해하기 위해서 고전 Javascript가 가졌던 특징입니다. var 이나 let, const 로 정의된 변수나 함수선언문, 함수표현식이 유효범위의 최상단으로 끌어올려지는 것처럼 보여지는 현상인데, 실행 컨텍스트가 활성화 되었을때 해당 영역에서 변수의 이름을 메모리에 먼저 수집하는 현상으로 인해 발생하는 현상이라고 합니다. 

이렇게 이야기하니 너무 어렵네요. 간단하게 '유효범위 코드가 실행되기 전 메모리에 먼저 저장했던 선언문을 사용할 수 있다'는 의미입니다. 간단한 예제를 확인해 보겠습니다.

Javascript가 어떤 코드 구분을 실행하기 전에 함수 선언을 메모리에 저장하는 방식의 장점 중 하나는 코드에 선언하기 전에 함수를 사용할 수 있다는 것입니다. 간단한 예제를 만들어 보았습니다. 아래는 정상적으로 동작하는 코드입니다.

      function printName(name){
        console.log("My name is " + name);
      }

      printName("typiler");

이제, 함수를 작성하기 전에 함수를 호출하면 어떤 일이 있는지 살펴봅시다.

      printName("typiler2222");
      
      function printName(name){
        console.log("My name is " + name);
      }

비록 함수를 작성하기 전에 함수를 호출하였지만, 코드는 여전히 동작합니다. 이는 Javascript에서 컨텍스트 실행이 작동하는 방식 때문입니다. 

호이스팅은 다른 데이터 타입 및 변수와도 잘 작동합니다. 변수는 선언하기 전에 초기화하여 사용될 수 있습니다. 그러나 초기화 없이는 사용할 수 없습니다.

    cnt = 6;
    cnt += 5;
    var cnt;
    console.log(cnt);

cnt가 선언되지 않더라도 에러를 내지 않습니다. Javacript는 초기화가 아닌 선언만 끌어올립니다(Hoist). 만약 변수를 선언한 뒤 나중에 초기화시켜 사용한다면 그 값은 undefined로 지정됩니다. 아래 두 예제는 같은 동작을 보여줍니다.

    var i = 0;
    console.log(i + " " + j);
    var j = 0;

    var x = 7;
    var y;
    console.log(x + " " + y);
    y = 3;

이와 같은 호이스팅 때문에 의도한 결과가 나오지 않을 수도 있으니 개발 시 이부분에 대한 이해가 필요합니다.

더 많은 정보는 아래 사이트를 참고하여 주십시오. 여기까지 간단한 호이스팅에 대한 설명이였습니다. 

 

참고사이트

https://developer.mozilla.org/ko/docs/Glossary/Hoisting
 

Hoisting - 용어 사전 | MDN

호이스팅(hoisting)은 ECMAScript® 2015 언어 명세 및 그 이전 표준 명세에서 사용된 적이 없는 용어입니다. 호이스팅은 JavaScript에서 실행 콘텍스트(특히 생성 및 실행 단계)가 어떻게 동작하는가에 대

developer.mozilla.org

https://gmlwjd9405.github.io/2019/04/22/javascript-hoisting.html
 

[JavaScript] 호이스팅(Hoisting)이란 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

https://namu.wiki/w/%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85

 

 

 

728x90
반응형
728x90
반응형

브라우저는 컴퓨터 혹은 모바일에서 가장 많이 사용하는 소프트웨어일 것 입니다. 그렇다면 브라우저는 정보를 어떠한 과정을 걸쳐 화면에 표시하는것 일까요? 간단하게 알아보도록 하겠습니다.

 

브라우저의 주요 기능은 사용자가 선택한 자원을 서버에 요청하고 브라우저에 표시하는 것입니다. 자원은 보통 HTML 문서입니다. 브라우저는 HTML과 CSS 명세에 따라 HTML 파일을 해석해서 표시하는데 이 명세는 웹 표준화 기구인 W3C(World Wide Web Consortium)에서 정합니다. 브라우저의 구성요소는 사용자 인터페이스, 브라우저 엔진, 렌더링 엔진, 통신, UI 백엔드, 자바스크립트 해석기, 자료 저장소 등이 있습니다. 여기서 저는 화면을 표시하는 부분인 렌더링 엔진에 대해서 알아보도록 하겠습니다.

 

렌더링 엔진

렌더링 엔진의 역할은 요청 받은 내용을 브라우저 화면에 표시하는 일을 합니다. HTML 및 XML 문서와 이미지를 표시할 수 있습니다. 렌더링 엔진은 브라우저마다 다릅니다. 

 

렌더링 엔진은 통신으로부터 요청한 문서의 내용을 얻은 것으로 시작합니다. 아래는 기본 동작 과정을 요약한 그림입니다.

출처: https://d2.naver.com/content/images/2015/06/helloworld-59361-2.png

렌더링 엔진은 HTML 문서를 파싱하고 "콘텐츠 트리" 내부에서 태그를 DOM 노드로 변환합니다. 그 다음 외부 CSS 파일과 함께 포함된 스타일 요소도 파싱합니다. 스타일 정보와 HTML 표시 규칙은 "렌더 트리"라고 부르는 또 다른 트리를 생성합니다. 렌더 트리는 색상 또는 면적과 같은 시각적 속성이 있는 사각형을 포함하고 있는데 정해진 순서대로 화면에 표시됩니다.

렌더 트리가 끝나면 배치가 시작되는데 이것은 각 노드가 화면의 정확한 위치에 표시되는 것을 의미합니다. 다음은 UI 백엔드에서 렌더 트리의 각 노드를 가로지르며 형상을 만들어 내는 그리기 과정을 합니다. 일련의 과정들이 점진적으로 진행된다는 것을 아는 것이 중요합니다. 

 

동작 과정 상세 (예: 웹킷)

출처: https://d2.naver.com/content/images/2015/06/helloworld-59361-3.png

  1. HTML을 파싱하여 DOM 노드를 만듭니다. 이 DOM 노드들을 병합하여 DOM 트리를 만듭니다.
  2. CSS를 파싱하여, 스타일 규칙을 만듭니다.
  3. DOM 트리와 스타일 규칙을 사용하여, 어테치먼트 라는 처리를 하여 렌더 트리를 생성합니다.
  4. 렌더 트리를 배치합니다.
  5. 렌더 트리를 화면에 그립니다.

각 단계별로 자세한 설명은 아래의 참고사이트를 이용하면 자세한 설명이 있습니다. 가장 중요한 것은 아래 5단계입니다.

  1. DOM 파싱: HTML 마크업을 처리하고 DOM 트리를 생성
  2. CSS 파싱: CSS 마크업을 처리하고 스타일규칙 생성
  3. 어테치먼트: DOM 트리와 스타일 규칙을 결합하여 렌더 트리 생성
  4. 배치: 렌더 트리에서 각 노드의 기하학적 형를 계산
  5. 그리기: 개발 노드를 화면에 그림

 

참고사이트

https://d2.naver.com/helloworld/59361
https://chanyeong.com/blog/post/43
 

브라우저 렌더링과 최적화 - chanyeong

렌더링이란? 단어 그대로 렌더링이란 HTML, CSS, JavaScript 등 개발자가 작성한 문서들을 브라우저가 화면에 그려주는 동작을 말한다. 각 브라우저는 렌더링을 하기 위해 각각의 렌더링 엔진을 가지

chanyeong.com

https://beomy.github.io/tech/browser/browser-rendering/
 

[Browser] 브라우저 렌더링

이번 포스트에서는 브라우저가 화면을 렌더링 하는 과정에 대해 이야기할 것입니다. 렌더링 과정을 이해하면 웹페이지의 렌더링 최적화에 도움이 될 수 있겠죠? 렌더링 최적화 방법은 [Browser] Cr

beomy.github.io

 

 

 

728x90
반응형
728x90
반응형

VMware로 만들어진 CentOS 이미지를 기동하니 아래와 같은 에러 나타납니다. 오류 메시지는 아래와 같습니다.

This host supports Intel VT-x, but Intel VT-x is disabled.
(해석) 이 호스트는 Intel VT-x를 지원하지만 Intel VT-x는 비활성화되어 있습니다.

원인은 간단합니다. Intel VT-x 를 지원하는데 이 기능이 비활성화 되었있다는 내용입니다. 그렇다면 Intel VT-x 기능을 어떻게 활성화를 해야할까요? 방법은 간단합니다. 컴퓨터를 재기동하고 부팅화면에서 DEL 키 혹은 F2를 눌러 BIOS 로 진입니다. (PC마다 키는 다를 수 있습니다.)
이곳에서 CPU 설정관련 메뉴를 보면 Intel Virtualiztion Technology 가 Disabled 되어있는 것을 볼 수 있습니다. 이것을 Enabled 로 변경하고 변경을 저장하여 재부팅하면 됩니다. 제 PC의 경우 아래와 같이 변경을 하였습니다.


단, CPU설정에 가도 Intel Virtualiztion Technology 가 없는 경우가 있습니다. 이것은 BIOS를 최신 버전으로 업데이트 해서 나오는 경우가 있고, CPU가 Intel Virtualiztion Technology 를 지원하지 않는 경우 입니다.

CPU 지원 여부는 아래 링크를 통해서 확인 가능합니다.

https://ark.intel.com/content/www/us/en/ark/search/featurefilter.html?productType=873&2_VTX=true

Intel product specifications

Intel® product specifications, features and compatibility quick reference guide and code name decoder. Compare products including processors, desktop boards, server products and networking products.

ark.intel.com

728x90
반응형
728x90
반응형

많은 고민 끝에 VMware에 설치할 OS 를 선정하였습니다. CentOS Stream 8 입니다. 우분투를 한번도 사용하지 않아서 설치를 해볼까 했는데, 아무래도 서버를 공부하기에는 우분투보다는 CentOS가 더 좋을 것 같다는 생각이 들었습니다. CentOS는 아래와 같이 설명을 할 수 있습니다.

센트OS(영어: CentOS)는 센트OS 프로젝트에서 레드햇 제휴로 개발한 컴퓨터 운영 체제이다. 업스트림 소스인 레드햇 엔터프라이즈 리눅스와 완벽하게 호환되는 무료 기업용 컴퓨팅 플랫폼을 제공할 목적으로 만들어진 리눅스계 운영 체제 가운데 하나다. 6.4 버전부터 베타 버전은 파워PC에서 사용가능할 것으로 예상되지만, 공식적으로 물리 주소 확장 기능을 가진 x86과 x86-64 아키텍처를 지원한다. 레드햇 엔터프라이즈 리눅스의 소스 코드를 그대로 가져와 빌드해 내놓으며 이 과정에서 이루어지는 변형은 레드햇의 상표가 잘리고 그 자리에 CentOS의 상표가 붙는(상표권 분쟁을 피하기 위해) 정도뿐이다. 판수 또한 레드햇 엔터프라이즈 리눅스의 판수를 그대로 가져오며(소수점 아래 숫자는 업데이트 차수를 가리킨다) 오늘날에는 레드햇 엔터프라이즈 리눅스의 행보를 가장 잘 따라가는 운영 체제라고 알려져 있다. 

그런데 오랫만에 CentOS 설치를 하러 자료를 찾았는데, CentOS가 종료된다 라는 이야기가 있어서 자세히 찾아보았습니다. 내용을 요약을 하자면 아래와 같습니다.

  • CentOS 8은 2021년 12월 31일에 지원 중단
  • CentOS는 향후 CentOS Stream 으로 전환
  • CentOS Stream는 RHEL 업스트림 (개발) 배포판
  • CentOS 8 사용자는 앞으로 CentOS Stream로 전환하거나 운영 환경에서 사용한다면 RHEL로 전환
  • CentOS 7의 지원 기간은 종전과 동일한 2024년06월 30일

또한, 이전에 레드햇 계열 리눅스 리스주기는 Fedora –> RHEL –> CentOS 였는데, 앞으로의 릴리스는 CentOS Stream 이 Fedora와 RHEL 사이에서 마이너 릴리스를 테스트하는 업스트림 배포판 역할을 한다고 합니다. 즉, Fedora → CentOS Stream → RedHat Enterprise 로 변경되는 것입니다. 자세한 내용은 아래 링크를 참고하십시오.

http://www.opennaru.com/linux/centos-%EC%A2%85%EB%A3%8C/
 

CentOS 종료 는 2021년, 앞으로 CentOS Stream - Opennaru, Inc.

레드햇은 CentOS 종료 을 2021년 말에 할 것을 발표했습니다. CentOS 7은 계획대로 2024년까지 계속되지만, CentOS 8 사용자는 지원 종료 기간인 2021년 12월 31일까지 CentOS Stream 8로 마이그레이션 할 것을

www.opennaru.com

CentOS 7을 설치하려 했으나, CentOS 공식 사이트에 가보니 CentOS Stream 8이 있어서 최신 버전으로 생각되어 이 버전으로 설치를 진행하려 합니다. 일단 설치에 필요한 ISO 파일을 사이트에서 다운받습니다.

https://www.centos.org/download/
 

Download

As you download and use CentOS Linux, the CentOS Project invites you to be a part of the community as a contributor. There are many ways to contribute to the project, from documentation, QA, and testing to coding changes for SIGs, providing mirroring or ho

www.centos.org

1. 사이트에 접속하여 CentOS Stream 8 의 x86_64를 클릭하여 미러링 사이트(저는 Kaist 선택)를 클릭하여 ISO 파일을 다운로드한다. 다운로드는 "CentOS-Stream-8-x86_64-20210617-dvd1.iso" 파일을 다운로드합니다.

2. 다운로드가 완료되었으면 VMware 에서 새로운 가상머신을 만들어 줍니다. 그리고 설정은 아래의 그림들과 같이 진행을 합니다.

3번째 옵션을 선택하여 OS는 나중에 설치함으로 선택
OS를 Linux 선택하고 버전은 CentOS 8 64bit 로 선택한다.
가상머신의 이름과 VMware가 설치된 디렉토리를 지정한다.
용량은 40GB로 잡고 아래 옵션은 2번째"Split virtual dist into multiple files"를 선택한다.
Customize Hardware 버튼으로 H/W 설정 화면으로 이동한다.
메모리, 프로세서등 자신의 PC에 맞는 사양을 선택하고 DVD 에 앞에서 다운받은 ISO 이미지 파일을 선택한다.

이제 CentOS Stream 8 리눅스를 설치할 가상머신 환경이 만들어 졌습니다. 설치를 지정한 디렉토리에 가보면 여러개의 가상머신 관련 파일이 생성된 것을 확인할 수 있습니다.

다음 포스팅에서는 OS를 설치하는 과정을 알아보도록 하겠습니다.

728x90
반응형

+ Recent posts