본문 바로가기

1:1 개발 공부

스크립트 언어 / 자바와 C++의 차이 / 메모리 구성요소 / 조각모음과 포맷 해야하는 이유 / 안드로이드와 ios의 차이

 

 

스크립트 언어&기계어&마크업 언어의 차이점

스크립터 언어에는 자바스크립트, 파이썬과 같은 언어를 말합니다. 쉽게 말해 C언어, C++언어와 같은 기계어보다 모던합니다. 최근에 나온 방식들, 기법들을 활용했기 때문에 include iostream 와 같은 부가적인 코드(세레모니 코드, 보일러 플레이트)들이 들어가지 않습니다. 코드가 짧고 간단해보이지만 실은 숨겨져있을 뿐, 컴파일러(인터프리터)가 우리를 도와주는 것입니다. 이처럼 스크립터 언어는 컴파일러 도움을 받고 의지하는 만큼, 개발자가 비교적 다양하게 코딩을 하지 못해 복잡한 코드를 실현시키기 어렵습니다. 컴파일러가 하라는데로 해야하니까요. 

 

C언어, C++언어와 같은 경우 모든 코딩이 가능합니다. 대신 그만큼 버그도 생기고 우역곡절(?)이 많겠지만 그 가능성은 무한한 것이죠.

 

개발을 하면서 Trade off를 항상 기억해두어야합니다. 바로 '기회비용'입니다. 컴파일러를 활용해서 번역하는 언어를 사용하면 편하고 버그가 덜 생기지만 복잡한 코딩을 하기엔 어렵고, 컴파일러를 활용하지 않는 언어를 사용할 경우 에러가 많이 날 수 있지만 복잡하고 다양하고 자유롭게 코딩이 가능한 것이죠. 따라서, 다양한 케이스에 적합한 언어를 활용하는 거죠. 즉, 브라우저(brower)가 있으면, html(hyper text makrup language) 은 구성을 하고, 버튼을 눌렀을 때 동작을하는 것을 액션이라합니다. 액션은 자바스크립스트가 합니다. 이를 통해 네트워크 통신 및 데이터베이스를 연동시키고 싶을 때, C++, java, C# 언어를 활용하게 되는 겁니다. 


매서드와 함수의 차이

매서드와 함수의 차이를 다시 한 번 볼까합니다.

함수는 누구에게도 속해있지 않으므로 기능입니다. 매서드는 클랙스 안에 속한 기능을 말합니다.

 

'전화받기'라는 함수가 있는데, '아이폰의 전화받기'는 매서드가 되는 것입니다. 누구에게 소속이 되면 매서드가 되는 것이죠. 예를 들어, '사람이 걷다'는 함수, '승승이가 걷다'는 매서드가 되는 것이죠.


메모리 구성요소

1) 저장 메모리(storagey) 소프트웨어의 변수, '포인터'와 같습니다.

 : 저장메모리란 영구적으로 저장하는 메모리, 즉, 컴퓨터의 전원이 없어도 순서대로 저장이 된다는 의미입니다. 노트북을 꺼놔도 제가 저장해높은 파일들을 다 살아있습니다. 바로 저장 메모리에 보관되어 있기 때문이죠.

 

2) RAM(Random Access Memory) 소프트웨어의 '힙'과 같습니다. 

: 램 메모리는 순서 상관없이 접근이 가능한 메모리입니다. 원래 컴퓨터는 메모리를 순서대로 읽습니다. 

 

3) 캐시 메모리(Cache Memory) 소프트웨어의 '스택'과 같습니다.

: 캐시 메모리는 아주 잠깐 전용으로 쓰기 위한 메모리입니다. 쉽게 말해, 제가 친구랑 커피를 들고 마시며 있는데 운동화 끈이 풀렸습니다. 운동화 끈을 다시 묶고 싶죠? 그러면 친구한테 커피를 맡기고 운동화 끈을 다시 묶겠죠? 그리고 다시 운동화 끈을 다 묶은 후 친구한테 커피를 다시 받게됩니다. 그때의 친구는 저를 위해 제 전용으로 잠깐 쓰는 것이죠? 친구 = 바로 캐시 메모리인 것입니다.

