반응형

클린코더

- 로버트 마틴- 

로버트 마틴이 이때까지 일하면서 겪은 일이나 구체적인 상황을 속에서 프로는 어떻게 일해야하는지 책에서 나오고 있다. 좋은 개발자가 되기 위해 익혀야 할 자세와 지식에 대해 알려 주고 있다. 

프로의 마음가짐

모든 분야의 프로는 책임감을 가지고 실수에 책임지는 사람이 되야한다.

QA가 아무것도 찾지 못하도록 최대한 오류가 없는 코드를 만들기 위해 코드가 제대로 작동하는지 항상 체크한다.

자동화된 단위 테스트를 사용하면 전체 구조에 해를 입히지 않을 수 있다.

전산 분야 지식을 익히자

“과거를 기억하지 못하는자, 그 과거를 반복하는 저주를 받을지니...” - 산타니야 -

오래된 아이디어가 쓸모없어진다는 말은 단연코 사실이 아니다.

프로 소프트트웨어 개발자라면 알아야 하는 최소한의 기술목록

  1. 디자인 패턴 : GOF 패턴, POSA 패턴
  2. 설계 원칙 : SOLID 객체지향 원칙, 컴포넌트 개념을 이해
  3. 방법론 : XP, 스크럼, 런, 칸반, 폭포수, 구조적 분석, 구조적 설계 개념을 충분히 이해
  4. 원칙 : 테스트 주도 개발(TDD), 객체지향 설계, 구조적 프로그래밍, 지속정 통합, 짝 프로그래밍 실천
  5. 도구 : UML, 데이터 흐름도, 구조 차트, 페트리 넷, 상태 전이 다이어그램과 테이블, 흐름도, 결정 테이블 사용 방법 숙지

아니라고 말하기

정해진 기간보다 빠르게 끝내달라고 하는 일을 확실하게 설명하여 이해시키고 아니라고 말할 줄 아는 사람이 프로다.

예상 데드라인에서 고객들은 항상 추가 요구사항을 요구한다. 이 점도 항상 생각하고 데드라인을 설정해야한다. 데드라인을 잘 못 설정하여 하드코딩, 코드 재사용, 단위 테스트를 생량한다면 프로 답지 못한 것

예라고 말히기

프로는 모든 업무 요청에 에라고 대답할 필요가 없다. 하지만, 예라고 대답할 수 있는 방법을 찾아야한다. 예라고 답할때는 확실한 데드라인을 말해 약속을 뜻하는 언어를 사용하여 모호한 부분이 없도록 해야한다.

약속을 할때 필요/해야한다, 희망/바람, 하자 같은 단어가 아닌 “나는 화요일까지 문서 작성을 할 것 이다” 같은 명확한 마감 시간을 언급하고 업무를 서술해야한다.

마감일을 정하는 것은 두려울 수도 있는 일이지만, 내뱉은 말을 지키는 개발자는 프로로 인정받게 될 것이다.

코딩

코드를 짤 떄 행동과 기분, 태도에 대한 원칙을 소개한다.

  1. 코드는 반드시 동작해야 한다. 풀고자 하는 문제가 어떤 문제며 어떻게 풀어야 하는지 이해해야 한다.
  2. 코드는 고객이 제시한 문제를 반드시 풀어야 한다.
  3. 기존 시스템에 잘 녹어들어야 한다. 견고한 객체지향 원칙을 따라야 한다.
  4. 다른 프로그래머가 일기 쉬워야 한다.주석을 잘 다는건 당연하고 만든 사람의 의도가 잘 들어나도록 코드를 잘 다듬어야 한다.

태도

코드를 짤 때 충분한 휴식을 취하는 것도 중요한다. 어떻게든 마무리를 한 소스는 동작 할 수는 있지만 좋은 소스가 될 확률이 그렇게 크지 않을 것 이다.

코드를 잘 때 백그라운드 근심이 생산성을 빨아먹는다. 일 하는 시간동안 내 근심을 멈추는고 나중에 버려야 코드를 짜는 일을 없도록 하자

몰입

“몰입” 영억으로 가는게 사실 극도로 생산적이지도 않고 당연히 절대 옳은 것도 아니다. 몰입에 빠지면 더 많은 코드를 쓰려한다. 이 상태에서 큰 그림을 놓쳐, 나중에 되돌려야 할 결정을 내릴 수도 있다.

