식별자(Indentifier)란?


식별자는 무엇을 식별할 수 있는 도구로 변수,상수,함수명등이 포함된다.


식별자 이름은 반드시 글자,$,_로 시작해야한다.

- $사용 대표적예 jquery가 있다.


예약어 const,let,function등을 식별자이름을 사용할 수 없다.


대문자로 시작하지 않는다.(문법적인 오류는 아님)


varName <- carmelCase 형식으로 생성하기

var_name_test <- snakeCase 형식으로 생성하기

_로 시작하는 경우는 내부변수등에 사용한다. (특별한 상황에만 사용한다)


리터럴(literal)이란?

식별자 뒤에 할당되는 값아 value를 말한다.


let a = 30;이라면 30을 뜻한다.


숫자형,문자형등이 있다.


원시타입이란?

변수들이 같는 값(리터럴)이 문자,숫자,boolean(참거짓),null,undefined,심볼일 때를 원시타입이라고 한다.


객체(Object)타입이란?

Array,Date,RegExp,Map,WeakMap,Set,WeakSet등이 있다.


이스케이프란?

특수문자를 있는그대로의 문자로 표현할때 사용한다.

var d = "sss,\"ss\"."; 역슬래시를 사용하여 표현한다.


let,const 미리보기

ES6가 되면서 var의 문제점이 해결된 let을 사용한다.

ex)

let a = 2;

b = 2;

let aa = 100, bb = 200;

등으로 사용가능하다.


기존엔 상수라는 개념이 없었는데

const라는 상수 개념이 생겨났다.


상수란? 변하지않는 값을 말한다.

ex)

const AA_BBC_CC = 200;


상수엔 값을 할당할 수 없기때문에

AA_BBC_CC = 500; 형식으로 하면 에러가 난다.



String,StringBuffer,StringBuilder의 차이


String은 불가변적이다.

StringBuffer,StringBuilder은 가변적이다.


String 객체는 Heap메모리에 생성되면 변하지않는다.

변경하게되면 새로운 객체를 생성해야한다.

ex)

String s = "a";

s = s + "b";


String 는 객체(Heap메모리) s는 reference 값(Stack메모리)이다.

String s = "a";

s(reference값)은 Heap 메모리의 "a"의 주소값을 보고 있다.


s = s + "b"; 를 하게되면 

s(reference값)가 보고있는 "a"값에 "b"를 추가하는것이아닌

"ab"라는 객체를 다시만들고 그 객체의 reference값으로 바꾼다.


ex)StringBuffer ,StringBuilder 동일하다.

StringBuffer s = new StringBuffer("a");

s.append("b");


StringBuilder,StringBuffer 는 객체(Heap메모리) s는 reference 값(Stack메모리)이다.

차이점은 StringBuilder,StringBuffer는 객체를 새로 생성하지않고

기존 객체에 값을 추가한다.


개발시에 문자열 병합이 빈번하게 일어나면 StringBuilder,StringBuffer를 사용하는게 좋다.


StringBuilder,StringBuffer 차이는?


synchronization(동기화)지원여부의 차이다.


synchronization란?

하나에 제한되어있는 데이터를 여러 스레드가 공유가 사용할때

데이터가 깨지지않게 줄을세워 키를 가지고 있는 데이터를 처리하고 나머지데이터는 대기시킨다.

데이터무결성을 보장할 수 있다.


StringBuffer는 동기화를 지원하고

StringBuilder는 동기화를 지원하지 않는다.


멀티스레드를 사용하지 않는다면 

StringBuffer보단 StringBuilder가 빠르다.


자바 메모리영역 Stack,Heap


Stack

- Stack 메모리는 비교적 가벼운데이터들을 말한다.

- primativeData,reference(주소값)이 있다.


Heap

- Heap 메모리는 객체등 무거운데이터가 머물러있다.

- Garbage Collection은 Heap메모리에서 작동한다.


ex)

마트에 갔을때 가벼운 물건들은 바로바로 구매하지만

배송이 필요한 물건은 reference를 보고 구매하면

Heap에서 가져오게 된다.

autoboxing,unboxing이란?


autoboxing,unboxing의 개념은 jdk 1.5 부터 나왔다.


자바에는 크게 2가지 데이터 타입이 있다.

primitive Data,Object Data 두가지!


primitive Data

- boolean, char, byte, short, int, long, float, double

- 아주 가벼운 데이터를 말한다.