캐시 메모리는 택시를 타고 가는 것입니다. 가격이 비싼 대신 '내 전용'입니다. 캐시 메모리는 CPU옆에서 바로바로 잠깐잠깐 도와줍니다. 예를 들어 제가, '승승이'를 적을 때, 처음에 '승'을 적으면 다음 '승'을 적을 때까지, 처음에 있는 '승'을 저장해놓겠죠? 그게 바로 캐시 메모리입니다. 

 

3-1) 버퍼 메모리

: 버퍼 메모리란, 지하철에 있는 물품보관소와 같습니다. 물품보관 가능한 공간들이 나열되어있고, 다 찼으면 다 찼다고, 비었으면 그 빈자리를 알려주는 곳이죠. 

버퍼 메모리는 버스를 타고 가는 것입니다. 가격이 싼 대신, '내 전용'이 아니기 때문에 다른 인원들이 해야하는 것들도 다 기다려줘야하는 것이죠.

버퍼는 카톡을 쓸 때, 엔터를 하기 전(전송하기 전)까지 10~20줄 쓸 경우, 1줄 쓰고, 2줄 쓰고, 3줄 쓰고 하는 경우 버퍼에 저장됩니다. 즉, 10~20줄을 묶어서 한 번에 보낼 때 그 내용들은 버퍼에 저장됩니다. 그럼 통신 트래픽이 줄어들겠죠? 

통신환경을 고려해야할 때, 통신 환경이 좋지 않다면 버퍼 메모리를 사용해야됩니다. 통신 환경이 좋다면 캐시 메모리로 10줄을 1줄씩 10번 보내도 상관없겠죠?

 

-> 저장,Ram,캐시 메모리를 소프트웨어로 구현한게 바로 파일입니다. 파일에 내용을 입력하고 있을 때, 그 내용은 버퍼로 저장됩니다. 한글, powerpoint, word, excel 프로그램마다 확장명이 다르게 파일이 만들어지는 이유는 확장명에 따라 인식이 달라집니다. 한글 문서에 한글이 나오고, 피피티로 만들어져야 그림이 들어가고, excel로 만들어져야 엑셀 시트로 인식됩니다. 문서 작업을 한 후, 저장을 하면 어딘가 일렬로 순서대로 파일들이 storagey에 차곡차곡 쌓입니다.

 

그런데 제가 1000번때의 파일을 저장해두고 있을 때, 300번때의 파일을 제가 삭제하면 어떻게 될까요? 그러면 300번때가 비겠죠? 그렇다고 301번째가 300번째로 이동되지 않습니다. 그냥 그대로 빈 곳이죠. 그럼 컴퓨터가 다른 파일을 저장할 때 빈 곳을 보게 되고 빈 곳에 파일을 넣습니다. 근데 빈 곳의 메모리보다 저장하려는 파일이 크면 다른 빈 곳에 넣습니다. 이러한 행위를 단편화라고 합니다. 빈 곳마다 '조각', '파편'이 생긴 것이니까요. 자꾸 파일을 생성하고 삭제하고 반복하면 빈 곳이 많아지고, 빈 곳 위주로 하나의 파일이 조각되어 채워지기 때문에 컴퓨터를 오래 사용할 수록 느려지는 것입니다.

 

조각모음과 포맷해야하는 이유