연습할때는 몰입 상태에 반드시 빠져야 한다.

짝 프로그래밍은 몰입에 빠질 가능성이 없애 준다.

진퇴양난에 빠진 글쟁이

코드가 안나올 때는 다른 업무를 보거나 잠깐 딴짓을 해보자 코드를 살피는 일만 피하고 어떤 일이든 해보자. 보통 수면이 부족할때, 작가는 이런 일이 많이 일어난다고 하였다.

짝 프로그래밍을 하면 당신을 막던 문제는 녹아 없어질 것이다!! - 작가 - 또 창의적인 소스를 차끼 위해서는 평소에 책을 읽는 것도 좋은 방법이다. 단순하게 소프트웨어 관련 책 뿐 만이 아닌 정치, 소설, 공상과학소설 등 다양한 INPUT은 다양한 OUTPUT을 낼 것 이다.

디버깅

디버깅 역시 코딩 시간의 일부이다. 디버깅 시간을 피하거나 줄이는 것은 좋은 일이다.

디버깅 시간을 줄이기 위해서는 테스트 주도 개발 원칙을 받아들이자

의사는 저지를 잘못을 고치려고 환자를 다시 수술하는 것을 좋아하지 않는다. 변호사는 망쳐버린 사건을 다시 재판하고 싶어 하지 않는다. 이런 일을 너무 자주하는 의사, 변호사는 프로라고 할 수 없다.마찬가지로 오류를 만드는 소프트웨어 개발자는 프로답지 않다.

도움

프로그래밍은 어렵다. 프로그래밍은 수많은 if와 while 문장의 덩어리다. 너무 어렵기 때문에 한 사람의 능력으로는 잘 해내기가 어렵다. 아무리 기술이 뛰어나도 반드시 다른 프로그래머의 아이디어에서 도움을 받는다.

이런 이유로 서로 도울 준비를 하는 일은 프로그래머의 의무다. 항상 다른 이가 나를 도울 때는 감사하고 기꺼이 도움을 받아들여라. 또 내가 도움을 줄 수 있을땐 도움을 청하는 사람을 무시하지 말자!

테스트 주도 개발

테스트 주도 개발(TDD)를 적용하면 아주 빠른 반복 시간을 확보할 수 있다.

작성한 코드가 전부 잘 돌아가는지 알지 못한다면 어찌 프로라고 할 수 있겠나? 변경할때마다 테스트 하지 않는다면 코드가 전부 잘 돌아가는지 어찌 알까

TDD 세 가지 법칙

  1. 실패한 단위 테스트를 만들기 전에는 제품 코드를 만들지 않는다
  2. 컴파일이 안 되거나 실패한 단위 테스트가 있으면 더 이상의 단위 테스트를 만들지 않는다.
  3. 실패한 단위 테스트르 통과하는 이상의 제품 코드는 만들지 않는다.

처음에는 작은 단위 테스트를 만들며 시작하고, 테스트가 컴파일되도록 하고 제품 코드를 만들어야 한다. 테스트가 컴파일 되면 제품 코드를 만들고 또 단위 테스틀 추가하고 위의 과정을 반복한다.

혜택

단위 테스트를 통해 내가 만든 변경이 다른 부분을 망가뜨리지 않았다고 거의 확신할 수 있다.

코드 결합 시의 주입 비율이 낮아진다.

나쁜 코드르 봐도 고치지 않는 이유 중 하나가 손을 대면 뭔가 망가뜨릴지도 모른다는 위험 때문이다. 클릭 한 번 만으로 내가 방금 바꾼 내용이 아무것도 망가트리지 않고 오직 도움만 됐다는 사실을 알 수 있다면 나쁜 코드를 수정 할 때의 두려움이 없어지지 않겠는가?

인수 테스트

인수 테스트란 실제 사용자 환경에서 사용자의 입장으로 테스트를 수행하는 것을 말한다. 이 책에서는 요구사항이 언제 완료되는지를 정의하기 위해 이해당사자들과 프로그래머들이 힘을 모아 작성하는 테스트라고 정의한다.