- 스택메모리에 머물러있다.


Object Data

- 상대적으로 무거운 데이터이다.

- 실제 데이터는 힙메모리에 공유하고 레퍼런스만 스택메모리에 있다.


Wrapper Class

- primitive Data를 ObjectData화 시킨 Class이다.


jdk 1.5 이전에 서로 호환할려면 개발자가 명시적으로 바꿔줬어야했다.

하지만 jdk 1.5가 나오면서 직접호환이 가능하게 되었다.


primitive Data 에서 Wrapper Class로 자동으로 변환되는걸 autoboxing이라 한다.

가벼운 데이터를 무거운데이터에 넣기에 autoboxing이라고 생각하면 간단하다.


Wrapper Class에서 primitive Data 자동으로 변환되는걸 unboxing이라 한다.

무거운 데이터를 가벼운데이터에 넣기에 unboxing이라고 생각하면 간단하다.


autoboxing이란?

- 컴파일러가 primitive Data를 Object Data로 자동변환하는것이다.

- int a = 42; Integer b =a;

- 과거엔 객체를 생성했어야했다.


unboxing이란?

- 컴파일러가 Object Data를 primitiveData로 자동변환하는것이다.

- Integer a = new Integer(42); int b =a;

- 과거엔 a.intValue();로 생성했어야했다.


JVM


Java Virtual Machine

컴파일된 Class파일을 실행하는 역할


JAVA를 독립적인 프로그래밍언어로 만들어준다.


자바 실행원리

1. 소스 작성(Code)

- .java파일로 저장

2. 컴퓨터 언어로 변환(Compile)

- .class파일 생성

3. 실행(Run)


JVM은 OS에 종속적이다.

윈도우용,리눅스용 다르다.


핸드폰 충전 어뎁터로 생각하면 된다.

충전선은 usb형식으로 어뎁터만 전기코드에 맞게 꽂아주면 충전선을 바꿀 필요가 없다.


JRE

Java Runtime Environment

자바프로그램이 실행될수있는 환경

JVM이 포함되어 있다.


Java Virtual Machine

- 플랫폼에서 최종적으로 실행시켜준다.

Bytecode Verifier

- 로딩된 Class파일 정보가 플랫폼에서 실행되는데 문제가 없는지 검증한다.

Class Loader

- 컴파일된 Class파일을 메모리에 로딩시켜준다.

세가지로 구성됨.


JDK

Java Development Kit

JRE가 포함되어있고 개발시 필요한 디버깅기능,간단한 DB,샘플예제 등

어플리케이션에 필요한 기능을 제공한다.





함수 포인터

- C언어에서는 함수의 이름을 이용해 특정한 함수를 호출한다.

- 함수 이름은 메모리 주소를 반환한다.

- 함수 포인터는 특정한 함수의 반환 자료형을 지정하는 방식으로 선언할 수 있다.

- 함수 포인터를 이용하면 형태가 같은 서로 다른기능의 함수를 선택적으로 사용할 수 있다.

- 사용법 : 반환 자료형(*이름) (매개변수) = 함수명;


실습내용

함수 이름은 메모리 주소를 반환

형태가 같은 서로 다른기능의 함수를 선택적으로 사용


실습결과


매개변수 및 반환 자료형이 있는 함수포인터

실습내용


실습결과


함수포인터를 반환하여 사용하기

실습내용


실습결과




구조체

- 여러 개의 변수를 묶어 하나의 객체를 표현하고자 할 때 구조체를 사용한다.

+ 배열과는 다름(배열은 동일한 특성을 가진 변수를 나열한것)

- 캐릭터,몬스터,학생,좌표 등 다양한 객체를 모두 프로그래밍 언어를 이용해 표현할 수 있다.


실습내용


구조체의 정의와 선언

- 하나의 구조체 변수만 사용하는 경우 정의와 동시에 선언을 할 수도 있다.

- 이 경우에는 전역변수로 사용된다.


실습내용

실습결과(위 2개의 실습내용 동일)



구조체 정의하기

- typedef 키워드를 이용한다.

- 익명구조체로도 사용가능하다.

- 구조체가 포인터 변수로 사용되는 경우 내부 변수에 접근할 때 화살표(->)를 사용한다.


실습내용


실습결과


동적 메모리 할당의 개념

- 일반적으로 C언어에서 배열의 경우 사전에 적절한 크기만큼 할당해주어야한다.