그런데 이렇게 되면, 파일 하나를 열 때 이 곳 읽고, 저 곳 읽고 하다보니 시간이 오래 걸립니다. 하나의 파일을 다양한 공간에서 읽어와야하니까요. 그래서 이럴 때 필요한 게 바로 '조각 모음'입니다. 순서대로 파일을 읽어올 수 있게 하는 것이죠. 1번~8번까지는 ㅇㅇ파일이고, 9~13번은 ㅂㅂ파일이고 이런식으로 말입니다! 그래서 조각모음을 하면 빨라집니다. 하지만, 이것도 여유 공간이 없으면 할 수 없습니다. 순서대로 밀어넣으려다 보니 중간에 저장되어있는 파일이 임시로 잠시 보관되어야하는데 여유 공간이 없으면 할 수 없죠. 그럴 땐 포맷 하는 것이구요

 

프로그램도 저장 메모리와 마찬가지입니다. 파일을 썼는데 모르고 닫지 않으면 폭파됩니다. 더 이상 쓸 때가 없으니까요.

메모리는 소프트그램으로 볼 때 '변수'로 볼 수 있는 거죠. 프로그램 내내 살아있는 동안 쓸 수 있는 변수가 바로 '포인터'입니다. 

 

여기서 잠깐? 포인터는 c++과 같은 곳에서만의 개념이기 때문에 자바에는 없습니다. 자바에서는 '레퍼런스'(참조)라고 합니다. 메모리 공간을 개발자가 직접 만들고 삭제 하지 않는 대신에, 컴퓨터에서 만들어서 '여기부터 써', '참고해'라고 알려줍니다. 포인팅은 내가 직접 지정하지만, 자바에서는 컴퓨터에서 너 이거 쓰려면 이거 참조해 라고 하는 것이죠.

 

C++과 자바의 차이

C#이나 c++는 컴퓨터 디바이스에 직접 접근해서 무엇이든 할 수 있으며 속도가 빠릅니다. 다만 잘못하면 소위 말해 뻑이 나죠. 컴퓨터를 껐다 켜야 될 일이 발생합니다. 반면, 자바에는 Virtual Machine, VM 이 있습니다. 하드웨어 냄새가 나는 소프트웨어가 있습니다. 자바는 VM위에서 작업을 합니다. 개발자가 잘못짜다 문제가 될만한 것들을 가상머신, 즉 Virtual Machine, VM이 흡수합니다. 그렇기 때문에 컴퓨터가 뻑나갈 일이 없습니다. 하드웨어가 죽지 않아서 컴퓨터를 껐다 킬 일이 없는 것이죠. 대신, VM이라는 한층 위에서 코딩이 이루어지기 때문에 비교적 속도가 느립니다. VM 자체도 오래 쓰다보면 다양한 오류를 많이 흡수하기 때문에 점차 느려집니다. 그래서 오래 쓰면 포맷이 필요하죠.

 

안드로이드와 ios의 차이

더 나아가 안드로이드와 ios의 차이로 나아갈 수 있습니다.

-> 안드로이드는 자바로 되어있습니다. 그래서 VM있기 때문에 이상하게 느리다고 느낀 이유가 이런 것이었죠. 반면, ios는 VM이 없습니다. 그래서 우리가 빠르다고 느낀 것이었죠!

그렇다고 안드로이드가 나쁜 것이다? 아닙니다. 안드로이드는 핸드폰, 탭, 와치 모두 다 똑같습니다. 앱을 하나 만들어놓으면 VM만 있다면 다 호환이 가능합니다. 하지만 ios는 맥용, 아이폰용, 와치용 다 다릅니다. 그래서 맥용 개발자, 아이폰용 개발자, 와치용 개발자가 다 따로 있습니다.

 

안드로이드는 개방형 표준형입니다. 따라서 삼성, 엘지 등 각각의 안드로이도 수정이 가능합니다. 누구나 쉽게 수정하고 바꿀 수 있습니다. 오픈되어 있기 때문에 보완에 취약합니다. 하지만 아이폰은 폐쇄형입니다. 아이폰 직원들만 어떻게 구성되어있는 지 알 수 있습니다. 폐쇄형이기 때문에 보완에 강할 수 밖에 없죠.