서류와 실제 시스템의 동작은 다르다. 사업부는 자신들이 서술했던 내용이 실제 시스템에서 돌아가는 모습을 보자마자, 원하는 내용이 전혀 아니라는 사실을 깨닫는다. 요구사항이 실제 동작하는 모습을 보면 더 나은 생각이 떠오르는데, 그 생각은 대개 눈앞의 시스템과는 많이 다르다.

요구상항 관련 의사소통에서 프로토타입(prototype)을 활용하면 고객의 요구사항의 변경을 최소화 할 수 있다.

또 한 고객이 요구사항에 대해 모호하게 표현한 경우

  • 고객 - 모든 로그 파일 저장 (0~현재까지 통합 로그파일)
  • 개발자 - 모든 로그 파일 저장 (매일 백업 로그파일 1개씩 따로 저장)

이러한 모호함을 제거 하는 일이 프로개발자의 책임이다.

‘완료’에 대한 정의

완료는 모든 코드를 작성했고, 모든 테스트를 통과했음을 의미한다. QA와 전문가, 이해당사자들이 이를 인수했다는 뜻 이게 완료다.

이 정도 높은 완료 수준을 지키는 동시에 한 반복 주기에서 다음 반복 주기로 빠르게 넘어갈 수 있을까? 우 기준을 만족하는 자동화 테스트를 만들고 통고하면 된다! 각 기능에 대한 인수 테스트를 통과해야 업무가 완료된다.

이러한 인수테스트는 자동화를 쉽게 만들어주는 오픈소스와 상업용 도구를 통해 자동화된 테스틀 구현해야 한다.

지속적 통합

지속적 통합 시스템을 사용해 모든 단위 테스트 + 인수 테스트를 하루에 몇 번이라도 실행할 수 있도록 확실히 해야한다.

시간관리

시간 관리 규칙을 만들고 지키자

회의

회의는 많은 비용이 드는 작업이다. 프로는 회의 비용이 비싸다는 사실을 알아야한다. 다앚의 이익이나 큰 이득이 없는 회의에는 적극적으로 참석을 거부한다.

회의가 계획대로 흘러가지 않는다면 적당한 때를 봐 회의에서 빠져도 되는지 물어 보는 일은 프로 답지 못한 행동이 아니다.

전체 회의 시간은 50분이 넘으면 안된다.

”어떤 논쟁이든 5분 안에 해결되지 않으면 논쟁으로는 해결할 수 없다” - 켄트 벡 -

자기 입장에 실제 데이터를 가진 경우가 아니라면 논쟁은 뒤로 미루자

일일 회의, 스프린트 회의는 스크럼방법을 참고하자.

의제와 목표를 정해라

회의에 명확한 agenda와 주제가 없다면 정중히 참석을거부해 한다. 회의 참석 중에 agenda가 폐기되거나 다른 내용이 끼어든다면, 정식으로 회의에 올리고, agenda 또한 다시 정해야 한다고 요청해야 한다.

집중력

집중력은 게임의 마나처럼 소모되는 자윈이다. 많이 집중해서 업무를 했다면 수면, 카페인 등으로 집중력을 다시 채워주자

포모도로 방법

타이머를 맞추고 정해진 시간동안은 모든 일을 무시하고 정해진 일만 한다. 외부요인이 방해하면 25분 후에 다시 찾아와 달라고 정중히 부탁한다.

진흙탕, 늪,수령, 기타 엉망진창

진흙탕은 막다른 길보다 더 나쁘다. 진흙탕에 빠지는 일은 자신도 모르는 사이에 일어난다. 처음에 간단한 문제에 대한 해결책을 만들고, 코드를 주의깊게 관리해 단순하고 깔끔하게 만든다. 하지만 문제의 범위의 복잡도가 점점 커지면서 기반 코드를 확장하고 최선을 다해 깔끔하게 만들지만 어느 순간 처음부터 설계가 잘못됐고 코드가 요구사항이 움직이는 방향으로 뻗어나가지 못한다느 사실을 깨닫게 된다.

