E D R , A S I H C RSS

후각발달특별세미나

후각 발달 특별 세미나

냄새를 맡고 그 냄새를 없애는 방법에 대하여 세미나 입니다. 신입생 눈에 맞추어 쉽게 하겠지만 재학생이 들어도 도움이 되도록 만들겠습니다.

시간: 5월 2일 6 ~ 8시.
장소: 미정.

Upload:0503_RefactoringSeminar.hwp - 발표 자료.
Upload:0503_RefactoringSeminarSrc.zip - 예제 파일들.

위 문서도 리펙토링 된 것입니다. 그리고 예제 파일들은 완벽히 리펙토링 된 것은 아닙니다. 각 소스에서 한가지 냄새를 느끼고 그 냄새에만 집중해서 리펙토링하는 것만 했기 때문입니다. 이외에도 여러가지 시도해보세요. --재동

이야기

1 Page로 끝내다. --재동

재미 있는 세미나 였어요~^^ 고맙습니다.

재동아 정말 유익하고 재밌는 세미나 였다. 내가 깜박 존 것은 네 세미나 때문에 그런게 아니라 내 버릇이란거 알지? - 상협

정말 재밌었어요. 수업중에 질문을 못한게 있는데요, 주석은 되도록이면 안써주는건가요?? c언어 수업시간에 교수님이 주석은 많이 쓸 수록 좋다고하셨는데... --최경현
주석이 많다는 것은 코드가 자신을 스스로 표현 못하기 때문입니다. 어딘가 주석을 달려고 생각 한다면 한 번쯤 '주석 없으려면 어떻게 해야하는가?'라고 생각해보세요. 단, 숙제 제출에서는 교수님의 눈에 맞춰야합니다. --재동
교수님이 말씀하시는 주석은 소스가 어떻게 돌아가는지 설명하는 주석을 말하는거 아닌가 싶습니다. 리펙토링을 통해서 주석 없이도 이해가는 소스를 작성하도록 노력하고, 뭐 필요한 경우에는 쓸수도 있겠죠. - 상협

세미나 후 제 귀에 들어온 질문 중에 '함수를 많이 만들면 메모리를 더 사용하지 않는가?'라는 질문이 있었습니다. 누가 자세히 설명 좀 부탁드립니다. --재동
전문적인 설명은 아니구, 제 생각에는 함수를 사용하여 메모리 사용하는 비용과 프로그래머가 함수를 더 사용하여 소스의 가독성을 올리고, 유지 보수 및 버그를 없애는 비용과 비교를 해볼때 후자가 훨씬더 큰 비중을 차지하기 때문에 함수를 더 사용하여 메모리를 더 사용하더라도 리펙토링의 중요성이 결코 줄어들지 않는다고 생각합니다. 그리고 짧은 소스에서는 리펙토링 하여 함수가 많아 지는것이 낭비처럼 보일지 몰라도 좀더 프로그램이 커질수록 리팩토링을 해놓음으로 해서 추후에 최적화를 하는데에도 훨씬 유리하기 때문에 결국에 가서는 자원도 더 효율적으로 사용하리라고 봅니다. - 상협

