빌드 번호와 버전 번호

개발자는 개발을 하고 배포 전에 빌드를 하여 프로그램에 오류가 없는 지 확인을 한다.

 

때문에 각 프로그램들은 빌드와 버전 정보를 따로 기입하게 되어있다.

 

 

우리가 테스트 해보는 버전은 빌드(개발자)로, 최종적으로 올리는 프로덕트의 개념은 버전정보(고객층) 로 나눌 수 있다.

 

 

빌드번호

출시 되기 전 프로그램 버전을 뜻한다.

 

제품 출시 전에 여러 단계의 테스트에서 수정 및 업데이트되는 내용들이 있는데 이 때 이를 구분 짓기 위해 빌드 번호로 구분을 하곤 한다.

 

빌드 과정은 제품의 신뢰도를 위해 개발 단계 중 아주 중요한 부분에 속한다.

 

디버그용 빌드, 릴리스용 빌드 이렇게 2가지로 나뉜다.

 

디버그용 빌드 : 개발자가 개발하는 동안 오류나 기능을 테스트 하기 위해 빌드하는 것.

ㄴ 개발자가 코드를 돌릴 때 사용하는 설정 파일 다 같이 돌리기 때문에 다소 무겁고 느린게 특징.

ㄴ 반면 출시된 버전은 기능에 따른 동작만 하기 때문에 훨씬 가볍고 빠르다.

 

 

릴리스용 빌드 : 제품의 모든 개발이 끝나고 배포 직전에 점검하는 베타 버전을 의미함.

ㄴ 여기서 큰 문제가 될만한 버그만 나타나지 않으면 출시할 준비가 되었음을 의미한다.

 

 

 

버전 번호

기업에 제품 출시시 매기는 번호로 버전번호라고 부릅니다.

쉽게 말해 윈도우 10, 윈도우 11 같은 제품 이름과도 같은 번호입니다.

 

디버깅

개발하는데는 큰 시간이 안든다. 실제론 디버깅 시간이 50퍼센트 이상을 차지하는게 부지기수다.

 

Debug란

벌레를 뜻하는 Bug와 제거한다는 접두사 de- 가 합쳐진 단어다.

 

즉, 벌레를 제거하는 행위다.

 

역사적으로 이 언어의 유래는 다음과 같다.

 

컴퓨터가 오작동을 일으켜서 개발자들이 프로그램의 설계나 코드를 아무리 찾아보아도 나오지 않던 문제가

 

실제 컴퓨터실의 케이블에 나방이 끼어서 죽어서 났던 문제로 이 후부터 

 

벌레를 제거하여 오류를 수정한다는 의미로 Debug 라는 용어가 쓰였다고 한다.

[출처 : 혼자 공부하는 얄팍한 코딩지식]

 

따라서 디버그란 용어는 프로그램의 오류를 수정하는 작업을 의미하며 오류를 찾아 제거하는 행위를 디버깅(Debugging) 이라고 한다.

 

실제로 현업에선 프로그램을 올리기 전에 미리 빌드해본 후 Run으로 실행하여 코드가 실제로 잘 작동하는 지 테스트하는데 이런 행위를 보통 디버그 한다고 말하기도 한다.

 

개발자들은 작성한 코드를 계속해서 실행하여 테스트하면서

 

프로그램이 잘 작동 하는지?

 

기존 기능에 영향을 주진 않는지?

 

규모가 큰 종류의 소프트웨어일수록 디버깅에 할애하는 시간은 늘어난다고 보면 된다.

 

 

빌드

코딩한 소스코드를 포함한 모든 프로그램 구성 요소를 실행해볼 수 있는 파일을 만드는 과정이다.

 

확장자명 Exe 파일들이 보통 이 경우에 해당된다.

 

*.exe란?

execute(처형, 실행하다)란 단어의 줄임말로 실제 프로그램을 실행해볼 수 있는 프로그램을 지칭하는 컴퓨터 프로그램 확장자명

 

모바일의 경우 앱스토어나 플레이스토어에 올릴 수 있는 *.apk 파일로 바꿔주는 과정이 필요하다.

 

고수준 프로그래밍 언어에 대해서 설명하겠다.

고수준이래서 대단한 언어고, 저수준이래서 가치가 없는 언어고 이런 게 아니다.

 

