
- Javascript에서 변수 생성 시 var를 사용하지 않게된 이유
- Javascript로만 웹개발을 해야하는 이유
- 자바스크립트 언어가 다른 개발언어와 갖는 차이점 또는 특징
위 세 가지 내용에 대해 알아보겠다.
너무 유명하지만 내가 자바스크립트 (이하 자스) 를 공부하면서 내 뇌에 정리된대로 말해보겠다..
++ 우선 모든 객체는 스코프를 갖는다.(스코프란 객체가 영향력을 펼치는 범위라고 생각하면 될 듯)
생성자마다 가진 스코프가 다르다. 블록스코프인지 전역스코프인지에 따라 영향력을 펼치는 범위가 달라지는데, let const등은 블록 스코프이다. 즉 {}안에서 신이 된다는 뜻.. 하지만 var는 함수 스코프라서 함수 내에 있으면 함수 내부에서 신이 되고 함수 외에 즉 전역에 있으면 전역 스코프를 가진다.
그리고 알아야하는것.. 바로 호이스팅이다. 호이스팅은 단순히 말하자면 코드 내 어딘가에서 선언된 변수나 함수가 코드 최상단으로 끌어올려지는 것이다.
2-1) 호이스팅을 확인하는 방법 1
선언한 함수나 변수를 선언하기 전 윗줄에서 호출 해보면 알 수 있다. 아마 initialization하기 전에 접근할 수 없다는 에러가 뜰거다. 이것은 변수나 함수가 존재하는건 알지만 초기값 설정이 되지않아서 사용할 수는 없다는 뜻이다.
2-2) 호이스팅을 확인하는 방법 2
함수선언문과 함수표현식이다.
뜬금없이 이게 왜 나오지 싶지만, 이 또한 호이스팅 발생여부에 따라 적절히 구분된 사용이 필요하다. 함수선언문(function으로 시작하는 문법)은 호이스팅이 일어난다. 함수에 대한 설명을 호출하는 코드 위 아래로 찾아보아야 한다는 것... 우리 눈을 아프게한다. 하지만 함수표현식으로 함수를 작성하면 이는 호이스팅이 일어나지않아 호출부를 항상 함수 뒤에 두어야한다. 함수를 찾아 코드 전체를 뒤질 필요가 없다는 것이다.
2-3) 그래서 var를 쓰면 왜 안돼?
var는 호이스팅이 되는 순간 undefined로 값이 초기화된다. 할당값을 가지지 않는다는 소리다. 복잡한 코드에서 갑자기 변수 하나가 초기화 돼서 결과가 안나온다면.. 허허 잘 모르지만 머리가 괴에에엥장히 아플거같다.
한가지 포인트가 더 있다. const든 var든 let이든.. 그냥 호이스팅 무시하고 선언해서 쓰면 되는 거 아닌가? 난 되던데? 아니다.. 단순히 실습 수준에서 쓰는 코드들은 복잡해봤자다.. 내가 선언한 변수가 갑자기 이상한 값을 가진채로 코드를 돌아다닌다면.. 나의 협엽자는 극대노할수도 있다.
결론적으로 ! var는 사용하지 않는 게 좋다. const로 바꾸지않아야 할 변수들을 선언하고 let으로 변동이 있는 변수들을 선언하는 것이.. 우리가 살 길이다..
자바스크립트는 웹페이지에서 복잡한 기능을 구현할 수 있도록 하는 스크립팅 언어 or 프로그래밍 언어다. 옛날 웹 페이지는 텍스트 > 텍스트 인 하이퍼텍스트로만 구성되어 있었지만, 자스가 자리 잡은 이후로 어떤 상호작용(버튼 클릭같은거)으로 일어나는 모든 일을 컨트롤 할 수 있게 되었다.
아래는 자스의 3가지 특징
1 ) 프로토 타입 기반 객체 지향 프로그래밍 언어 : 객체를 생성하고 상속하는 방식이 다른 객체 지향 언어들과 다르다.
프로토 타입?
이를 통해 객체는 다른 객체의 메서드와 속성을 상속받을 수 있다. 메모리 절약과 코드의 재사용성을 높여줌.
인스턴스?
생성자 함수를 통해 생성된 객체를 의미함.
객체 생성 방법?
- 객체 리터럴 {} 사용
- 생성자 함수 사용
- 클래스 문법 사용
- Object.create 메서드 사용
객체 지향?
참고 사이트
객체는 프로그램에 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미한다. 다른 말로, 값을 저장할 변수와 작업을 수행할 메소드를 서로 연관된 것들끼리 묶어서 만든 것을 객체라고 한다.
객체가 레고라면 레고로 뭔가를 만드는 방식이 객체지향 프로그래밍이라고 할 수 있다.
객체지향의 조건
- 추상화 : 객체에서 공통된 속성과 행위를 추출해 타입을 정의하는 과정
여러 파생되는 세부적인 부분을 정의하기 전에 추상적인 이데아를 코드로 구현해놓는 것
- 상속 : 상위클래스의 속성과 행위를 하위클래스에 물려주는 것
- 다형성 : 하나의 변수명, 함수명이 상황에 따라 다른 의미로 해석될 수 있는 것
- 캡슐화 : 데이터 구조와 데이터를 다루는 방법들을 결합시켜 묶는 것 (변수+함수)
2 ) 동적이며 타입을 명시할 필요가 없는 인터프리터 : 인터프리터 언어는 컴파일 작업을 거치지 않고 소스코드를 바로 실행할 수 있다. 왜냐하면 웹 브라우저에 포함된 자바스크립트 인터프리터가 소스코드를 직접 해석하여 바로 실행해주기 때문이다.
예를 들어 C언어는 소스파일을 작성한 후 해당 파일을 컴파일하여 사용자가 실행할 수 있는 실행파일(.exe)로 만들어 사용한다.
++자바스크립트는 인터프리터언어지만 자바는 컴파일언어다.
3 ) 객체 지향형 프로그래밍과 함수형 프로그래밍 모두 표현 가능
객체지향형 프로그래밍은 앞서 설명한 것과 같다.
함수형 프로그래밍은 뭘까? 바로 대입문을 사용하지 않는 프로그래밍이다.
iteration(10, add(num));
위와 같은 코드가 있다고 치자.
iteration함수는 10번 동안 add()를 하라는 전달인자를 받았다. 이처럼 add()라는 함수를 매개변수 자리로 받을 수 있다. 이는 "Javascript에서 함수는 1급 객체"이기 때문이다.
좀 더 정확히 말해서 함수형 프로그래밍의 특징은 다음과 같다.
부수 효과가 없는 순수 함수를 1급 객체로 간주하여
매개변수나 리턴값으로 사용할 수 있고, 참조 투명성을 지킬 수 있다.
- 부수효과 : 변수 값 변경, 제자리에서 자료구조 수정, 객체 필드값 설정,
예외나 오류 존재, 콘솔 또는 파일 I/O 발생
- 순수함수 : 부수효과가 없는 함수.
Thread에 안정성을 보장받고, 병렬처리를 동기화 없이 진행 가능.
- 1급 객체 : 변수나 데이터 구조 안에 담을 수 있고,
파라미터나 반환값으로 사용가능.
할당에 사용된 이름과 무관하게 고유한 구별이 가능.
- 참조 투명성 : 동일한 인자에 대해 항상 동일한 결과를 반환하는 것.