사실 이 질문은 제가 받았던 질문인데, 질문 받았던 당시에 별 생각없이 메모리를 많이 사용한다는 단점이 있더라도 잃는 것(단점)보다 얻는 것(장점)이 더 많기 때문에 상관없다고 얼버무렸습니다. 그렇게 틀린 대답은 아니였지만 많이 부족한 대답이었습니다. 그래서 재동형하고 이야기도 해보고 저도 나름대로 생각해서 답을 내어보았습니다.
메모리를 많이 사용한다는 우려의 원인은 많은 변수들에 있습니다. 전달인자를 받거나 값을 리턴할 때, 각각 상응되는 변수가 필요하기 때문이죠. 하지만 변수는 그 변수가 선언된 함수내에서만 효력을 발휘하고 함수가 종료되는 순간 사라집니다(메모리해제). 그러므로 모듈화된(쉽게 이야기해서 함수로 나뉜)프로그램에서는 함수내의 많은 변수들이 메모리를 많이 차지하더라도 그 함수가 끝나면 그 메모리는 해제되어 사용가능해집니다. 그리고 전역변수나 메인함수내의 변수만을 사용하는 프로그램은 프로그램이 끝날 때까지(메인함수가 종료될 때까지) 메모리를 잡아두므로 한번 할당된 메모리는 사용불가능합니다.
모듈화된 프로그램에서의 메모리 사용의 개념은 필요할 때마다 할당해서 쓰고 필요없으면 해제하자이고 전역변수나 메인함수내의 변수만을 사용하는 프로그램에서의 메모리 사용의 개념은 지금은 안쓰이더라도 나중에 쓸 메모리를 미리 할당하고 사용이 끝났더라도 메모리를 계속 잡아두자입니다. 전자의 경우에는 어느 순간 메모리를 많이 사용하는 경우도 있고 어느 순간에는 엄청 적게 사용하는 경우가 있습니다. 메모리 사용이 더 유동적이라고 할 수 있습니다. 밑에 참고 그래프(자체제작)를 참고해주시기 바랍니다. --강희경
rkd49_answer_1.JPG
- 아래 상규의 말대로 큰 차이는 없을 것 같습니다. 모듈에서의 변수 선언, 사용에 있어서 메모리 사용량은 기껏해야 몇 바이트 정도가 아닐까요? 아래 코드처럼 극단적인 예가 아닌 이상 큰 변화가 없는 경우가 대부분이라고 생각합니다(물론, 동적할당은 여기서 논외입니다). 그런데, 아래의 코드는 몇가지 냄새가 나는 코드로군요. 큭. :(

~cpp 
// foo(), bar() 가 호출될 때마다 memory사용량이 4K 씩 늘어난다.
#include <iostream>
using namespace std;

#define ARRSIZE 1024
#define FUNMAX	10;

void foo();
void bar();

int funcCount = 0;

int main()
{
	foo();
	return 0;
}

void foo()
{
	int f[ARRSIZE];
	cout << "addr of f in " << funcCount << "th call : " << f << endl;
	cin.get();
	if( funcCount++<FUNMAX )
		bar();
}

void bar()
{
	int b[ARRSIZE];
	cout << "addr of b in " << funcCount << "th call : " << b << endl;
	cin.get();
	if( funcCount++<FUNMAX )
		foo();
}
   
혹시 다른 생각을 갖고 계신분은 제게 가르침을... 저도 조금 더 생각해봐야겠습니다. - 임인택

함수가 많아지면 메모리를 많이 쓰게 될까??
(참고로 제가 말하고자 하는 것은 코드에 의한 메모리 사용량 입니다.)

함수의 갯수와 메모리 사용량은 직접적으로 관련이 없습니다. 메모리 사용량과 직접적으로 관련이 있는 것은 함수의 갯수가 아니라 프로그램의 길이 입니다.

함수가 많다고 프로그램의 길이가 긴 것은 아닙니다. 길이가 짧은 함수를 여러개 가진 프로그램과 길이가 엄청나게 긴 함수를 한개만 가진 프로그램이 있다고 해봅시다. 길이가 더 긴 프로그램은 어떤 것입니까?

리펙토링에 대해서 생각해 봅시다. 가장 먼저 배운 방법이 무엇이었습니까? 중복제거 입니다. 함수를 늘려 중복을 제거하면 프로그램의 길이는 길어질까요? 짧아질까요?

물론 함수가 추가되면 전달인자 처리를 위한 약간의 코드가 추가되는 것은 사실입니다. 하지만 그것은 몇바이트에 지나지 않습니다.

--상규
음악이 있어서 참 좋았어요~ 중간중간의 농담도 좋았구요. 지나 치게 진지한 세미나 보다는 훨씬 났다는 생각이 드네요 ^^ 다만 조금 아쉬운건. 쉬는 시간에 음료수라도 뽑아 드려야지 라고 생각하고 있었는데...프로젝트 땜에 바쁘셔서 그런지 빠르게 진행 하시더라고요~ ㅋㄷㅋㄷ 마지막으로~ 간결한 1장짜리 자료집이 너무 좋았어요~ - 톱아보다
프로젝트 때문에 빠르게 진행한게 아니라 선전부 모임때문에... 여튼 간결하게 하는 건 중요하다. 시간 되면 ~cpp The One Page Proposal을 읽어보도록 해. --재동

이제서야 글을 남겨서 죄송스럽지만; ㅎㅎ 유익한 시간이였습니다. +_+ 리팩토링은 좀더 공부해야겠지만...;;
좋은정보 감사합니다아~ ㅎㅎ--정수민

통상 리팩토링에 대한 반론은 다음과 같은 양상을 띕니다. 리팩토링을 많이 한다 --> 함수 개수가 많아진다 --> 콜 체인이 길어진다 --> 속도가 느려진다. 메모리 문제보다는 속도 문제에서 리팩토링에 대한 우려가 불거져 나오는 것이죠.

그런데, 함수 호출에 의한 오버헤드는 컴파일러/VM 기술이 발전하면서 점점 줄어들고 있고, 문제가 복잡할수록 그런 낮은 단계의 옵티마이제이션보다 높은 단계에서의 최적화가 훨씬 더 효과적인데, 리팩토링이 잘 되어 함수가 잘게 쪼개어져 있으면 높은 단계의 최적화를 하기가 쉬워집니다. (그래도 여전히 로우레벨의 옵티마이제이션이 필요하다면 매크로나 코드 제너레이션을 쓸 수 있습니다. DavidParnas논문 참고)

낮은 단계 최적화는 10% 속도 높히는 경우가 많지만 높은 단계 최적화는 100%나 1000%도 종종 있습니다.

리팩토링을 잘 한다면, 속도문제는 나중에 신경 쓰는 것이 결과적으로 나은 경우가 많습니다.

--JuNe

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:31:35
Processing time 0.0234 sec