이때 뒤로 물러서 설계를 고칠 수도 계속 앞으로 나갈 수도 있다. 처음부터 다시 시작하는 일은 힘든 일이지만, 이때야말로 되돌아가기 가장 쉬운 지점이다. 진흙탕에서 앞으로 나가다보면 언젠가는 가라 앉아 버릴 수 밖에 없다.

 

 

느낀점

이 책에 나온 상황 처럼 팀프로젝트 데드라인이 임박하여 좋은소스를 짜기보다는 그냥 어떻게 해서라도 동작하는 프로젝트를 진행했던 것 같다. 소프웨어공학에 대해 배웠지만 어쨌든 기능 구현에만 신경쓰고 소스의 구조, 팀원들간의 협력방법 등에 대해 잘 고려하지 않고 프로젝트를 진행했다. 앞으로 대학교에서 프로젝트를 할 날이 아마 다음 학기 밖에 없을 것 같지만, 이 책에서 말한 프로가 되기 위한 요구조건들을 꼭 명심하고 프로젝트를 진행해야 겠다.

반응형
반응형

reshape 콜백함수

원도우 창을 움직일때 마다 호출하는 함수 

#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
void mydisplay() {
	glClear(GL_COLOR_BUFFER_BIT);		//컬러 버퍼에 초기화 할 색 경정
	glBegin(GL_POLYGON);				//다각형 그리기
	glColor3f(255.0, 255.0, 0);			//색상
		glVertex3f(-0.5, -0.5, 0.0);	//좌표
		glVertex3f(0.5, -0.5, 0.0);		//좌표
		glVertex3f(0.5, 0.5, 0.0);		//좌표	
		glVertex3f(-0.5, 0.5, 0.0);		//좌표
	glEnd();							
	glFlush();
}
void MyReshape(int NewWidth, int NewHeight){ 
	glViewport(0, 0, NewWidth, NewHeight); // 어느 지점에 출력될 것인가.
	GLfloat WidthFactor = (GLfloat)NewWidth / (GLfloat)300;//길이 / 300
	GLfloat HeightFactor = (GLfloat)NewHeight / (GLfloat)300;//높이 / 300
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-1.0 * WidthFactor, 1.0 * WidthFactor,
		-1.0 * HeightFactor, 1.0 * HeightFactor, -1.0, 1.0); //메트릭스 초기화
}
int main(int argc, char* argv[]) {
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB);
	glutInitWindowSize(300, 300);
	glutInitWindowPosition(100, 200);
	glutCreateWindow("OpeGl Example Drawing");
	glutDisplayFunc(mydisplay);
	glutReshapeFunc(MyReshape); // 윈도우 크기가 변할때마다 호출되는 콜백함수
	glutMainLoop();
	return 0;
}

키보드 콜백함수

키보드가 눌러졌을 때 사용되는 콜백함수

#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <stdio.h>

int mode = 0;
void mydisplay() {
	glClear(GL_COLOR_BUFFER_BIT);		//컬러 버퍼에 초기화 할 색 경정
	if(mode%2 == 0 ){
	glBegin(GL_POLYGON);				//다각형 그리기
	glColor3f(255.0, 255.0, 0);			//색상
		glVertex3f(-0.5, -0.5, 0.0);	//좌표
		glVertex3f(0.5, -0.5, 0.0);		//좌표
		glVertex3f(0.5, 0.5, 0.0);		//좌표	
		glVertex3f(-0.5, 0.5, 0.0);		//좌표
		glEnd();
	}
	else if (mode%2 == 1) {
		glutSolidTeapot(0.6);
	
	}
	glEnd();							
	glFlush();
}
void MyKeyboard(unsigned char Keyboard, int x, int y) {
	switch (Keyboard)
	{
	case 'a':
		exit(0); 
	case 'c':
		mode += 1;
		break;
	default:
		break;
	}
	glutPostRedisplay(); // 그린 그림을 다시 불러올떄 사용하는 함수

}
void MyReshape(int NewWidth, int NewHeight){ 
	glViewport(0, 0, NewWidth, NewHeight); // 어느 지점에 출력될 것인가.
	GLfloat WidthFactor = (GLfloat)NewWidth / (GLfloat)300;//길이 / 300
	GLfloat HeightFactor = (GLfloat)NewHeight / (GLfloat)300;//높이 / 300
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-1.0 * WidthFactor, 1.0 * WidthFactor,
		-1.0 * HeightFactor, 1.0 * HeightFactor, -1.0, 1.0); //메트릭스 초기화
}
int main(int argc, char* argv[]) {
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB);
	glutInitWindowSize(300, 300);
	glutInitWindowPosition(100, 200);
	glutCreateWindow("OpeGl Example Drawing");
	glutKeyboardFunc(MyKeyboard);
	glutDisplayFunc(mydisplay);
	glutReshapeFunc(MyReshape); // 윈도우 크기가 변할때마다 호출되는 콜백함수
	
	glutMainLoop();
	return 0;
}

 

 

