쌀국수가 코딩배우며 개발일기 쓰는곳 RSS 태그 관리 글쓰기 방명록
개발일기 (10)
2021-12-10 00:13:50

 

컴파일 용어

→ 사람의 말을 컴퓨터가 알아들을 수 있도록 하기 위한 과정들이 있다.

 

용어 설명
소스코드(Source Code) - 원시 코드
- 프로그래머에 의해 작성된 프로그램 문장들 (컴퓨터는 이해 못함)
- ex) test.c
컴파일(Compile) - 원시 코드를 목적 코드로 변환하는 작업
- Compiler = 변환 프로그램
오브젝트 코드(Object Code) - 목적 코드
- 소스 코드를 컴파일한 파일 (컴퓨터가 알아 볼 수 있음)
- ex) test.obj
어셈블리어(assembly language) - 컴퓨터와 일대일 대응이 가능한 언어
- 컴파일 된 파일을 어셈블리어 과정을 통해 기계어로 변환한다.
링크(Link(ing)) - 실행 가능한 형태인 모듈을 만들어내는 작업
- Linkage Editor = 처리 프로그램
로드 모듈(Load module) - 파티션에 저장된 실행 가능한 형태
- ex) test.exe
- Loader = 실행 파일을 메모리에 적재하여 CPU가 처리할 수 있도록 이동시켜주는 역할

 


 

대표 언어별 컴파일 과정

 

언어 컴파일 과정
C
- 조상격 언어, 컴파일(compile) 언어
- 운영체제끼리 호환이 되지 않아서 프로그램을 각 운영체제에 맞춰 짜야한다는 문제점이 있었다.
- 타 언어에 비해 어려운 편이지만 코드를 한 번에 번역하여 전달하는 구조라 속도가 빠르다.
- 시스템 프로그래밍에 잘 어울리는 언어이다.
- 그 외 참고자료
Python
- 인터프리터(Interpreter) 언어
- 중간 과정을 생략하고 인터프리터를 통해 소스코드를 한 줄씩 읽고 해석하며 실행한다.
- 코드가 간결하여 사용하기 쉽다.
- 그 외 참고자료
Java
- 객체 지향 언어
- 자바 가상 머신(JVM)을 사용하여 어느 운영체제에서도 같은 형태로 사용 가능
- Write Once, Run Anywhere
- 자바 컴파일러(javac)를 이용하여 컴파일 후 목적 코드를 만든다. (Test.class = byte code (반 기계어))
- JVM을 거쳐야 하는 문제로 C언어에 비해서 속도가 느리다.
- 그 외 참고자료

 

 

2021-12-07 02:11:00

 

프로그램을 왜 만들까?

→ 자료(Data)를 처리(Process) 해서 정보(Information)를 만들기 위해 (정보화를 하기 위해)

 

정보화

자료(Data) - 세상에 존재하는 모든 것
- 사물은 유형의 데이터이며 본능적인 행동은 직관적인 데이터이다.
처리(Process) - 연산, 수행
정보(Information) - 의사결정에 직접적 또는 간접적으로 영향을 주는 모든 것 (옳고 그름을 따지지 않음)
환원(Feedback) - 정보가 다시 데이터로 돌아가는 것 (정보는 영원하지 않음)
- 시간, 공간, 환경의 영향을 받아서 정보가 다시 데이터로 돌아간다.
✓ 자료의 처리를 더 효율적이고 빠르게 하기 위하여 컴퓨터를 만들었다. (전산화)
✓ 정보화가 전산화보다 더 큰 개념이다.
✓ 데이터가 있는데 모르는 것을 '데이터의 부재'라고 한다.
✓ 컴퓨터를 만들었으나 이진수밖에 하지 못하며 통역이 불가능하자 새로운 언어를 만든 것이 '프로그래밍 언어'이다.

 

원시인 마을과 공룡 이야기는 재밌었다!

 


 

정보화 속 파벌

과거, 정보화의 구조가 생기면서 파벌이 나누어졌다.

 

정보화 파벌
자료처리 (SE, NE, DBA, Security 등) 정보처리 (Programmer 등)

- 자료와 처리를 중요하게 여겼다.
- ex) 요리의 결과가 어떻던 재료가 좋아야 한다.

- 처리와 정보를 중요하게 여겼다.
- ex) 재료가 어떻던 맛있게 하면 된다.
✓ 2000년대 이후 두 파벌의 경계가 모호해지며 하나로 합쳐졌다.
✓ 디자이너와 개발자를 따로 채용하다가 퍼블리셔를 채용하는 개념과 비슷

 


 