- 우리가 원하는 만큼만 메모리를 할당해서 사용하고자 한다면 동적 메모리 할당을 사용한다.

- 동적이라는 말의 의미는 '프로그램 실행 도중에'라는 뜻이다.


동적 메모리 할당 함수

- C언어에서는 malloc() 함수를 이용해 원하는 만큼의 메모리 공간을 확보할 수 있다.

- malloc() 함수는 메모리 할당에 성공하면 주소를 반환하고, 그렇지않으면 null을 반환한다.

- malloc() 함수는 <stdlib.h> 라이브러이에 정의되어 있다.

- 사용법 : malloc(할당할 바이트 크기);


실습내용

실습결과



동적 메모리 할당을 수행할 때마다 할당되는 포인터의 주소값은 변칙적이다.


동적으로 할당된 변수는 <힙 영역>에 저장된다.

지역변수,매개변수는 <스택 영역>에 저장된다.


전통적인 C언어에서는 스택에 선언된 변수는 따로 메모리 해제를 해주지않아도 된다.

반면에 동적으로 할당된 변수(힙영역)는 반드시 free() 함수로 메모리 해제를 해주어야한다.

메모리 해제를 하지 않으면 메모리 내의 프로세스 무게가 더해져 언제가는 오류가 발생한다.

메모리 누수(Memory Leak) 방지는 코어 개발자의 핵심 역량이다.


실습내용

실습결과



동적으로 문자열 처리하기

- 일괄적인 범위의 메모리를 모두 특정한 값으로 설정하기 위해서는 memset()을 사용한다.

- 사용법 : memset(포인터,값,크기); 

- 한 바이트 씩 값을 저장하므로 문자열 배열의 처리 방식과 흡사하다.

- 따라서 memset() 함수는 <string.h> 라이브러리에 선언되어 있다.


실습내용

실급결과



동적 메모리 할당을 이용해 프로그램이 실행중인 도중에 메모리 공간을 배정받을 수 있다.

동적으로 할당 받은 프로그램은 반드시 명시적으로 free() 함수를 이용해 할당 해제를 해야만한다.

시스템콜

응용프로그램,운영체제,컴퓨터하드웨어(시스템 리소스)관계

도서관으로 비유

- 운영체제는 도서관

- 응용프로그램은 시민

- 컴퓨터 하드웨어는

- 운영체제의 역할

+ 시민은 도서관에 원하는 (자원) 요청함

+ 도서관은 적절한 (자원) 찾아서, 시민에게 빌려줌

+ 시민이 기한이 되면, 도서관이 해당 (자원) 회수함


실제관계

- 운영체제는 응용 프로그램이 요청하는 메모리를 허가하고, 분배한다.

- 운영체제는 응용 프로그램이 요청하는 CPU 시간을 제공한다.

- 운영체제는 응용 프로그래밍이 요청하는 IO Devices 사용을 허가/제어한다.


사용자,응용 프로그램, 운영체제, 컴퓨터 하드웨어와의 관계

- 사용자 <-> 응용프로그램, <-> API <-> 시스템콜 <-> 운영체제 <-> 하드웨어

+ ,API 프로그래머가 사용(프로그래밍언어는 API 사용법)

+ 뒷부분(시스템콜 <-> 운영체제 <-> 하드웨어)도 잘알아야한다.


운영체제는 사용자 인터페이스 제공

- (Shell)

+ 사용자가 운영체제 기능과 서비스를 조작할 있도록 인터페이스를 제공하는 프로그램

+ 쉘은 터미널 환경(CLI), GUI 환경 종류로 분류한다.


운영체제는 응용 프로그램을 위해서도 인터페이스를 제공한다.

- API (Application Programming Interface)

+ 함수로 제공

+ open() <-C언어 파일오픈

+ 시민이 도서관에서 책을 빌리려면 신청서를 작성해야한다.

- 보통은 라이브러리(library) 형태로 제공한다.

+ 운영체제에 요청할 함수들을 종류별로 묶어둔것.

+ C library


시스템

- 시스템 또는 시스템 호출 인터페이스

- 운영체제가 운영체제 기능을 사용할 있도록 시스템 콜이라는 명령 또는 함수를 제공한다.

- API 내부에는 시스템콜을 호출하는 형태로 만들어지는 경우가 대부분이다.


운영체제를 만든다면?

- 운영체제를 개발한다. (Kernel)

- 시스템 콜을 개발

