객체(Object)

- 자바스크립트의 기본 타입(Data type)은 객체(Object)이다.

- 객체는 key와 value가 한 쌍으로 구성된 프로퍼티(Property)가 0개 이상인 정렬되지 않은 집합이다.

- 프로퍼티의 값으로 함수가 올 수도 있다 -> 이런 프로퍼티를 메소드(method)라고 부른다.(실제 메소드X)

- 숫자, 문자열, 불리언, undefiend 타입을 제외한 모든 것이 객체

- Primitive(숫자, 문자열, 불리언) 타입은 값이 정해진 객체로 취급되어, 객체로서의 특징도 가지게 된다.

- JSON 객체를 표현하기 위한 표준 중 하나이다.

- Property Key, Property Value

- 인스턴스(Instance) : 객체가 메모리에 저장되어 실제로 존재하는 것

name, age라는 property key를 가지고 있는 person 객체

 

 

프로퍼티(Property)

- key와 value으로 구성된 집합

 

(1) 프로퍼티 키(Property Key)

- 프로퍼티 값에 접근할 수 있는 이름

- 식별자 역할

- 식별자 네이밍 규칙을 따르지 않아도 되지만, 그렇게 되면 따옴표를 사용해주어야 하기 때문에 따르는 것이 좋다.

- 문자열, Symbol

ex. {'let': '문자열이지만, 권장되지 않는 키 네임'}

ex. let obj = {name: 'hong', name: 'kim'} -> console.log(obj)에서 kim 출력

ex. let obj = {name: 'hong'} -> console.log(obj.address) 찾는 key가 없기 때문에 undefined 출력

 

(2) 프로퍼티 값(Property Value)

- 자바 스크립트에서 value으로 인식되는 모든 것이 다 가능하다. 

- 문자열, 숫자, 함수(function)

- 함수도 가능하다.(메소드라고 부르긴 하는데 실제 메소드는 X) 

 

 

프로퍼티 동적 추가

- 점 표기법(Dot Notation) ->

- 괄호 표기법(Bracket Notation) -> []

 

프로퍼티 동적 삭제

- delete keyword

 

프로퍼티 접근

- 대괄호 프로퍼티 접근 연산자를 사용 할 경우, 프로퍼티 키를 반드시 따옴표로 감싸주어야 한다.

- 감싸지 않는 경우, 자바스크립트 엔진이 프로퍼티 키를 식별자로 해석하기 때문


객체 생성 방법

 

1. 객체 리터럴 (Object Literal)

- 가장 간단한 방법 {} 사용

- 단점은 똑같은 객체를 여러 개 만들어야 한다. 

- 변수가 할당되는 시점에 엔진이 객체 리터럴을 해석해서 객체 생성

 

2. Object() 객체 생성자 함수

- 자바스크립트 내장 함수

- Object 객체는 자바스크립트의 최상위 객체이다.

- 자바스크립트의 모든 기본 내장 객체는 Object 객체를 기본으로 만들어진다.

 

3. 생성자 함수(User Defined)

- 함수를 통해서 객체를 생성하는 방식

- 객체를 만들 때마다 프로퍼티에 대한 공간이 메모리에 할당되어서 비효율적

- 일반 함수와 생성자 함수를 구분하기 위한 일반적 약속

- 일반 함수 : 첫글자(소문자)

- 생성자 함수 : 첫글자(대문자)

 

4. Object.create() method

5. ES6 -> class

 


객체 리터럴 확장 방식

- ES6에서 추가

 

User Define(사용자 정의) 생성자 함수로 객체 생성

const person1 = Person();
console.log(person1); // undefined

const person2 = new Person(); // new를 붙여서 생성자 함수로 호출 -> 내부적으로 Instance를 만든다
console.log(person2); // Person {}

const person3 = {}; // 일반 객체
console.log(person3); // {} 

// new 생성자 함수로 호출
// 내부적으로 Instance를 만들어준다.
// 안에 아무거나 없으면
// this를 바인딩해서 this를 리턴해준다.

 

 

변수명 표기법(Naming Convention)

 

 

카멜 표기법(Camel Case)

- 주로 Java에서 사용

- 앞 단어를 제외한 단어의 첫 번째를 대문자로 표기한다.

- firistName

 

파스칼 표기법(Pascal Case)

- 모든 단어의 첫 번째를 대문자로 표기한다.

- FirstName

 

스네이크 표기법(Snake Case)

- 주로 C에서 사용

- 모든 단어는 소문자, 단어를 구분하기 위해 _ 사용

- first_name

 

헝가리안 표기법(typeHungarian Case)

- 접두어에 자료형을 표기해준다.

- strFirstName

var const let 차이

  var const let
범위 Function Scope Block Scope
값 재정의 O X O
재선언 O X X

 

var

- 중복 선언이 가능하다.