체계화

 정보에서 더 발전한 영역을 뭐라 부르나요? 체계화가 맞나요?

 

체계화
사물인터넷(IOT) - 인터넷에 연결되어 IoT 애플리케이션이나 네트워크에 연결된 장치
- 사물이 데이터를 수집한다.
빅데이터(Big data) - 정형, 비정형 등 무수한 데이터들
- 데이터로부터 가치를 추출하고 결과를 분석하는 기술
클라우드(Cloud) - 무수한 데이터들을 수집했으니 저장하자!
지식(Knowledge) - 옳고 그름을 따지며 체계화된 정보를 얻기 위해 빅데이터를 모아 분석하여 나온 정보를 지식이라 한다. (아마도?)
기계학습(인공지능 / AI) - 사람이 가르쳐준 지식을 넘어선 새로운 지식들을 무한하게 만들어내기 위함
- 인공지능 의사 '왓슨(Watson)'이 이에 해당한다.
지혜(Wisdom) - 지식이 아무리 많아도 활용을 못하면 안 되므로 사람의 지혜가 필요하다.
✓ 대표적인 소셜커머스 업체인 쿠팡과 아마존은 빅데이터를 활용하여 엄청난 효율과 이익을 창출해냈다.
✓ 관련 기사 : https://www.ajunews.com/view/20170501000009164

 


 

언어의 정립

 세상에 데이터가 많지만 컴퓨터에게 알려주는 것은 불가능에 가까워 컴퓨터도 알고 있는 '숫자(이진수)'를 바탕으로 정립한다.

 

분류 자료형 타입 부가 설명 
기본 자료형 논리 boolean - True (0을 제외한 모든 수), False (0)
- Java에서는 참은 0000 0001, 거짓은 0000 0000 이다. (즉, 0과 1)
문자 char - ANSI 단체에서 아스키코드(ASCII code)를 정의했다.
- 아스키코드 = 7bit = 2^7 = 0~127 = 총 128개 (하나 남는 숫자는 통신 및 검증용)
- 하지만 서유럽의 문자 수는 127개보다 많기 때문에 ISO에 요청하였고, ISO는 비트를 늘려 서유럽코드(ISO-8859-1)를 정의했다.
- 서유럽코드 = 8bit = 2^8 = 0~255 = 총 256개
- 이후 중국의 천자문과 한국의 팔만대장경으로 인해 2byte로 늘어나며 문자의 표준인 유니코드(Unicode)가 생겼다.
- 유니코드 = 2byte = char = 16bit = 2^16 = 0~65535 = 총 65536개
정수 byte - Java에서 integer는 클래스(Wrapper) 타입이고, int는 원시형 자료이므로 헷갈리지 말자.
short
int
long
실수 float - 소수점 마지막 자리까지의 정밀한 데이터를 얻어내다 보니 자료형의 크기가 커진다.
double
참조 자료형 배열 [] - 동일한 자료형의 데이터들을 묶어놓은 자료 구조
- 구현이 쉽고 성능이 빠르다는 장점이 있다.
- 자료 삽입 및 삭제의 비효율성, 크기의 제약, 자료형의 제약, 메모리 재사용 불가 등의 단점이 있다.
크기의 제약 해결 배열은 생성할 때 지정한 크기를 바꿀 수 없기 때문에 적게 잡으면 공간 부족, 많이 잡으면 공간 낭비의 문제점이 있다.

→ Java의 무한 데이터를 통해서 해결한다. (Java Collection Framework)
→ C의 동적할당자료구조(Stack, Queue, Linked list, ・・・)를 활용한다.
자료형의 제약 해결 서로 다른 자료형을 같이 사용할 수 없다는 문제점이 있다.

→ C의 구조체를 활용한다. (구조체는 메모리를 따로 쓰기에 메모리 관리 문제를 해결할 아래의 방법이 등장한다.)
→ C++의 객체(Object)를 활용한다. (OOP)

- 관념적, 쌀국수가 먹고 싶다. (현재 내 앞에 쌀국수가 없다.) = 객체(Object)
- 쌀국수를 만드는 냄비 = 클래스(Class)
- 주문하여 만들어진 실제 쌀국수 = 개체(객체, Instance)

✓ 자료형과 관련된 내용은 아래 글에서 참고 바란다.

기본자료형의 종류(Primitive Data Types)

기본자료형 & 참조자료형

연산자와 제어문

 


 

저장의 필요성

학생 관리 프로그램을 만들어도 데이터가 저장되지 않으면 컴퓨터를 재부팅할 때마다 데이터가 초기화된다.

 

