정처기_ part4_ 프로그래밍 언어 활용
절차지향 프로그래밍
=> 내가 기억해야 할 것 요약!
(1) C언어
1) 데이터가공 및 입출력
2) 선택 및 반복 제어
3) c언어 고급
4) 코드의 품질 향상
(1) C언어
3) c언어 고급
배열)
개념_하나의 식별자로 같은 타입의 여러 데이터 제어, 연속적 공간에 생성된 데이터를 첨자(index)로 탐색, index로 순서 확인 가능
초기화_일부분만 초기화 되는 경우 나머지는 0으로 초기화, 초기화 별도진행 경우 하나씩 초기화 해야 함
#include <stdio.h>
int main()
{
int ar1[5] = {1,6,4,5,3}
int ar2[5] = {0,0,0,0,0}
int ar3[5] = {0}
return 0;
}
// 5칸 배열 생성 후 1,6,4,5,3 데이터 초기화
// 5칸 배열 생성 후 0,0,0,0,0 데이터 초기화
// 5칸 배열 생성 후 첫데이터를 0, 나머를 0으로 초기화
주소상수)
배열이름은 주소상수(데이터 할당 불가능), 배열의 첫 데이터 주소값, 주소값에 정수를 더하면 포인터 연산 진행 됨
변경 x(상수)
포인터 연산)
접근하려는 데이터의 간격 단위로 주소값을 증가시켜주는 연산.
배열 데이터는 동일한 크기(ex,4byte)로 나열되어 있음. 주소지정단위는 1byte, 각 데이터의 첫번째 byte주소를 대표주소값으로 지정함. N번째 데이터 주소값 == 주소값+N
주소가 지정되는 단위 1byte, 정수의 크기는 4byte
만약 첫번째 데이터 주소값이 100이라면 나란히 붙은 두번째 데이터 주소값은 104.(주소값간격 4byte=정수의 크기)
100(주소) 더하기 1 은 104 (101x)
첨자index)
배열 요소 중 원하는 위치에 접근하기 위해 사용. 첫 위치는 1이 아닌 0으로 시작. 값 == <배열이름>[<첨자>]
#include <stdio.h>
int main()
{
int ar[5] = {1,6,4,5,3};
printf("%d \n", ar);
printf("%d \n", ar+1);
printf("%d \n", ar[1]);
return 0;
}
// 5칸 배열 생성 후 1,6,4,5,3 데이터 초기화
// 배열이름 값(주소) 출력
// ar배열의 1번째 데이터의 주소 출력(4만큼 증가(정수의 크기)한 주소값 출력)
// ar배열의 1번째 값 출력(배열은 0,1,2,3,4,... 0번째,1번째,2번째 라는거!)
2차원 배열)
배열 안에 배열
배열의 요소로 다른 배열이 구성된 구조, 2쌍의 대괄호&첨자로 선언&제어, 중첩 중괄호로 데이터 초기화, 중괄호가 하나인 경우엔 순서대로 초기화 진행, 편의상 첫번째 인덱스를 행, 두번째 인덱스를 열로 표현
#include <stdio.h>
int main()
{
int arr1[2][3] = {1,2,3,4,5,6};
int arr2[2][3] = {{1,2},{4,5}};
printf("%d %d %d\n", arr1[0][0], arr1[0][1], arr[0][2]);
printf("%d %d %d\n", arr1[1][0], arr1[1][1], arr1[1][2]);
return 0;
}
// 2행3열 배열생성 (3개의 요소를 가진/배열요소를 2개 가진)
// 3개 요소 중 각각 2개 요소를 초기화 (나머지 요소는 0으로 초기화)
// 0행 0, 1, 2열에 해당하는 값 출력
// 1행 0, 1, 2열에 해당하는 값 출력
1 | 2 | 3 |
4 | 5 | 6 |
1 | 2 | 0 |
4 | 5 | 0 |
for문 활용 배열)
for문을 이용하여 배열 할당/출력 반복, 인덱스 위치에 반복용 변수 활용, 시작값과 종료값 설정에 주의(0부터 시작!)
#include <stdio.h>
int main()
{
int i, ar[5]; //반복용 변수와 배열 생성(초기화x)
for(i=0; i<5; i++) //0~4 반복(초기화o)
// ar[0] = 1;
// ar[1] = 2;
// ar[2] = 3;
// ar[3] = 4;
// ar[4] = 5;
ar[i] = i+1;
for(i=0; i<5; i++) //0~4 반복(출력)
printf("%d", ar[i]);
return 0;
}
포인터 연산자)
개념) 데이터 주소값으로 직접접근이 가능한 연산자, 데이터 원본 가공 가능, 포인터 연산 가능. 포인터 변수는 값이 아닌 주소를 저장
<참고 데이터 타입>*<식별자> : 포인터 변수 선언, <포인터 변수>= &<데이터 변수> : 데이터 주소값 할당
*<포인터변수> = <값> : 포인터 변수가 가리키는 데이터 공간에 값을 할당
#include <stdio.h>
main()
{
int data = 10; //정수형 변수 생성
int *p; //포인터 변수 생성
p = &data; //포인터 변수에 data변수의 주소값 할당
*p = 20; //p에 저장 된 주소값(data주소)위치로 접근하여 20할당
printf("%d \n", data);
printf("%d \n", *p);
printf("%d \n", p);
}
//data값 출력
//p에 저장된 주소값(data주소)위치의 값 출력
//p에 저장된 주소값(data주소)출력
=> *p=20은 p가 가리키는 공간(data)에 20을 할당
배열과 포인터)
포인터 변수에 배열 이름(주소상수)을 할당하면 포인터 변수로도 배열 요소에 접근 가능.
배열주소를 포인터 변수에 할당하여 배열 제어 가능, 배열 이름은 주소상수기 때문에 주소값 재할당x
#include <stdio.h>
int main()
{
int ar[5] = {1,6,4,5,3};
int *pr;
pr = ar; //ar은 주소상수. & 안붙여도 됨
printf("%d \n", ar[2]);
printf("%d \n", pr[2]);
printf("%d \n", *(pr+2));
return 0;
}
//ar배열의 2번째 값 출력(0,1,2번째)
//pr에 저장된 주소값(ar배열)위치의 2번째 값 출력
//pr에 저장된 주소값(ar배열)위치의 2번째 값 출력
함수)
기능별로 구분하여 프로그램 내에서 반복사용(재사용) 가능한 작은 프로그램 코드.
정의된 함수를 호출하여 반복적으로 사용
main함수 블록 바깥에서 정의, 블록 안에서 호출
main함수 내에서 함수 호출->main함수 진행 일시정지->호출된 함수 진행->main함수 진행
함수 호출 시 필요한 인수 전달 가능(선택적)
기본 라이브러리(미리 만들어 둔 함수) 제공 ( #include<stdio.h>는 라이브러리 파일)
#include <stdio.h>
int 함수명() // 1. 함수정의
{
실행 될 코드 //3.함수진행
}
int main()
{
함수명(); // 2. 함수호출, main함수 일시정지
//4. main함수 진행
return 0;
}
return함수) return <결과값>;
리턴값이 있는 함수의 정의와 호출
함수의 결과를 호출 위치로 돌려받는 방식, 돌려받은 결과를 바로 사용하거나 변수 할당 가능, 결과값에 대한 타입은 사전에 정의.
#include <stdio.h>
int add_value(int a, int b) // 2. a에5, b에10 할당 후 코드 진행
{
int c = a + b; // 3. a와 b의 합을 호출 위치로 반환(return)
return c;
}
int main()
{
int k; // 1. add_value함수 호출하며 5와 10을 인수로 전달
k = add_value(5,10); // 4. 반환된 값(add_value의 결과)을 k에 할당
printf("%d", k); // 5. k값을 출력
return 0;
}
<-> 리턴값이 없는 함수의 정의와 호출
함수의 결과를 돌려주지 않고 종료되는 방식, 결과값이 없으므로 타입 대신 void 선언
#include<stdio.h>
void add_value(int a, int b) //2.a에5, b에10 할당 후 코드 진행
{
int c = a + b;
printf("%d", c); //3.a와b의 합을 출력
return;
}
int main()
{
add_value(5, 10); //1.add_value함수 호출하며 5와10을 인수로 전달
return 0;
}
***어
매개변수에 인수를 전달하는 방법)
1. 값에 의한 매개변수 전달(call by value)
함수에 인수를 전달하면, 원본 값이 복사되어 진행, 함수 내에서 가공된 값은 원본에 반영되지x
2. 참조에 의한 매개변수 전달(call by reference)
인수로 데이터의 주소값(&)을 전달, 포인터(*)변수를 매개변수로 선언, 호출 된 함수에서 데이터 원본 가공 가능
#include <stdio.h>
void fa(int x, int *y) //2. 변수 x에 n값(10) 할당
{ //포인터변수 y에 k의 주소값을 할당한 후 코드진행
x = x + 5; //3. x의 값을 5 증가
*y = *y +5; //4. y에 저장된 주소값(k주소)위치로 접근하여 5증가
return;
}
int main()
{
int n=10, k=20;
fa(n, &k); //1. fa함수 호출하며 n과 k의 주소값을 인수로 전달
printf("%d %d", n, k); //5. n과 k 출력(10, 25)
return 0;
}
구조체) <struct><타입 식별자>{<변수 선언>};
개념_서로 다른 타입의 데이터를 묶는 구조. 이미 제공되는 자료형을 이용하여 새로운 자료형 구성, 형식통일x, 구조먼저 정의후에 변수 선언하여 사용
정의_main함수 블록 바깥에서 블록 구조로 정의, 구조체 내부 변수는 데이터 초기화x(레이아웃)
변수 선언_정의된 구조체 타입의 변수 선언, <변수 식별자>.<내부 변수명>으로 접근,
<struct><타입 식별자><변수 식별자> = {<초기값>,<초기값>, ...}의 형대로 선언 및 초기화
#include <stdio.h>
struct student{
int no; //구조체 내부변수 초기화x
int score;
char grade;
};
int main()
{
struct student kim = {3021, 94, 'A'}; //student 타입의 변수생성, 초기화
struct student jane = {2113, 86, 'B'};
jane.score = 82; //구조체 변수 데이터 재할당
pritf("%d %c \n", kim.score, kim.grade); //구조체 변수 kim의 score, grade 값 출력
pritf("%d %c \n", jane.score, jane.grade); //구조체 변수 jane의 score, grade 값 출력
return 0;
}
4) 코드의 품질 향상
코드의 최적화 기법)
클린코드 짱, 스파게티코드 꺼져
클린코드 작성원칙)
가독성, 단순성(하나의 기능만 수행하도록 함수 기능분리), 의존성(결합도 최소화), 고유성(중복성 제거), 추상화(각 기능들의 공통부분을 재사용 모듈로 구성)
표준화된 코딩형식)
하나의 라인/하나의 명령, 코드의 정의 후 사용, 가독성 좋은 식별자와 코드 사용, 적절한 주석문 사용
코드의 품질 향상 기법)
테스트(가장 일반적인 코드 검증 방법), 코드 인스펙션(inspection)코드에 존재하는 결함을 확인),
정적분석(static 프로그램실행x 코드구조 분석), 동적분석(dynamic 프로그램실행o 결과를 분석), 증명(proof 품질이 아주 중요한 경우 활용)
리팩토링)
코드의 기능이 아닌 구조를 개선(안정성 향상), sw 디자인 개선(가독성 향상)
정적분석도구)
pmd : java 및 다른 언어의 버그와 데드 코드를 분석
cppcheck : c/c++에 대한 결함 및 오류를 분석
SonarQube : 소스코드의 품질을 체크하는 통합 플랫폼 도구
checkstyle : java 코드의 표준 준수 여부를 분석
동적분석도구)
valanche : 프로그램의 결함 및 취약점을 분석
valgrind : 메모리 누수, 쓰레드 결함 등을 분석
'STUDY > languages' 카테고리의 다른 글
파이썬 프로그래밍&코딩 스타일 가이드 (0) | 2021.08.31 |
---|---|
프로그래밍 파이썬(언어) (0) | 2021.08.10 |
프로그래밍 자바(언어) (0) | 2021.08.09 |
프로그래밍 자바(객체) (0) | 2021.08.09 |
프로그래밍 c언어 기초 (0) | 2021.08.09 |