- var는 function scope 생성


let, const

- ES6에 도입

- const는 재할당 불가능

1) 중복 선언이 되지 않는다.

 

2) Block level Scope

- 블록 안에서만 사용 가능하다.

 

3) let을 이용하면 호이스팅이 되지 않는 것 처럼 동작한다.

 

4) let으로 변수를 선언하면 변수를 일시적으로 사용할 수 없는 구간인 일시적 데드존 TDZ(Temporal Dead Zone)이 생긴다.

 


Primitive Value의 불변한(immutable) 특성

- var scope를 선언하고, scope에 80을 할당하면 아래 그림과 같이 생각할 수 있다.

- 하지만 primitive value는 불변의 특성을 가지고 있기 때문에, 값이 바뀌는 것이 아니라 주소 값이 바뀐다.

- 그리고 원래 사용되지 않는 주소 값들은 가비지컬렉터를 사용해서 메모리를 할당 해제(가비지 컬렉션 GC)한다.

 

템플릿 문자열

- 백틱(`)을 사용해서 새로운 문자열 생성 가능

var string = num1 + ' + ' + num2 + ' = ' + result;

const string = `${num1} + ${num2} = ${result}`;

메모리(Memory)

- 데이터를 저장할 수 있는 메모리 셀(Memory Cell)의 집합체

 

 

변수(Variable)

- 애플리케이션서 값에 상징적인 이름으로 변수를 사용한다.

- 변수명 = 식별자

 

 

식별자(Identifier)

- 코드 내의 변수, 함수 혹은 속성을 식별하는 문자열

- 식별자가 실제로 갖고 있는 값은 메모리 값이다.

- Naming rule : $, - 사용 가능, 숫자 시작 불가능, 특수 문자 불가능

- CPU(Central Processing Unit) 중앙 처리 장치 : 연산에 사용

- memory 주소를 알아야 variable을 이용해서 해당 메모리 사용 가능

- 메모리에 대한 직접 접근을 막고있기 때문에 변수 선언을 해주어야 한다.

 

 

변수 생성 방법 

- ES6 이전

- function level scope 함수 기준 스코프

(1) var 

 

- ES6 이후

- block level scope 블록 기준 스코프

(1) let

(2) const

 

 

ex. var score;

scope = 80;

scope = 100;

 

실행 컨텍스트(Execution Context)

- 실행 가능한 코드를 형상화하고 구분하는 추상적인 개념

- 코드를 실행하기 위해서는 해당 코드에 대한 정보를 가지고 있어야 한다.

 

ex. score가 0x2763을 가르킨다는 것은 어떻게 알 수 있는지??

-> 실행 컨텍스트가 정보를 가지고 있다.

 

- 전역 컨텍스트(Global Context)

- 함수 컨텍스트(Functional Context)

 

 

undefined

- primitive value(원시 값)중 하나

- JS Engine에 의해 사용된다.

- 개발자가 직접 사용하는 것은 지양한다.

- 변수를 초기화할 때 사용한다.

 

 

변수 호이스팅(Variable hoisting)

- 함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위(Scope)의 최상단에 선언하는 것

- 자바 스크립트의 특징

- var 변수 선언과 함수 선언문에만 호이스팅이 일어난다. (function scope)

- 자바 스크립트는 식별자를 먼저 확인한다.

- 변수 선언을 runtime 이전에 수행하고, 함수 위로 끌어올려준다.

- 자바 스크립트에 나오는 모든 식별자들은 호이스팅된다.

function getX() {
  console.log(x); // undefined
  var x = 100; // var x 호이스트
  console.log(x); // 100
}
getX();


foo( );
var foo = function( ) {
  console.log(‘hello’);
};
// type error
  • 1. 함수 선언문은 항상 자바스크립트 엔진 구동시 가장 최우선으로 해석되어 호이스팅된다.
    • 함수 선언을 호이스팅해서 global 객체에 등록시키기 때문에 출력
  • 2. 함수 표현식은 런타임 과정에서 이루어지기 때문에 호이스팅 X
    • 함수 리터럴을 할당하기 때문에 런타임 환경에서 type error

타입스크립트(TypeScript)
- 2012년 MS에서 구현한 JavaScript의 슈퍼셋(Superset) 프로그래밍 언어 // ECMAScript의 super.set

- 클래스 기반 객체지향언어

- 확장자 .ts

- 컴파일의 결과물로 JavaScript 코드 출력이라고 할 수 있지만, 컴파일은 "기계어로 번역하는 과정"을 뜻한다.

- TypeScript -> Compile(X) Transpile(변환) -> JavaScript

- JavaScript에는 추상 클래스가 없다. TypeScript를 가지고 추상 클래스로 구현하면 JavaScript에서 같은 기능을 내줄 수 있다.

- NPM이 필요하다. -> Node.js 설치 필요

 

 

타입스크립트의 장점

- 정적 타입을 명시할 수 있다.

- 생산성 향상 : 자바스크립트에 비해 변수나 함수 등의 목적을 더욱 명확하게 전달할 수 있다.

 

 

Node.js

- 오픈소스 JavaScript 엔진인 크롬 V8에 비동기 이벤트 처리 라이브러리인 libuv를 결합한 플랫폼

- Javascript으로 브라우저 밖에서 서버를 구축하는 등의 코드를 실행할 수 있게 해주는 런타임 환경

- NPM을 통해서 Node.js의 패키지를 관리할 수 있다.

- Transpiler : TypeScript

- 자동화 도구 : Build, Test, Deploy를 자동화 -> gulp

- 모듈화 : webpack

- 프레임워크 : Angular, React, Vue.js

- V8 엔진 사용(Chrome)

 

 

NPM(Node Package Manager)

- Node.js의 패키지를 관리해주는 도구

- Node.js 설치시 자동으로 설치된다.

- TypeScript를 사용할 때 필요하다.

자바스크립트(Javascript)

- 객체기반의 스크립트 프로그래밍 언어

- 웹 브라우저 내에서 주로 사용

- 웹 브라우저로만 동작하는 것이 아닌, 서버로도 이용이 가능하다. -> Host API 필요

- 웹에서 사용 가능한 언어를 만들기 위해 프로토타입 기반의 함수형 언어로 만든 언어

- 모카(mocha) -> 라이브스크립트(LiveScript) -> 자바스크립트(Javascript)

-> 표준화 진행 -> 비영리표준기구(ECMA) -> ECMAScript 이름으로 표준화

 

 

JavaScript와 ECMAScript는 같지 않다

- JavaScript = ECMAScript + Client Side Web API(ex.DOM) [FRONT]

                                              + Host API                                   [SERVER]

 

 

ECMAScript

- ECMAScript 2015(버전) = ES6(배포판)

- ES6을 쓰는 이유? : 5에서 6으로 많은 변화가 있었기 때문이다. 그 이후로는 언어가 변한 것 보다는 기능의 추가 정도가 이루어졌다.

 


자바스크립트의 단점 -> fragmentation 현상 

(1) 언어의 모호성

(2) 구현의 어려움

 

 

제이쿼리(jQuery)

- 오픈 소스 기반의 자바스크립트 라이브러리

- 브라우저와 상관없이 동일하게 동작시킬 수 있다는 장점으로, JavasScript가 인기가 많아진 이유중 하나이다.

- 문제점 : 프레임워크가 아닌, 라이브러리라는 한계 -> 라이브러리를 통해 유지 보수하기 어렵다는 문제점

 

 

HTML(HyperText Markup Language) 하이퍼텍스트 마크업 언어

- 프로그래밍 언어 X

- 웹페이지가 어떻게 구조화되어 있는지 브라우저로 알 수 있게 해주는 마크업 언어

- W3C(World Wide Web Consortium)에서 표준 제정

- HTML의 한계인 정형성과 확장성 문제로, 한동안 HTML4.01에서 업데이트를 하지 않았다.

(1) 정형성 : 정답이 없기 때문에 정형성이 없고, 올바르지 않은 코드도 실행이 되기 때문에 유지 보수의 문제점 발생

(2) 확장성 : 정해진 태그로 확장하기 힘들다는 단점

 

 

HTML의 확장성과 정형성 문제 해결

(1) HTML + XML -> XHTML1.0

(2) HTML 보완 -> HTML5 

- HTML5 2014년 표준화

 

 

HTML5

- HTML의 새로운 버전으로 Client Side Technology 기술의 중심이 되는 마크업 언어

- JavaScript의 인기가 많아지기 시작했다.

 

 

운영체제

- 컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층

- 모든 컴퓨터 시스템의 필수적인 부분

- 강의 목표 : 운영체제의 개념과 역할, 운영체제를 구성하는 각 요소 및 그 알고리즘의 핵심적인 부분에 대해 기초부터 학습

 

(1) 운영체제와 소프트웨어 또는 사용자와 어떻게 상호작용?

(2) 하드웨어를 어떻게 인터페이스 해야하는지?

 

운영 체제의 목표

- 컴퓨터 시스템을 편리하게 사용할 수 있는 환경 제공

- 컴퓨터 시스템의 자원을 효율적으로 관리(프로세서, 기억장치, 입출력 장치 등등)

ex. 자원이 부족할 경우, 실행중인 프로그램들에게 짧은 시간의 CPU 할당

ex. 실행중인 프로그램들에 메모리 공간을 적절히 분배


운영체제 소개

좁은 의미의 운영체제

- 커널(Kernel)

- 운영체제의 핵심 부분으로 메모리에 상주하는 부분

- 주로 운영체제를 뜻하는 것은 이 부분

 

넓은 의미의 운영체제

- 커널을 포함해서, 각종 주변 시스템 유틸리티를 포함한 개념

 

운영 체제의 분류

(1) 동시 작업 가능 여부

- 단일 작업(single tasking) : 한 번에 하나의 작업만 처리, MS-DOS

- 다중 작업(multi tasking) : 동시에 두 개 이상의 작업 처리, UNIX, MS Windows

 

(2) 사용자의 수

- 동시에 접속할 수 있는지? 여부

- 단일 사용자(single user) : MS-DOS, MS Windows

- 다중 사용자(multi user) : UNIX, NT server

 

(3) 처리 방식

- 일괄 처리(batch processing) 

-> 작업 요청을 모아서 한꺼번에 처리, 작업이 완전 종료 되기 전까지 기다려야 한다.

-> 한 번 돌아갈 때마다 시간이 오래 걸리기 때문에, 작업이 오류가 나지 않는 것이 중요했다.

 

- 시분할(time sharing)

-> 여러 작업을 수행할 때 컴퓨터 처리 능력을 일정한 시간 단위로 분할

-> 일괄 처리보다 빠른 응답 시간

-> interactive

 

- 실시간(RealTime OS)

-> (데드라인)정해진 시간 안에 어떠한 일이 반드시 종료됨이 보장되어야 한다.

-> hard realtime system(경성 실시간 시스템)

-> soft realtime system(연성 실시간 시스템)

 

용어 정리

- Multitasking : 하나의 프로그램이 종료되기전에 다른 프로그램이 실행되는 것

- Multiprogramming : 여러 프로그램이 메모리에 올라가 있는 것을 강조

- Time sharing : CPU를 분할하여 나누어 쓰는 의미 강조

- Multiprocess : 하나의 컴퓨터에 CPU(processor)가 여러 개 붙어 있는 것을 의미

 


운영 체제의 예시

 

유닉스(UNIX)

- 대형 컴퓨터를 위해 만들어짐 -> multitasking

- 유닉스를 만들기 위한 C 언어 등장 /  높은 이식성(portability) / 최소한의 커널(운영체제) 구조

 

DOS(Disk Operating System)

- MS사에서 만든 단일 사용자용 운영체제

- 메모리 관리 능력의 한계(주 기억 장치 : 640KB)

 

MS Windows

- MS사의 다중 작업용 GUI 기반 운영체제

- Plug and Play, 네트워크 환경 강화

- 불안정성

- 풍부한 자원 소프트웨어

 


운영 체제의 구조

 

CPU 스케줄링

- 누구한테 CPU를 줄 것인지?

- 처리시간이 긴 것들을 먼저 처리하는 것보다 빠른 것을 먼저 처리하면 평균 속도가 줄어든다.

 

메모리 관리

- 한정된 메모리를 어떻게 쪼개서 쓸 것인지?

- 어떤 메모리를 내보낼 것인지?

 

파일 관리

- 디스크에 파일을 어떻게 보관할 것인지?

 

입출력 관리

- 각기 다른 입출력 장치와 컴퓨터 간에 어떻게 정보를 주고 받게 할 것인지?

- 인터럽트(interrupt) 사용

'CS > 운영체제' 카테고리의 다른 글

[운영체제] Swap memory 스왑 메모리  (1) 2023.12.19
[운영체제] 운영체제 요약 정리  (0) 2023.07.09

문제 

- 임의의 N개의 숫자가 주어진다.

- 오름차순으로 정렬하고, M의 값이 주어진 상태에서 M이 몇 번째에 있는지 프로그램 작성

- 이분 탐색 사용

- lt와 rt를 생성 후, 왼쪽과 오른쪽의 위치가 바뀔 때까지 왼쪽와 오른쪽의 중간값을 M과 비교한다.

 

import java.util.Arrays;
import java.util.Scanner;
public class Solution {
    public static int solution(int n, int m, int[] arr){
        int answer = 0;
        Arrays.sort(arr);
        int lt = 0;
        int rt = n-1;

        while(lt<=rt){ // 왼쪽이 오른쪽으로 가면 해제
            int mid = (lt+rt)/2;
            if(arr[mid]==m){
                answer = mid+1;
                break;
            } else if(arr[mid]<m){ // 왼쪽
                lt = mid +1;
            } else if(arr[mid]>m){ // 오른쪽
                rt = mid -1;
            }
        }

        return answer;
    }
    public static void main(String[] args) {
        Solution T = new Solution();
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); // 수 개수
        int m = sc.nextInt(); // 구하는 수
        int[] arr = new int[n];
        for(int i=0; i<n; i++){
            int num = sc.nextInt();
            arr[i] = num;
        }
        System.out.println(T.solution(n,m,arr));
    }
}

+ Recent posts