반응형

'언어공부 > OpenGL' 카테고리의 다른 글

OpenGL 환경설정 간단하게 하는법  (0) 2021.07.26
[OpenGL] OpenGL 설치 및 환경설정  (0) 2021.07.22
반응형

비쥬얼 스튜디오 프로퍼티 설정 

비쥬얼 스튜디오 보기 > 다른 창 > 속성 관리자

속성관리자에 들어가서

새 프로젝트 속성 시트 추가 

opengl 시트 추가 (시트 이름은 아무렇게나 설정해도 상관없다)

opengl의 속성 > VC++ 디렉터리 

opengl 설치때 처럼 포함 디렉터리와 참조 디렉터리에 파일 추가

 

dll 파일 추가

이렇게 하면 프로파티와 dll 파일 추가만으로 opengl을 사용할 수 있는 환경을 편리하게 구축할 수 있다.

 


새로운 프로젝트에서

기존 속성 시트 추가 

기존 속성 시트 추가를 통해 만들어 놓은 프로파티를 불러오고 dll파일까지 넣어주면 된다.

 

참고영상

유튜브 Dr.Bean의 코딩교실 / 컴퓨터그래픽스 2주차 2교시: 실습준비. 비쥬얼 스튜디오 프로퍼티 설정.

https://www.youtube.com/watch?v=GtO5uiFHqf0&list=PL-sgB-_E4raa_6zJz0XYdpFrm2znDxjui&index=6

반응형

'언어공부 > OpenGL' 카테고리의 다른 글

[OpenGL] 콜백함수 (키보드, reshape)  (0) 2021.07.26
[OpenGL] OpenGL 설치 및 환경설정  (0) 2021.07.22
반응형

https://www.transmissionzero.co.uk/software/freeglut-devel/

 

freeglut Windows Development Libraries

Introduction Whilst at the University of Essex, I took a module called “Interactive Computer Graphics” (or EE222 as we referred to it). Half of the course consisted of using POV-Ray to create images, and then putting them together to make a high qualit

www.transmissionzero.co.uk

 

위 사이트에서 freeglut 3.0.0 MSVC Package 다운

 


미리 만들어 둔 폴더에 압축풀기


VS에서 프로젝트-> 속성

 

속성 페이지

속성 페이지 -> VC++ 디렉터리에서

포함 디렉터리를 클릭하고 아까 다운받은 파일 압축을 푼 폴더에 들어갑니다.

포함 디렉터리 파일에는 include 폴더를

라이브러리 디렉터리느느 lib 폴더를 추가 시켜준다.


다운받은 파일의 bin 폴더

bin 폴더의 freeglut.dll 파일을 비쥬얼 스튜디오로 폴더에 넣어줍니다.

freeglut.dll를 복사해서 freeglutd.dll 파일도 만든다.


#include <GL/glut.h>

void mydisplay() {
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POLYGON);
	glVertex3f(-0.5, -0.5, 0.0);
	glVertex3f(0.5, -0.5, 0.0);
	glVertex3f(0.5, 0.5, 0.0);
	glVertex3f(-0.5, 0.5, 0.0);
	glEnd();
	glFlush();
}

int main(int argc, char* argv[]) {
	glutInit(&argc, argv);
	glutCreateWindow("Test");
	glutDisplayFunc(mydisplay);
	glutMainLoop();
	return 0;
}

모두 완료되었으면 위 코드를 복사하여 실행해보고 아래의 사각형이 잘 출력된다면 이상없이 설치가 완료된것

 

 

참고영상