저장의 필요성
파일 저장(File I.O) - 파일에 데이터를 저장하면 동시 사용이 불가능하다는 단점이 있다.
데이터베이스(Database) - 여러 사람이 공유하며 사용할 목적으로 체계화해 통합 및 관리하는 데이터의 집합이다.
- 한 컴퓨터에 작업과 DB를 함께 두면 CPU와 메모리를 많이 잡아먹는다.
- 작업용 컴퓨터가 아닌 다른 컴퓨터에 DB를 설치하는것이 좋다. (한 여름에 음료 시원하게 마시려고 냉장고 들고다니지 말고 편의점가서 음료 사먹으라는 얘기)
네트워크(Network) - 분산되어 있는 컴퓨터(2대 이상)를 통신망으로 연결한 것.
스레드(Thread) - 컴퓨터는 하나의 작업밖에 처리하지 못하여 네트워크 사용의 어려움을 보완하기 위해 만들어졌다. (요리 하는 사람이 마트를 가면 주방이 비니까 다른 사람을 보내는 얘기)
- 모든 프로세스에는 하나 이상의 스레드가 존재하여 동시에 여러개의 작업을 처리한다.
예외처리(Exception) - 일반적으로 프로그램이 처리되는 동안 특정한 문제가 일어났을 때 처리를 중단하고 다른 처리를 하는 것 (마트로 심부름을 갔으나 재고 부족 등의 문제가 일어났을 때의 해결 방안을 만든다는 얘기)
✓ 연결 구조(? 작업과정 ?) : 파일 저장 → 예외처리 → 스레드 → 네트워크 → 데이터베이스
✓ 그 외 화면 만드는 과정 (잘 안쓰는 것들임) : 파일 → AWT(GUI) → Event → Graphics → Applet → Swing(JFC) → SWT → Java FX
2021-12-07 01:56:33

IT 산업

SI 업체 System 통합 (SDS 등의 업체가 있음)
- 전문 : 1인 파견
- 일반 : 팀 단위 파견
SM 업체 System Management (운영, 관리)
- 전문 : 솔루션 판매 / 파견
- 일반 : 솔루션만 판매 / 솔루션 개발자 양성 등
Agency 홈페이지 제작
- 공공기관(구청), 학교, 교회, 개인사업자 등

✓ SI에서 SM으로 갈 수 있지만 SM에서 SI로 가는건 어렵다. (SI는 다양한 분야를 하는데 SM은 분야가 정해져 있기 때문(?))

✓ 예산 및 프로젝트를 받아서 작업하는 과정 중 바쁜 시기는 6~8월이다. (채용 공고가 많이 올라옴)

 

초급 개발자 - 컴공과 4년제 졸업
- 정보처리 산업기사 이상 취득
- 평균 월급 186.4
중급 개발자 - 초급 이후 3년 경력 (Business Day(미근무일 제외))
- 컴퓨터 공학 석사
- 평균 월급 253.6
고급 개발자 - 중급 이후 3년 경력 (Business Day)
- 컴퓨터 공학 박사
- 평균 월급 336.4
특급 개발자 - 고급 이후 3년 경력 (Business Day)
- 평균 월급 436.5
2021-09-27 22:19:37

별찍기_기초

  j0 j1 j2 j3 j4
i0 * * * * *
i1 * * * * *
i2 * * * * *
i3 * * * * *
i4 * * * * *

 

위의 사진을 표로 나타내었다.

j는 하나의 별을 반복 출력 하기위한 내부 틀이며

ij를 몇 줄 출력할지 반복하기 위한 외부 틀이 될것이다.

 

#include <stdio.h>
int main()
{
    int i, j;

    for(i=0; i<5; i++) //외부 반복 틀 (총 5번 반복)
    {
        for(j=0;j<5;j++) //내부 반복 틀 (총 25번 반복(내부*외부))
        {
        printf("*");
        }
        printf("\n"); //내부 반복이 끝나면 한 줄 띄어쓰기
    }
    return 0;
}

별찍기_비스듬한 계단

  j0 j1 j2 j3 j4 j5
i0 * *        
i1 공백 * *      
i2 공백 공백 * *    
i3 공백 공백 공백 * *  
i4 공백 공백 공백 공백 * *

 

위의 표에서 규칙을 찾아보자.

공백 먼저 출력 후 별을 출력해야하는 규칙과,

공백은 0~4까지 순차적으로 늘어난다는 규칙을 알 수 있다.