그저 컴퓨터라는 Hardware라는 관점에서 고수준과 저수준을 나눈 것이니 오해 없길 바란다.

 

 

 

고수준 프로그래밍 언어론 현재 우리가 쉽게 찾아볼 수 있는 언어들이 있다.

 

대표적으론 C, C++, 파이썬, Java, Javascript, php 등이 있다.

 

여기서 경제성을 고려하여 속도와 성능을 중시하는 언어로는 C와 C++, Java 정도등이 있다.

 

 

이유는 위의 3 언어는 컴파일 과정(일종의 번역)이란 걸 거치는 언어기 때문에

 

컴퓨터에서 동작 속도가 빠르다.

ㄴ 비유하자면 한국인의 경우 번역된 원서[컴파일]를 읽는 속도와 영어로 된 원서[인터프리터]를 읽는 속도와 어떤게 더 빠르고 효율이 있을까?

 

 

파이썬이나 Javascript, php 등은 인터프리터 언어로 코드를 그 때 그 때 한 줄씩 번역하면서 실행하는 프로그램으로

 

실행속도가 느릴 수 밖에 없다.

 

 

그 외 조금 깊이 들어가보자면 C와 C++ 같은 경우엔 포인터라는 기능으로 동적 메모리 지정이 가능하기 때문에

 

한정된 자원에서 극한의 성능을 뽑아낼 수 있다.

(오류나면 온전히 개발자가 다 찾아내서 고쳐야 된다는 점에서 쉽지 않은 언어라 할 수 있다.)

 

웹 쪽에선 C와 C++로 코딩하기보단 Java로 많이들 코딩하는데 이유는 시간당 효율이 이 편이 낫기 때문이다.

(C와 C++가 사용이 안된다는 것은 아니다. 백엔드 분야에선 C 코드가 꽤 쓰인다 ^^..)

 

그리고 애시당초 Java도 꽤 훌륭한 컴파일 언어기 때문에 메모리 쪽에서 큰 누수도 없기 때문이다.

 

Java의 경우 가비지 컬렉터란 녀석이 자동으로 메모리 리크에 대한 위험 부담을 짊어지고 있기 때문에

 

비교적 안전한(?) 언어라 할 수 있다.

 

 

뭐 더 깊은 내용은 각자들 공부하시기 바란다.

 

여기서 써봤자 글이 길어지고 난해해지기 때문에 줄인다.

 

 

 

IDE Integrated Development Enviornment

직역하자면 통합 개발 환경이다.

 

우리가 문서를 작성할 때 윈도우 기본으로 제공되는 텍스트 파일을 활용해도 되나

 

좀 더 편리한 활용성을 위해 한글프로그램이나 워드를 쓰듯

 

개발할 때도 텍스트 파일을 써도 되나, IDE라는 각 언어에 맞게 셋팅된 통합 개발 환경을 설치하여 사용하곤 한다.

 

IDE를 사용하면 좋은 점은 비교적 오탈자나 Error에 대해서 쉽게 파악할 수 있으며 새로운 기능에 대한 피드백을 어느정도 받을 수 있다.

 

IDE의 예로는

 

이클립스(Java 보통 무료),

인텔리제이(Java 유료),

파이참(Python 유료, 무료 둘 다 있음),

안드로이드 스튜디오(인텔리제이의 안드로이드 개발용 버전으로 Java 혹은 코틀린 사용),

엑스코드(애플개발, Mac에서 작동. Swift 언어),

비쥬얼 스튜디오(마이크로소프트 개발, 무거운 프로그램이나 그만큼 기능이 많음),

VSC(비쥬얼 스튜디오 코드로 마이크로 소프트에서 개발하였다. 가벼운 프로그램으로 그저 에디터 정도로 봐도 된다.) 등이 있다.

 

 

 

 

 

컴퓨터 프로그래밍을 위한 언어이다.

 

컴퓨터는 0과 1로만 이뤄진 기계이기 때문에 사람과 같은 복잡한 추상화 과정을 직관적으로 얻을 수 없다.

 

그렇기 때문에 컴퓨터가 이를 이해하게끔 만들어 놓은 일종의 툴이 프로그래밍 언어이다.

 

 

프로그래밍 언어는 그 목적에 따라서 여러 언어가 있다.(전세계에 약 9,000종에 달하는 프로그래밍 언어가 있다.)

 