유튜브 Dr.Bean의 코딩교실 / 컴퓨터그래픽스 1주차 3교시: OpenGL 설치(?)와 첫 번째 프로그램 만들기

https://www.youtube.com/watch?v=y_PoJcxg7gE&list=PL-sgB-_E4raa_6zJz0XYdpFrm2znDxjui&index=3

반응형

'언어공부 > OpenGL' 카테고리의 다른 글

[OpenGL] 콜백함수 (키보드, reshape)  (0) 2021.07.26
OpenGL 환경설정 간단하게 하는법  (0) 2021.07.26
반응형

14-1 Call-by-reference & Call-by-value

문제1

변수 num에 저장된 값의 제곱을 계산하는 함수를 정의하고, 이르 호출하는 main 함수를 작성해보자. 단, 여기서는 다음 두 가지 형태로 함수를 정의

 

 - Call-by-value기반의 SquareByValue 함수

 - Call-by-reference기반의 SquareByReference 함수

 

SquareByValue 함수는 인자로 전달된 값의 제곱을 반환해야 하며, SquareByreference함수는 정수가 저장되어 있는 변수의 주소 값을 인자로 받아서 해당 변수에 저장된 값의 제곱을 그 변수에 다시 저장해야 한다.

#include <stdio.h>

int SquareByValue(int num);//Call-by-value기반의 SquareByValue 함수
int SquareByReference(int *Rnum);// Call-by-reference기반의 SquareByReference 함수
int main()
{  
    int Vnum = 2;
    int Rnum = 3;
   
    printf("SquareByValue : %d\n", SquareByValue(Vnum));
    SquareByReference(&Rnum);
    printf("SquareByReference : %d", Rnum);
    return 0;
}

int SquareByValue(int num) {
    num = num * num;

    return num; //매개변수로 받은 값을 곱해서 리턴값으로
}
int SquareByReference(int *Rnum)
{
    *Rnum = (*Rnum) * (*Rnum);
    //매개변수로 주소를 받아 그 위치의 값 변경
}

문제2

세 변수에 저장된 값을 서로 뒤바꾸는 함수를 정의해보자. 예를 들어서 함수의 이름이 Swap3라하면, 다음의 형태로 함수가 호출되어야 한다.

 

 Swap3(&num1, &num2, &num3);

 

그리고 함수 호출의 결과로 num1에 저장된 값은 num2에, num2에 저장된 값은 num3에, 그리고 num3에 저장된 값은 num1에 자장되어야 한다.

#include <stdio.h>

void Swap(int *num1, int* num2, int *num3);
int main()
{  
    int num1 = 10, num2 = 20, num3 = 30;
   
    Swap(&num1, &num2, &num3);
    printf("N1 : %d\nN2 : %d\nN3 : %d", num1, num2, num3);
    return 0;
}

void Swap(int* num1, int* num2, int* num3){
    int temp = *num1;

    *num1 = *num3;
    *num3 = *num2;
    *num2 = temp;
}

 

반응형
반응형

14-1 함수의 인자로 배열 전달하기

함수호출 시 전달되는 인자의 값은 매개변수에 복사되어 들어간다.

int SimpleFunc(int num){....}
int main(void)
{
	int age=17;
    SimpleFunc(age);//age에 저장된 값이 매개변수 num에 복사된다.
}

소스에서 실제로 전달되는 것은 age가 아니라 age에 저장된 값이 복사 되어서 num으로 들어간다. 

int SimpleFunc(int num)
{
   num += 1;
}

복사되어 들어간 값은 SimpleFunc에서 1을 더한다고 해도 변수 age의 값은 증가가 일어나지 않는다.

그럼 이어서 함수호출 시 인자로 배열을 통재로 전달할려면 어떻게 해야 되겠는가?

배열을 통째로 넘겨받으려면 매개변수로 배열을 선언할 수 있어야 한다. 하지만 이것은 허용되지 않는다.

배열을 함수의 인자로 전달하려면

#include <stdio.h>

int SimpleFunc(int* num)
{
    for (int i = 0; i < 3; i++)
        printf("%d ", num[i]);
}
int main()
{
    int arr[3] = { 1,2,3 };
    SimpleFunc(arr);

    return 0;
}

매개변수를 포인터 변수로 선언되어야 한다. SimpleFunc(int *num) {. . . . . }

