Programming Language
[C] Register / Volatile
[C] Register / Volatile
2022.03.22Register CPU가 자신과 가장 가깝게 가지고 있는 기억장치를 Register라고 한다. 메모리에 저장된 변수보다 레지스터에 저장된 변수를 읽어오는 것이 훨씬 빠르다. 빠르니까 다 레지스터에 넣으면 좋겠지만... 레지스터에 넣을 수 있는 변수는 한정되어있다. 레지스터에 어떤 변수를 넣을지는 컴파일러가 결정하고, 컴파일러에게 특정 변수를 레지스터에 넣어놓으라고 말할 때 register키워드를 사용한다. (모든 레지스터가 사용중이면 할당받지 못할 수 있다.) 레지스터에 있으면 좋은 변수로는 for문 안에서만 사용되는, 증감만 반복하는 변수들이 있다. i, j, count 등등.. Volatile int ready = 0; while(!ready){ printf("asdf\n"); } 이런 프로그램은 그..
[C] Scope
[C] Scope
2022.03.22함수와 여러 문법을 중첩해서 사용할 때, 변수의 이름이 겹치는 경우가 많아 내가 어떤 변수를 사용하게 될 지 헷갈리는 경우가 많이 발생한다. void func1(){ int i =0; while(1){ int k = 100; int i =1; while(1){ int i = 2; while(1) { printf("%d %d", k, i); // 어떤 k 이고 어떤 i 일까? } } } } 바로 위와 같은 경우인데, 이 경우 가장 가까운 Scope부터 변수를 탐색한다. 위에서는 k에는 100, i에는 2가 해당된다. 이를 Scoping 규칙이라고 한다. 변수의 Scope와 Lifetime을 헷갈리면 안된다. 개념을 명확히 하고 가자. Lifetime은 시간적인 개념이고, Scope는 공간적인 개념이라고 이..
[C] 스택 프레임
[C] 스택 프레임
2022.03.22스택 자료구조는 나중에 들어간 요소가 먼저 나오는 LIFO형태를 갖춘 자료구조이다. 함수가 동작할 때 스택 구조로 동작하게 된다. 메모리구조와 함수에 대해 알아보자. 사실 Data Segment와 Code Segment부분은 함께 붙어서 하드디스크에 존재한다고 생각해도 된다. 전역변수와 정적변수는 서로 비슷한 성질을 가져 혼용되어 사용하기도 하지만, 정적변수는 전역변수와는 달리 초기화가 한 번만 발생한다. 즉, static키워드가 붙은 정적변수는 프로그램이 시작될 때 한 번만 초기화되며, 함수의 매개변수로 사용할 수 없다. 프로그램을 실행할 때 데이터는 Data Segment / Stack Memory / Heap Memory 세 구간으로 나뉘어 위치하게 된다. 여기서 Data Segment부분의 전역변..
[C] 입문
[C] 입문
2022.03.22C는 자바와 달리 가비지 컬렉터가 없다. int asdf; printf("%d\n", asdf); 자바에서 위와 같이 작성하면 asdf가 기본값인 0으로 초기화되겠지만, C에서는 쓰레기값이 출력된다. C에서는 문자열 타입이 없고 char타입의 배열로 문자열을 사용한다. char asdf[] = "asdfasdf"; printf("%s", asdf); 입력은 scanf()함수로 처리한다. int input; scanf("%d", &input); printf("%d", input); printf와는 달리 변수 앞에 &를 붙여야 한다. 정수형 타입에는 네 가지가 있다. short // 2byte int // 4byte long // 4byte long long // 8byte 크기는 컴파일러마다 다를 수 있다..
[JavaScript] 스코프
[JavaScript] 스코프
2022.03.10자바스크립트에서의 변수 스코프는 자바에서의 스코프와 유사하다. 변수를 선언할 때 var키워드를 사용할 시 전역 변수로 취급될 수 있음에 유의하자. 렉시컬 스코프 자바스크립트는 렉시컬 스코프 방식을 따른다. 주어진 상황에서 결과값이 어떻게 출력되는지 예측해보자. var x = 1; function foo(){ var x = 10; bar(); } function bar(){ console.log(x); } foo(); bar(); 정답은 1 1 이다. 자바스크립트에서 함수의 스코프를 정의할 때 함수를 어디서 호출한지는 중요하지 않고, 함수가 정의된 위치에 따라 상위 스코프를 결정한다. bar함수는 전역에서 정의된 함수이다. bar함수가 정의될 때 이미 스코프가 결정됐기에 전역변수로 선언된 1을 출력하게 된..
[JavaScript] 함수
[JavaScript] 함수
2022.03.10함수 다른 언어들과 다르게 자바스크립트의 함수는 객체 타입의 값으로, 변수에 저장할 수 있다. let func = function(a,b){ return a+b; } let temp = func(1,2) console.log(temp); // 3 위와 같이 함수 표현식에서는 함수의 이름을 생략해도 되지만, 함수 선언문에서는 함수의 이름을 생략할 수 없다. function(a,b){ return a+b; } // 함수 이름을 지어 줘야 오류가 사라진다. function add(a,b){ return a+b; } // 선언문. 하지만, 다음 식은 변수에 선언문을 할당하는 것 처럼 보인다. let something = function add(a,b){ return a+b; } 위에서 정의한 함수를 호출하려면 ..
[JavaScript] 타입 변환 / 단축 평가
[JavaScript] 타입 변환 / 단축 평가
2022.03.08타입 변환 Integer.parse() / x.toString() 처럼 개발자가 명시적으로 타입 변환을 선언하는 경우도 있지만, 개발자의 의도와는 상관없이 표현식을 평가하는 중 가급적 에러 발생을 피하기 위해 엔진이 암묵적으로 타입을 변환하는 경우도 있다. 암묵적 타입 변환이 발생 시 원시 타입 중 하나로 타입이 자동으로 변환된다. 그 예시를 알아보자. 1 + '2' // 지난번에 언급했다. + 연산자는 피연산자가 문자열을 포함하면 concatenate를 수행한다. `1 + 1 = ${1 + 1}` // 표현식의 평가 결과가 문자열 타입으로 변환된다. 1 - '1' // + 외의 산술 연산자는 모두 숫자 타입으로 형변환을 진행한다. '1' > 0 // 비교 연산지는 bool값을 만든다. 피연산자를 숫자 ..
[JavaScript] 연산자 / 제어문
[JavaScript] 연산자 / 제어문
2022.03.08연산자 Java / C와 별다른 특이점은 없다. let c = 30; c++; // 다른 연산을 먼저 수행한 후 피연산자인 c의 값을 증가시킨다. ++c; // 피연산자인 c의 값을 먼저 증가시킨 후 다른 연산을 수행한다. 후위 증감 연산자와 전위 증감 연산자의 차이점을 알아두자. 이 외에도 +와 -를 한 번만 사용하는 단항 연산자는 Number타입에 대해 부호를 변환시키는 것 외에 피연산자를 Number타입으로 변환하는 기능을 하기도 한다. '1' + 2 // 12 1 + 2 // 3 1 + true // 2 1 + null // 1 1 + false // 1 1 + uundefined // undefined +연산자를 사용할 때 피연산자 중 하나 이상이 문자열인 경우 문자열 타입으로 변환 후 conc..
[JavaScript] 리터럴 / 타입
[JavaScript] 리터럴 / 타입
2022.03.07리터럴 자바스크립트는 자바나 C언어같은 정적 타입 언어처럼 타입을 강력하게 지켜야 하는 언어는 아니다. let const등으로 변수를 선언하고 그에 맞는 값을 작성했을 때, 자바스크립트 엔진은 그 코드가 실행될 때 값의 리터럴에 따라서 변수에 해당하는 값을 할당하며, 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다. (동적 타입 언어) 자바와 C언어에서는 1.0f 324L 처럼 숫자 표현을 명확히 하기 위해 리터럴을 사용했고, 자바스크립트에서의 리터럴은 다음과 같다. 정수 리터럴 100 이진수 리터럴 0b0101 문자열 리터럴 "hello" or 'hello' boolean 리터럴 true false null 리터럴 null undefined 리터럴 undefined 객체 리터럴 {a : '..
[JavaScript] 입문 / 변수
[JavaScript] 입문 / 변수
2022.03.07HTML CSS와 함께 웹 개발에 사용되는 요소이며, 앞의 두 요소와 다르게 JavaScript는 프로그래밍 언어이다. 웹페이지 제작 뿐만 아니라 React Electron등 다양한 프레임워크를 사용해 머신러닝 / 모바일 앱 개발 / 서버 개발 등 여러 분야에 사용할 수 있다. 변수 JavaScript에서는 변수를 지정할 때 키워드가 따라붙는다. var : 재선언 가능 / 재할당 가능 let : 재선언 금지 / 재할당 가능 const : 재선언 금지 / 재할당 금지 var을 사용할 때는 조심해야 한다. 자바나 C에서 변수를 선언하게 되면, 코드 블록에 의해서 지역 스코프가 생성되는데, (블록 레벨 스코프) 자바스크립트에서 변수를 선언할 때 var은 함수의 코드 블록만을 지역 스코프로 인정한다. if(tr..
파이썬 시작하기
파이썬 시작하기
2022.02.06파이썬의 자료형에는 숫자 / 문자열 / 리스트 / 튜플 / 딕셔너리 / 집합 등이 있다. 자바에서 기본 자료형과 참조 자료형으로 여러 가지 자료형을 만들 수 있는 것과는 차이가 있다. 파이썬의 자료형은 자료형의 상태에 따라 참 / 거짓을 판단할 수 있도록 설계되었다. 자료형 True / False 비어있는 문자열 False 공백만 존재하는 문자열 False 값이 존재하는 문자열 True 비어있는 리스트 False 값이 존재하는 리스트 True 숫자 1 True 숫자 0 False 숫자 -1 True 비어있는 딕셔너리 False 값이 존재하는 딕셔너리 True 비어있는 튜플 False 값이 존재하는 튜플 True 위와 같이 자료형의 상태에 따라 참 / 거짓이 결정된다. 자바에서는 변수를 선언할 때 자료형을..
[Java] 네트워킹 (Networking) 2
[Java] 네트워킹 (Networking) 2
2021.12.13컴퓨터끼리 통신을 할 때 쓰는 도구를 소켓이라고 한다. 소켓을 통해 진행하는 통신의 종류로는 TCP와 UDP가 있는데, 소켓 프로그래밍에 대해 알아보자. 데이터를 전송(네트워킹)은 계층적인 구조로 이루어져있다. 여기서 전송을 담당하는 계층이 있는데 이 전송 방식으로 TCP와 UDP가 있다. TCP는 1:1 통신방식을 사용해 속도가 UDP보다 느리지만, 데이터 전송이 잘못되면 다시 요청하기 때문에 데이터의 신뢰성이 높다. UDP 는 보내는 사람이 일방적으로 보내는 형식이라고 생각할 수 있다. 덕분에 속도도 빠르지만, 받는 데이터가 올바른 데이터인지 아닌지 확인하는 과정이 없어 데이터의 신뢰성이 좀 떨어진다. (Streaming 에서 사용함) datagram은 데이터 단위라고 생각하면 된다. TCP는 byt..