그 목적으로는 빠른 성능, 읽기 쉬운 언어, 짧은 코드로 많은 기능을 할 수 있는 언어, 오류로부터 다소 안전한 언어 등 요구에 따라 다양하게 있다.

 

Tiobe 에서는 프로그래밍 언어에 대한 인기를 실시간 차트로 확인할 수 있다.

 

 

현재 전세계 인기 순위 1위 언어는 단연 파이썬이다.

 

 

 

또한 프로그래밍 언어는 고수준 언어와 저수준 언어로 나뉜다.

 

이는 현 시대를 기점으로 보편적인 기준에 맞춰서 나눈 기준이라 보면 된다.

 

요즘 저수준 언어는 C나 C++ 이라고 표현하며 고수준 언어는 파이썬이나 Java 등의 언어를 지칭한다고 보면 된다.

ㄴ그러나 실제론 저수준 언어라고 하면 기계어(0과 1로 이뤄진)나  어셈블리어 정도가 저수준 언어이다.

 

유저들 입장에서 그저 고수준, 저수준을 나눈 것이기 때문에 큰 연연은 하지 않아도 된다.

 

어셈블리어는 단순 영어와 단순 기능(하나에 명령에 하나에 동작 밖에 못함.)으로 복잡한 프로그램을 만들려면 꽤나 시간이 많이 들고 공이 들어간다.

 

또한 오류가 발생했을 경우 온전히 개발자가 모든 Hw와 Sw를 분석하여 잡아내야 한다.

 

그렇기 때문에 쉽지 않다.

 

 

고수준 프로그래밍 언어에 대해서는 글이 길어지므로 2부에서 적도록 하겠다.

 

 

 

개발의 단계 구분

ⓐ 요구 사항 분석

ㄴ 무슨 무슨 기능을 가진 앱을 만들어달라 등 요구사항의 구체화

 

ⓑ 시스템 명세

ㄴ 이를 어떻게 구현할지에 대한 전반적인 구상을 시작

 

ⓒ 구조 설계

ㄴ 어떤 종류의 앱을 만들건지, 프로그래밍 언어는? DB는 어떤 방식으로 저장하며 관리할지? 어떤 서버에 구축할지 등

앱의 전반적인 설계를 합니다.(Algorithm 및 기술 스택을 고려하여 각종 요소들 선정)

 

ⓓ 구현

ㄴ 코딩으로 구현한다.

 

ⓔ 테스트

ㄴ 글을 쓸 때 문장을 수정하고 맞춤법을 고치듯, 오류 점검, 기능 테스트, 코드 수정 등이 이뤄지는 단계.

 

ⓕ 유지보수

ㄴ 출시 후 각종 버그를 찾아 해결하며 기능을 업데이트하여 앱이 안정적으로 운영되도록 관리하는 단계.

 

즉, 개발이란 용어는 코딩 혹은 프로그래밍 같은 언어보다 더 포괄적인 개념으로 S/W의 기술적 계획부터 제작, 사후 관리까지 모두 아우르는 상위 단어의 개념입니다.

 

이 외 개발과정의 자동화, DB의 체계 고도화, 문제점 혹은 비효율적인 소스를 개선하는 것까지 모든 과정이 순조롭게 이뤄줘야 합니다.

 

 

소프트웨어란 용어의 정의.

소프트웨어 > 프로그램 > 라이브러리 > 데이터

 

소프트웨어 안에 프로그램이 있고, 프로그램의 기능들 중 일부의 라이브러리가 있고, 그 안에 데이터가 있다고 보면 된다.

 

 

애플리케이션

시스템 프로그램과 응용프로그램으로 나뉜다.

시스템 프로그램 : 운영체제를 구성하는 소프트웨어

응용 프로그램 : 각각의 목적에 따라 사용자가 직접 손에 쥐고 실행하여 활용할 수 있는 프로그램

 

 

라이브러리 : 하나 이상의 프로그램에서 공통으로 사용할 수 있는 함수들을 모듈로 만들어 놓은 집합.

일종의 모듈이다. 자주 쓰이는 펑션들은 함수화 해놓으면 좋다. 재사용성

ㄴ 아두이노 라이브러리 등

 