이를 대신해서 SimpleFunc(int num[]) {. . . . . } 같이 선언 하는것도 가능하다. 

int num[]int *num은 함수의 매개변수에서는 완전히 동일한 선언이다. int num[]이 좀 더 배열을 인자로 전달하는 느낌을 강하게 주기 때문에 int num[] 형태로 더 많이 사용한다.

int num[], int *num은 매개변수에서만 동일한 선언기 때문에 

int *ptr=arr; << int ptr[]=arr;로 대체 할수는 없다.

함수 호출은 매개변수에 주소 값을 전달해야 한다. SimpleFunc(arr);

14-2 Call-by-value vs Call-by-reference

Call-by-value와 Call-by-reference는 함수의 호출 방식을 의미한다.

Call-by-value는 값을 전달하는 형태의 함수 호출이다.

int SimpleFunc(int num){....}
int main(void)
{
	int age=17;
    SimpleFunc(age);//age에 저장된 값이 매개변수 num에 복사된다.
}

위에서 선언한 이런 형식의 함수 호출 방식이 Call-by-value형식이다. 주소 값을 복사해서 함수에 전달하기 때문에 

age변수의 값을 직접적으로 바꾸지는 못한다.

Call-by-reference는 주소 값을 전달하는 형태의 함수 호출이다.

#include <stdio.h>

int SimpleFunc(int* num)
{
    for (int i = 0; i < 3; i++)
         num[i] += 1;
}
int main()
{
    int arr[3] = { 1,2,3 };
    SimpleFunc(arr);
    for (int i = 0; i < 3; i++)
        printf("%d ", arr[i]);
    return 0;
}

 이 소스의 출력결과는 2 3 4 일 것이다. Call-by-reference 호출은 주소 값을 전달받아 주소값에 직접 접근 할 수 있기 때문에 arr 배열에 직접 접근해서 arr 변수의 값을 바꾸는게 가능하다.

14-3 포인터 대상의 const 선언

const 선언은 변수를 변경하지 못하는 상수화하는 목적으로 사용한다. 이러한 const 선언을 포인터 변수에서 사용했을때에 대해 알아보자.

int num= 10;
const int* ptr=&num;
*ptr=20; // 에러
num=20; // 성공

const를 포인터 변수 자료형 앞에 붙이면 포인터 변수가 가리키고 있는 주소의 값을 바꾸는 것을 허용하지 않는다.

int num= 10;
int num2= 20;
int* const ptr=&num;
ptr=&num2; //에러
*ptr=20; // 성공

const가 포인터 변수 자료형 뒤에 있으면 포인터 변수가 가리키는 주소를 바꾸는 것을 허용하지 않는다.

const int* const ptr=&num;

const를 앞 뒤로 다 붙여서 사용할 수도 있다.

 

const가 갖는 의미가 무엇일까?

const가 없으면 컴파일할때 오류가 생기지않고 컴파일 할 것이다. 그렇다면 const 변수를 사용하는 이유는 무엇일까?

int main(void)
{
	const double Pi= 3.141592;
   	 doble rad;
   	 PI = 3.07; // 컴파일 시 오류상황
   	 scanf("%lf", &rad);
   	 printf("circle area %f", rad*rad*PI);
    
   	 return 0;
}

PI를 3.07로 계산한다면 제대로 된 원의 넓이를 계산할 수 없을 것이다. const를 사용하지 않았다면 위와 같은 소스에서 PI를 값이 이상해졌다는 문제점을 파악하지 못할수도 있다. 이 소스는 간단하기 때문에 PI가 다른 수로 변했다는걸 쉽게 확인 할 수 있지만 만약 소스가 100줄만 넘어가도 PI를 다른 값으로 초기화 했다는걸 찾지 못할 것이다. 게다가 최악의 상황은 3.07로 원의 넓이를 계산했다는것 조차 인지하지 못할수도 있다는 것이다. 

그렇기 때문에 고정되는 값에 const를 사용하는 습관을 들여 컴파일에서 잡아주지 못하는 오류를 잡아줄수있다.

 

-윤성우 열혈C프로그래밍을 참고해여 작성한 글입니다.

반응형

+ Recent posts