본문 바로가기

프로그래밍언어68

[모던 자바스크립트 Deep Dive] 15장 let, const 키워드와 블록 레벨 스코프 15.1 var 키워드로 선언한 변수의 문제점 15.1.1 변수 중복 선언 허용 var 키워드로 선언한 변수는 중복 선언이 가능하다. var x = 1; var y = 1; //var 키워드로 선언된 변수는 같은 스코프 내에서 중복 선언을 허용한다. //초기화문이 있는 변수 선언문은 자바스크립트 엔진에 의해 var 키워드가 없는 것처럼 동작한다. var x = 100; //초기화문이 없는 변수 선언문은 무시된다. var y; console.log(x); //100 console.log(y); //1 15.1.2 함수 레벨 스코프 var 키워드로 선언한 변수는 오로지 함수의 코드 블록만을 지역 스코프로 인정한다. var x = 1; if(true) { //x는 전역 변수다. 이미 선언된 전역 변수 x가 있.. 2023. 8. 11.
[모던 자바스크립트 Deep Dive] 14장 전역 변수의 문제점 14.1 변수의 생명 주기 14.1.1 지역 변수의 생명 주기 변수는 선언에 의해 생성되고 할당을 통해 값을 갖는다. 그리고 언젠가 소멸한다. 즉, 변수는 생명 주기가 있다. 전역 변수의 생명 주기는 애플리케이션의 생명 주기와 같다. 지역 변수의 생명 주기는 함수의 생명 주기와 일치한다. var x = 'global'; function fofo() { console.log(x); //undefined var x = 'local'; } foo(); console.log(x); //global 지역 변수는 함수 전체에서 유효하다. 단, 변수 할당문이 실행되기 이전까지는 undefined 값을 갖는다. 14.1.2 전역 변수의 생명 주기 전역 코드는 함수 호출과 같이 전역 코드를 실행하는 특별한 진입점이 없고.. 2023. 8. 10.
[모던 자바스크립트 Deep Dive] 13장 스코프 13.1 스코프란? 스코프는 변수 그리고 함수와 깊은 관련이 있다. var 키워드로 선언한 변수와 let 또는 const 키워드로 선언한 변수의 스코프도 다르게 동작한다. function add(x, y){ //매개변수는 함수 몸체 내부에서만 참조할 수 있다. //즉, 매개변수의 스코프(유효범위)는 함수 몸체 내부다. console.log(x, y); //2 5 return x + y; } add(2, 5); //매개변수는 함수 몸체 내부에서만 참조할 수 있다. console.log(x, y); //ReferenceError: x is not defined 모든 식별자는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유호 범위가 결정된다. 이를 스코프라 한다. 즉, 스코프는 식별자.. 2023. 8. 9.
[모던 자바스크립트 Deep Dive] 12장 함수 12.1 함수란? 함수는 자바스크립트에서 가장 중요한 핵심 개념 수학의 함수는 "입력"을 받아 "출력"을 내보내는 일련의 과정을 정의한 것이다. 예를들어 f(x, y) = x + y 라는 함수를 정의하고 이 함수에 두 개의 입력 2, 5를 전달하면 함수는 정의된 일련의 과정, 즉 x + y를 실행하여 7을 출력한다 //함수 정의 //f(x + y) = x + y function add(x, y){ return x + y; } //함수 호출 //f(2, 5) = 7 add(2, 5); //7 프로그래밍 언어의 함수는 일련의 과정을 문statement으로 구현하고 코드 블록으로 감싸서 하나의 실행 단위로 정의한 것이다. 함수는 함수 정의를 통해 생성한다. 함수 정의만으로 함수가 실행되는 것은 아니다. 인수를.. 2023. 8. 8.
[모던 자바스크립트 Deep Dive] 11장 원시 값과 객체의 비교 원시 값을 갖는 변수를 다른 변수에 할당하면 원시 값이 복사되어 전달된다. => 값에 의한 전달 객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달된다. => 참조에 의한 전달 11.1 원시값 11.1.1 변경 불가능한 값 원시 타입의 값, 즉 원시 값은 변경 불가능한 값이다. 원시 값은 변경 불가능하다는 말은 원시 값 자체를 변경할 수 없다는 것이지 변수 값을 변경할 수 없다는 것이 아니다. const o = {}; //const 키워드를 사용해 선언한 변수에 할당한 원시값(상수)는 변경할 수 없다. //const 키워드를 사용해 선언한 변수에 할당한 객체는 변경할 수 있다. o.a = 1; console.log(o); //{a: 1} 변수 값을 변경하기 위해 원시 값을 재할당.. 2023. 8. 7.
[자바의 정석] 11. 컬렉션 프레임웍 - Properties / Collection 1.12 Properties Properties는 HashMap의 구버전인 Hashtable을 상속받아 구현한 것으로, Hashtable은 키와 값을 (Object, Object)의 형태로 저장하는데 비해 Properties는 (String, String)의 형태로 저장하는 보다 단순화된 컬렉션 클래스이다. 주로 애플리케이션의 환경설정과 관련된 속성(property)을 저장하는데 사용되며 데이터를 파일로부터 읽고 쓰는 편리한 기능을 제공한다. 그래서 간단한 입출력은 Properties를 활용하면 몇 줄의 코드로 쉽게 해결될 수 있다. Properties는 Hashtable을 상속받아 구현한 것이라 Map의 특성상 저장순서를 유지하지 않는다. *Iterator가 아닌 Enumeration을 사용 1.13 .. 2023. 8. 7.
[자바의 정석] 11. 컬렉션 프레임웍 - HashMap과 Hashtable / TreeMap 1.10 HashMap과 Hashtable HashMap은 Map을 구현했으므로 앞에서 살펴본 Map의 특징, 키(key)와 값(value)을 묶어서 하나의 데이터(entry)로 저장한다는 특징을 갖는다.(Hashtable은 Vector같은 존재 가능하면 HashMap사용) 그리고 해싱(hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보인다. 키(key) : 컬렉션 내의 키(key) 중에서도 유일해야 한다. 값(value) : 키(key)와 달리 데이터의 중복을 허용한다. 해싱과 해시함수 해싱이란 해시함수(hash function)를 이용해서 데이터를 해시테이블(hash table)에 저장하고 검색하는 기법을 말한다. 해시함수는 데이터가 저장되어 있는 곳을 알려 주기.. 2023. 8. 7.
[자바의 정석] 11. 컬렉션 프레임웍 - HashSet / TreeSet 1.8 HashSet Set인터페이스를 구현한 가장 대표적인 컬렉션. 중복된 요소를 저장하지 않는다. HashSet의 특징을 이용하면 컬렉션 내의 중복 요소들을 쉽게 제거 가능 저장순서를 유지하지 않음. → 저장순서 유지하는 LinkedHashSet 사용 Set을 구현한 컬렉션 클래스는 List를 구현한 컬렉션 클래스와 달리 순서를 유지하지 않기 때문에 저장된 순서와 다를 수있다. 중복제거와 동시에 저장순서를 유지하고싶다면 LinkedHashSet을 사용 import java.util.*; class HashSet{ public static void main(String[] args){ Object[] objArr = {"1", new Integer(1), "2", "2", "3", "3", "4", ".. 2023. 8. 6.
[자바의 정석] 11. 컬렉션 프레임웍 - Arrays / Comparator와 Comparable 1.6 Arrays Arrays클래스에는 배열을 다루는데 유용한 메서드가 정의되어 있다. ❗Arrays에 정의된 메서드는 모두 static메서드이다. Arrays에 정의된 toString() static String toString(Object[] a) static String toString(int[] a) //그외 기본형 배열의 복사 - copyOf(), copyOfRange() copyOf() - 배열의 전체를 복사해서 새로운 배열을 만들어 반환 copyOfRange() - 배열의 일부를 복사해서 새로운 배열을 만들어 반환(끝은 포함x) int[] arr = [0,1,2,3,4}; int[] arr2 = Arrays.copyOf(arr, arr.length); //arr2=[0,1,2,3,4] in.. 2023. 8. 6.
[자바의 정석] 11. 컬렉션 프레임웍 - Iterator, ListIterator, Enumeration 1.5 Iterator, ListIterator, Enumeration 컬렉션에 저장된 요소를 접근(읽어오기)하는데 사용되는 인터페이스 Enumeration - Iterator의 구버전 / Listlterator - Iterator의 기능을 향상 시킨 것 Iteerator 컬렉션 프레임웍에서 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화하였다. 컬렉션에 저장된 각 요소에 접근하는 기능을 가진 Iterator인터페이스를 정의하고, 컬렉션 인터페이스에는 ‘Iterator(Iterator를 구현한 클래스의 인스턴스)’를 반환하는 iterator()를 정의하고 있다. public interface Iterator{ boolean hasNext(); Object next(); void remove(); } pu.. 2023. 8. 6.
[자바의 정석] 11. 컬렉션 프레임웍 - Stack과 Queu 1.4 Stack과 Queue 스택은 마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 LIFO(Last In First Out)구조로 되어있다. 큐는 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO(First In First Out)구조로 되어있다. 순차적으로 데이터를 추가하고 삭제하는 스택에는 ArrayList와 같은 배열기반의 컬렉션 클래스가 적합. 큐는 데이터의 추가/삭제가 쉬운 LinkedList로 구현하는 것이 적합. 스택(Stack)은 클래스로 구현하여 제공하고 있음(Stack st = new Stack();) 큐(Queue)는인터페이스로만 정의해놓음 큐 인터페이스를 구현한클래스들을 사용하면 됨(Queue q = new LinkedList();) 스택과 큐의 활용 스택의 활용 예 수식계.. 2023. 8. 6.
[자바의 정석] 11. 컬렉션 프레임웍 - LinkedList 1.3 LinkedList 배열은 가장 기본적인 형태의 자료구조로 구조가 간단하며 사용하기 쉽고 데이터를 읽어오는데 걸리는 시간(접근시간, access time)이 가장 빠르다는 장점을 가지고 있다. 단점 1. 크기를 변경할 수 없다. 크기를 변경할 수 없으므로 새로운 배열을 생성해서 데이터를 복사해야한다. 실행속도를 향상시키기 위해서는 충분히 큰 크기의 배열을 생성해야 하므로 메모리가 낭비된다. 2. 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다. 차례대로 데이터를 추가하고 마지막에서부터 데이터를 삭제하는 것은 빠르지만, 배열의 중간에 데이터를 추가하면, 빈자리를 만들기 위해 다른 데이터들을 복사해서 이동해야 한다. 이러한 배열의 단범을 보완하기 위해 링크드 리스트(linked list)라는.. 2023. 8. 6.