- C API(library) 개발

- Shell 프로그램 개발

- 응용프로그램 개발


운영체제와 시스템콜

- 시스템콜 정의

+ POSIX-API(리눅스에 기반으로 제공),윈도우 API

  명령어로 접근한다.


시스템콜 : 운영체제 기능을 호출하는 함수

API : 언어별 운영체제 기능 호출 인터페이스 함수

2차원 배열의 필요성

- 2차원 배열은 굉장히 많은 목적으로 사용된다.

- 행렬 데이터를 표현할 때, 그래프 알고리즘을 처리할 때, 다수의 실생활 데이터를 처리할 때 등이다.

- 흔히 우리가 보는 표 구조가 2차원 배열과 흡사하다(ex:수학,영어,국어성적)

+ 호날두 85 97 79

+ 메시 88 54 56


2차원 배열의 초기화

- 2차원 배열은 1차원 배열 중첩되었다는 의미로 []를 두 번 연속하여 사용한다.

+ 자료형 배열이름 [행][열] = { {값,값},{값,값} }

실습내용

실습결과


다차원 배열

- 2차원 배열 이상의 다차원 배열 또한 사용할 수 있다.

- 컴퓨터는 기본적으로 화면에 2차원 형태만 출력할 수 있다.

실습내용



실습결과


포인터 배열의 구조분석

- 배열은 포인터와 동일한 방식으로 동작한다.

- 배열의 이름은 배열의 원소의 첫 번째 주소가 된다.

- 유일한 차이점은 포인터는 변수,배열의 이름은 상수이다.

- 포인터는 연산을 통해 자료형의 크기만큼 이동한다.

- 정수(int)형 포인터는 4바이트(Bytes)씩 이동한다.


포인터배열 구조 예제

- 포인터는 벼수여서 값이 변경된다.

실습내용

실습결과


2차원 배열 포인터 처리방법

실습내용

실습결과




프로그램 메모리 주소

- 컴퓨터에서 프로그램이 실행되기 위해서는 프로그램이 메모리에 적재되어야한다.

- 당연히 프로그램의 크기를 충당할 수 있을 만큼의 메모리 공간이 있어야한다.


- 일반적인 컴퓨터의 운영체제는 메모리 공간을 네 가지로 구분하여 관리한다.

+ 코드영역 - 소스코드

+ 데이터영역 - 전역변수,정적변수

+ 힙영역 - 동적할당변수

+ 스택영역 - 지역변수,매개변수


전역변수

- 전역변수(Global Variable)란 프로그램의 어디서든 접근 가능한 변수를 말한다.

- main함수가 실행되기도 전에 프로그램의 시작과 동시에 메모리에 할당된다.

- 프로그램의 크기가 커질 수록 전역 변수로 인해 프로그램이 복잡해질 수 있다.

- 메모리의 데이터영역에 저장된다.

실습내용

실습결과



지역변수

- 프로그램의 특정한 블록에서만 접근가능하다.

- 함수가 실행될때마다 메모리에 할당되어 함수가 종료되면 메모리에서 해제된다.

- 메모리의 스택(Stack)영역에 기록된다.

실습내용

실습결과



정적변수

- 정적변수(Static Variable)는 특정한 블록에서만 접근할 수 있는 변수이다.

- 프로그램이 실행될 때 메모리에 할당되어 프로그램이 종료되면 메모리에서 해제된다.

- 메모리의 데이터 영역에 적재된다.

실습내용

실습결과



레지스터변수

- 레지스터변수(RegisterVariable)은 메인 메모리 대신 CPU의 레지스터를 사용하는 변수이다.

- 레지스터는 매우 한정되어 있으므로 실제로 레지스터에서 처리될 지는 장담할 수 없다.

실습내용

실습결과



함수의 매개변수가 처리될 때

- 함수를 호출할 때 함수에 필요한 데이터를 매개변수로 전달한다.

- 전달 방식은 1: 값에 의한 전달 방식, 2 : 참조에 의한 전달 방식이 있다.

- 값에 의한 전달 방식은 단지 값을 전달하므로 함수 내에서 변수가 새롭게 생성된다.

+ 지역변수에 가깝다.

- 참조에 의한 전달 방식은 주소를 전달하므로 원래의 변수 자체에 접근할 수 있다.

+ 전역변수에 가깝다.

+ 매개변수로 포인터 변수를 보내는것이다.


실습내용

실습결과


+ Recent posts