백엔드 개발자 : 데이터 베이스에 저장되는 각종 정보의 입출력, 데이터의 분석과 가공, 로그인 등을 비롯한 보안 요소들이 백엔드 개발자를 통해서 진행된다.

ㄴ 서버, 네트워크, 데이터베이스 등 다양한 지식이 필요함.

 

안드로이드 개발자 : 안드로이드 기반으로 JAVA 혹은 코틀린을 많이 사용합니다.

 

iOS 개발자 : 과거 오브젝티브-C 를 썼으나 현재는 대부분 스위프트를 많이 사용합니다.

 

크로스 플랫폼 : 플러터 x 다트, 리액트 네이티브 x 자바스크립트, 자마린 x C# 등이 있습니다.

ㄴ 개인적으로 자마린은 망...

 

게임 개발자 : 컴퓨터, 수학, 프로그래밍 등 높은 수준의 숙련도를 요구하는 개발자, 주로 C++ 로 개발함., 유니티는 C샵을 이용하여 개발을 많이 함.

 

응용소프트웨어 개발자 : C++, C, JAVA, Python 등 다양한 프로그램으로 응용 소프트웨어 단을 설계하는 개발자임., 운영체제, 컴퓨터 구조, 소프트웨어 공학 등의 소양을 갖춰야 함.

 

소스 코드 : 설계문, 명령문, 주석 등과 같이 사용하여 작성한 코드

 

arr = [3, 5, 2, 4, 1]                                                                         =============> 설계문(자료형)

# 배열의 크기만큼 반복                                                                =============> 주석

def bubble_sort(arr):                                                                     =============> 설계문(구조 선언)

# 배열의 크기만큼 1을 뺀 다음 i 만큼 반복                                   =============> 주석

 

    for i in range(len(arr)) -1, 0, -1):                                                =============> 명령문 

        for j in range(i):

 

프로그래밍 : 코딩 + 목적한 바 라고 할 수 있음., 간단히 설명하자면 아래 그림과 같이 순서도(Flow chart)를 사용하여 코딩을 하기 전 설계를 한 뒤 만드는 행위라 할 수 있다.

Flow chart

 

위와 같은 Flow chart를 일종의 Algorithm이라 할 수 있다.

이 Algorithm을 바탕으로 코딩을 하는 행위를 프로그래밍이라 할 수 있겠다.

 

논리적인 오류나 고려하지 못한 변수가 있게 되면 Error이 발생하게 되고 얘기치 못한 사고가 일어날 수 있으므로 프로그래머는 꼼꼼함이 필수 덕목이라 할 수 있다.

 

 

개발 : 코딩 + 프로그래밍 + 그 외 = 개발 이라 할 수 있다.

① 요구사항 분석

ㄴ 요구사항 구체화

② 시스템 명세

ㄴ 이를 어떻게 구현할 것인지, 전반적인 구상

③ 구조 설계

ㄴ 프로그래밍 언어는 어떤 것을 사용하며, 데이터는 어떤 방식으로 저장하고 관리할지, 어떤 서버에 구축할지 등 앱의 전반적인 구조를 설계하는 과정이다.

④ 구현

ㄴ 프로그래밍 + 코딩의 단계

⑤ 테스트

ㄴ 끊임 없는 오류 점검, 기능 테스트, 코드 수정

⑥ 유지보수

ㄴ 모든 과정을 마치고 앱이 안정적으로 운영되도록 관리하는 작업이 꾸준히 필요합니다.

 

이 외에 서비스가 모든 환경에서 제대로 작동하는지(Android 버전 별, 혹은 핸드폰 별 벤치 테스트 등), 기존 S/w가 문제점 혹은 비효율적인 부분이 있는지 찾아서 개선하는 것, 데이터베이스 체계를 구축하는 것, 개발 과정을 자동화 하고 설계를 문서로 정리하는 것 등 많은 역할이 있다.

 

 


우선 비트 메모리를 이해하려면

간단한 게이트 몇 가지를 알고 가야합니다.


여기서 말하는 간단한 게이트란 And, Or, Not, NAND, Xor 등입니다.

추후 기본편으로 기술하겠습니다.

아래의 회로에서 i 는 '입력단자'고 s 는 '입력제어단자'의 역할을 합니다.






다음과 같은 회로에서 대략적인 해석법을 보자면 다음과 같습니다..