그리고 아래 코드와같이 반복문 외부에서 변수를 출력할 일이 없을땐 반복문 초기식 안에서 변수를 선언해주어도 된다.

j, k는 i처럼 타 변수와 비교할 일이 없으므로 k를 j로 써줘도 되지만 헷갈릴까봐 변수 이름을 3개 사용했다.

 

#include <stdio.h>
int main()
{
    for(int i=0; i<5; i++) //총 5줄이 반복 출력된다.
    {
        for(int j=0; j<i; k++) //공백은 0부터 시작해서 i보다 작을때까지 반복한다. (i2(3번째 줄)면 j0,j1 2번 출력)
        {
            printf(" ");
        }
        for(int k=0; k<2; k++) //별은 k0, k1 두 번 출력을 반복한다.
        {
            printf("*");
        }
        printf("\n"); //내부 반복문들이 끝나면 한 줄 띄운다.
    }
}

별찍기_피라미드 (정방향)

  j0 j1 j2 j3 j4 j5 j6 j7 j8
i0 공백 공백 공백 공백 *        
i1 공백 공백 공백 * * *      
i2 공백 공백 * * * * *    
i3 공백 * * * * * * *  
i4 * * * * * * * * *

 

공백은 4~0순으로 감소하면 된다.

별의 규칙을 살펴보자. '1, 3, 5, 7, 9' 즉, 2씩 늘어난다.

처음엔 감을 못잡았다. '어떻게 i 값에 따라 첫줄에 1개만 쓰고 이후 2개씩 늘어나게 하지??' 하고..

i 값에 따라 늘어나야 하므로 아래와 같이 i*2+1을 해주었다.

*첫 줄은 별을 1개만 출력해야 하므로 i0일땐 0*2+1 = 1

 

#include <stdio.h>
int main()
{
    for(int i=0; i<5; i++) //외부 반복문 (5번 반복)
    {
        for(int j=0; j<5-i; j++) //공백 반복 (i0 = j<5-0 = 4번 반복)
        {
            printf(" ");
        }
        for(int k=0; k<i*2+1; k++) //별 반복 (i0 = k<0*2+1 = 0번 반복)
        {
            printf("*");
        }
        printf("\n"); //내부 반복이 끝나면 한 줄 띄어쓰기
    }
}

별찍기_피라미드 (역방향)

  j0 j1 j2 j3 j4 j5 j6 j7 j8
i0 * * * * * * * * *
i1 공백 * * * * * * *  
i2 공백 공백 * * * * *    
i3 공백 공백 공백 * * *      
i4 공백 공백 공백 공백 *        

 

정방향도 했는데 역방향은 쉽지 않을까? 했지만 내 머리로는 쉽지 않았다.

공백은 i 값과 동일하게 늘어나면 된다지만 별은..

별의 왼쪽이 n개가 없어지면 오른쪽도 n개가 없어진다. 또한 i의 값과 왼쪽, 오른쪽의 별이 사라지는 수는 동일하다.

별의 최대 출력수는 9개다. 고로 9개에서 i*2를 빼주면 된다.

 

#include <stdio.h>
int main()
{
    for(int i=0; i<5; i++) //외부 반복문
    {
        for(int j=0; j<i; j++) //공백 반복 (i2 = j<2 = j0,j1 = 2번 반복)
        {
            printf(" ");
        }
        for(int k=0; k<9-i*2; k++) //별 반복 (i2 = k<9-2*2 = k<5 = k0,k1,k2,k3,k4 = 5번 반복)
        {
            printf("*");
        }
        printf("\n"); //내부 반복이 끝나면 한 줄 띄어쓰기
    }
}

 

 

 

 

2021-08-22 11:01:38

이전 Code Runner를 사용하여 구축을 해봤으나 scanf가 실행되지 않았다.
tasks.json을 이용한 환경 구축을 하려고 수많은 블로그들을 참조해봤지만 너무 복잡하기도 하고 오류만 났다.
그나마 제일 간단한 방법을 찾아왔다. (외부 터미널에서 실행되도록 하는 방법도 찾아봐야겠다.)


확장 프로그램 설치

VScode를 처음 깐 사람들의 기준으로 설명하겠습니다. (VScode 설치는 알아서)

좌측 아이콘 바에서 블럭모양 아이콘을 눌러 '확장' 탭으로 들어간 후 하단에 적어놓은 4개의 확장팩을 설치합니다.

C/C++ (C언어를 사용하기 위해 저녀석은 기본으로 까셔야 합니다.)
Codelldb (디버깅을 하기위한 팩이라고 하더라구요.)
Korean Language Pack for Visual Studio Code (한국어 언어팩입니다. 설치 후 재시작 하십시오.)

 