i 에 Off(0) 시 1의 결과는 s가 무엇이든 간에 On(1)이 됩니다. 그러면 a에는 1이 인가되고,

3의 결과는 다른 한변이 Off(0)냐 On(1)이냐에 따라 결과가 달라집니다.

2의 결과인 b도 결과 값은 s의 변이 Off(0)이냐 On(1)에 따라 b 값이 달라지게 됩니다.

이 경우에는 S를 미지수 x라 상정시 2가지 결과가 나올 수 있는 것을 알 수 있습니다.

따라서 s는 On이라 가정시 값을 구해보겠습니다.

다시금 정리를 해보면 


1. 첫 번째 회로는 i = Off, s = On 이라 가정시



1의 결과값은 On(1)이 됩니다. 이는 a의 한변으로서 1이 인가가 됩니다.

s는 On(1)이므로 2의 한변은 On/On(a의 값) 이므로 2는 b에 OFF 값을 주게 됩니다.

b는 Off로 4의 한변을 차지 합니다. 그러면 c는 무조건 1이 되게 됩니다.

따라서 3은 On(1)과 On(1)이 되므로


미지수 x의 값은 off(0)가 되며 최종 o의 값은 OFF(0) 값이 나온다는 것을 알 수 있습니다.

 




2. 두 번째 회로는 i = Off, s = Off 라 가정시




1에는 Off/Off 이므로 On(1)의 결과 값을 내므로 a=1이 됩니다.

2의 한변은 a이므로 On/Off(s는 Off라 가정하였으므로) 가 되어 b=1이 됩니다.

이 때부터는 가정법을 써서 2가지 경우의 수를 가지고 생각해봐야 합니다.

a의 한변이 Off(0)일 경우 o=ON(1)을 가지게 되고

4는 On/On이므로 c=OFF를 가지므로 3의 한 변(x)이 OFF가 됨을 알 수 있습니다.


a의 한변이 On(1)일 경우 o=OFF(0)을 가지게 되고

4는 On/Off이므로 c=ON을 가지므로 3의 한 변(x)이 ON이 됨을 알 수 있습니다.




3. 세 번째 회로는 i = On, s = Off 라 가정시










② s가 Off 라면 1은 On의 결과를 보내줍니다.

'Computer Science' 카테고리의 다른 글

운영체제(OS)의 추상화 계층  (0) 2022.12.26
컴퓨터에서 게이트란?  (1) 2022.11.28




Gate는 컴퓨터 안에서 어떤 방식으로 Bit를 만들어 낸다.

입력 비트 2개(a, b)를 조사해서 3번째 비트(c)를 생성한다.



컴퓨터를 구성하는 물리적 기본 소자는 Nand Gate 로 시작하여 Nand Gate로 끝난다고 해도 과언이 아니다.

기본적으로 Nand Gate는 

1. NAND GATE 의 논리표
a,   b,    c(Output)
1. Off/Off/ ON
2. Off/On/ ON
3. On/Off/ ON
4. On/On/ OFF

의 논리 표를 갖는다.



※ Nand Gate에서 중요하게 봐야할 것은 다음과 같다.

Nand Gate에선 상태 표시(a, b) 중 1개가 Off라도 결과c(Output)가 ' On '인 것이 중요하다.
(Nand 논리표 중 2번과 3번 항목)

On/On시 c가 Off나 Off/Off시 c가 On인 것은 And Gate + Not Gate의 조합인 Nand Gate의 기본적인 움직이므로

이 것은 외울 필요조차 없다.




(Nand Gate 와 Not Gate 이다. 그림판이라 참 안습하긴 하지만 그러하다.)



위 그림과 같이 Nand Gate에 Not에 Not을 이어버리면 서로 ' 상쇄 ' 되므로 논리표는 다음과 같이

바뀐다.

2. AND GATE 의 논리표
a,   b,    c(Output)
1. Off/Off/ OFF
2. Off/On/ OFF
3. On/Off/ OFF
4. On/On/ ON

결과적으로 Nand Gate 는 Not 이 지워지므로 And Gate의 특성을 띄게끔 바뀌는 것을 알 수 있다.

'Computer Science' 카테고리의 다른 글

운영체제(OS)의 추상화 계층  (0) 2022.12.26
비트 메모리(Bit Memory)란?  (1) 2022.11.28

+ Recent posts