C언어 환경 구축

 

1. c 파일 생성

아무 코드를 입력한 C언어 파일을 생성합니다. (C++말고 C 기준)
파일명 뒤에 .c 를 꼭 붙여야 c언어 파일이 됩니다.

 

 

2. 아무 코드 작성

간단한 hello world 코드를 올려두겠습니다. 복사해서 쓰십시오.

1
2
3
4
5
6
#include <stdio.h>
int main(void)
{
    printf("hello world");
    return 0;
}
cs

 

 

3. tasks.json 생성

command+shift+B를 누른 후 [C/C++: gcc 활성 파일 빌드]의 우측 톱니바퀴 모양을 눌러 tasks.json을 생성합니다.

저는 이것저것 설정해보느라 여러분들의 화면과 다를 수 있습니다.

 

 

4. exe 실행 코드 삽입

생성 후 초기값은 코드가 한 단락밖에 없을겁니다.
아래 사진과 같이 코드 한 단락 아래에 새 코드를 넣어주도록 하겠습니다.

1
2
3
4
5
6
7
8
9
        {
            "label": "EXE",
            "type" :"shell",
            "command": "${fileDirname}/${fileBasenameNoExtension}",
            "group": "build",
            "problemMatcher": [
                "$gcc"
            ]
        }    
cs

붙여 넣은 후 저장~!
*코드를 붙여 넣은 후 반드시 위 사진속 빨간색 박스 선 바로 위 } 이것에 쉼표를 사진과 같이 찍어주어야 합니다.

 

 

 

5. 빌드 실행

command+shift+B 를 누른 후 [C/C++: gcc 활성 파일 빌드]를 실행해 줍니다. (exe 파일을 저장한다는 느낌?)
이후 다시한번 command+shift+B 를 누른 후 [EXE]를 실행해 줍니다. (exe 파일 실행) (EXE 버튼이 없을경우 맨 아래 참고)

*이 작업(빌드 후 실행)은 매 코드 실행마다 해주어야 합니다.

 

빌드 후 실행을 하였다면 아래 사진과 같이 내부 터미널에 코드가 실행된것을 보실 수 있습니다.

저는 여러분들과 다른 코드를 실행했습니다. 여러분들은 hello world가 출력되겠죠.


[EXE] 버튼이 없을 경우

 

상단탭 > 터미널에서 [작업 실행...] 또는 [활성 파일 실행]을 눌러보세요.

저도 새로 구축했다가 [EXE]가 안뜨길래 저거 두개 눌러봤는데 생김..


끝 ^^!

2021-08-13 00:35:50

C언어 수업을 들어야하는데 아무리 구글 뒤져가며 설정해봐도 나만 안되고..
그래서 다시 한번 찾아보다가 발견한 블로그를 보며 따라 설정해봤더니 hello world 출력 됨 ㅠㅠ 감격..
외부 터미널에서도 실행 할 수 있도록 방법을 더 찾아보긴 할건데 일단 환경 구축 방법 기록해둬야지.


 

Visual Studio Code (VScode) 설치

맥(MAC)용 VScode 설치 버튼을 눌러주면 된다.

 


 

확장 프로그램 설치

VScode를 처음 깐 사람들의 기준으로 설명하겠습니다.

좌측 아이콘 바에서 블럭모양 아이콘을 눌러 '확장' 탭으로 들어간 후 하단에 적어놓은 4개의 확장팩을 설치합니다.

C/C++ (C언어를 사용하기 위해 저녀석은 기본으로 까셔야 합니다.)
Code Runner (간단하게 실행시켜주는건가 봅니다.)
Codelldb (디버깅을 하기위한 팩이라고 하더라구요.)
Korean Language Pack for Visual Studio Code (한국어 언어팩입니다. 설치 후 재시작 하십시오.)

 


Code Runner 실행

코드가 입력된 창에서 [우클릭 > Run Code] 또는 [control + option + N]을 눌러 Code Runner를 실행시켜줍니다.
그러면 아래 이미지와 같이 코드가 잘 실행된것을 보실 수 있습니다. (꾸벅)


대부분의 사람들이 저것보단 tasks.json에서 코드를 수정하여 작업하는 이유가 있을텐데
당분간은 저걸 사용하도록 해야겠다.

 

+ (210822)
문제점을 찾았습니다. scanf를 실행할 수 없다. 다음 포스팅에서 tasks.json을 이용한 환경 구축을 설명하겠다.

 

 

 

참고 : https://dmsitter.tistory.com/21