반응형 IT227 자바 제네릭스(JAVA Generics) 테크니컬 컬럼-자바 자바 제네릭스 JDK 5.0은 오랫동안 변하지 않았던 자바 언어의 구문에 적지 않은 변화를 가져왔다. 애너테이션, for each 문, varargs 등도 구문 변화에 기여했지만, 가장 눈에 띄는 변화는 역시 제네릭스라고 해야겠다. 제네릭스는 C++의 템플릿을 기억하는 프로그래머에게는 친숙할 수 있는 구문을 사용하지만, 조금 더 들여다보면 C++의 템플릿과는 다른 존재라는 것을 알게 된다. 자바의 제네릭스는 여타 언어의 것과는 상당히 다른 방식으로 구현되어 있다. 따라서, C++와 같은 언어에서의 사용 경험을 가지고 쉽게 접근하려 했다가 낭패를 볼 수 있다. 제네릭스가 내건 슬로건은 더 안전한 자료형의 세상이다. 컴파일러가 좀더 세밀하게 자료형 검사를 해서 엄밀하게 정의된 자료형을 사.. 2009. 4. 6. public static void main(String args[]) public : 클래스의 안이든 바깥이든 어디에서나 이 main메소드가 호출될 수 있음을 뜻한다. 접근 제한자에 대한 자 세한 것은 문법 메뉴를 참고하시면 많은 정보를 얻을 수 있다. static : mian()메소드가 메모리에 인스턴스되는 공간의 주소가 모두 똑같음을 나타냅니다. 프로그래밍을 처음 시작 하시는 분들이라면 이 static이라는 키워드의 기능에 대해 이해하기가 좀 어려울 것입니다. 지금부터 제가 설명하는 것을 자세히 읽어 보시면 왠만큼 이해는 될 것입니다. static키워드는 매번 자바 언어에서 객체들 이 생성되고 이용되는 과정에서 메모리의 기억 장소를 이용합니다. 매번 객체들이 생기고 저장되고 참조하는 과정들이 무진장 일어나죠. 그래서 메모리를 많이 잡아 먹게 됩니다. 이런 메모리 점유를.. 2009. 4. 1. 엔지니어형 프로그래머와 문학적 프로그래머, 그리고 게으른 프로그래머 엔지니어형 프로그래머 - 언제나 성능을 최우선으로 생각한다. - 짧게 쓰는 것을 좋아한다. - 필요한 부분에 주석을 단다. - 언어: 닥치고 C 아님 C++. 어셈블리라도 좋소. - 항상 CPU의 입장에서 생각한다. - 버그를 발견 했을 때: 근성을 가지고 박멸한다. - 최적화된 코드 한줄을 위해 하루 종일 고민한 적이 있다. - 자신이 만든 소스코드를 보고 감동한 적도 있다. - 최종적으로 컴파일된 결과물을 중요하게 생각한다. - 인쇄해 놓은 소스코드를 보면 버그를 찾는다. - 퇴근을 하지 않는다. 문학적 프로그래머 - 언제나 레이아웃에 신경쓴다. - 암호같은 문장을 싫어한다. 적당히 길게 풀어쓰기를 좋아한다. - 코드가 곧 주석이요. (라고 우긴다.) - 언어: 스펙이 허락하는 한 Smalltalk .. 2009. 3. 31. 당신의 프로그램에 버그를 번식시키는 요인들 당신의 프로그램에 버그를 번식시키는 요인들 ──────────────────────────────────── 1. 기술적 메커니즘에 대한 이해 부족 일례로, 저는 Thread에서 COM Object를 사용하려면 먼저 CoInitilize()를 호출해야 된다는 사실을 몰라서 하루동안 삽질한 경험이 있습니다(...) 어떤 라이브러리나 API를 이용할 때, 내부적인 동작원리나 설계 사상에 대한 이해없이 단지 사용법만 알고 있을 경우에, 이같은 간단한 문제에도 그 원인을 짚어내지 못하는 경우가 있습니다. 그리고 주의깊지 못한 사용 방법으로 인해 버그가 생겨날 수 있는 거죠. 프로그래밍에 있어서 OS에 대한 이해가 중요한 것도 이같은 맥락에서 입니다. 여튼 프로그래머는 공부해야 될게 많습니다... 2. 완벽하지 .. 2009. 3. 31. C 포인터, 확실히 알자(5) - Call by Reference 아시다시피 C언어는 main() 그 자체도 함수(Function)인 것처럼, 뼈속까지 함수를 기본 단위로 해서 프로그램을 구성하고 있습니다. (객체지향 언어에서는 객체(Object)가 하나의 구성 단위이듯이 말이죠.) C에서 함수는 하나의 기능을 수행하는 단위로 볼 수 있는데, 함수가 뭔가의 일을 해내기 위해서는 대게의 경우 그 작업에 필요한 뭔가의 데이터를 같이 전달해 줘야 합니다. 그것이 바로 인수(Argument)라고 불리는 것들이죠. 그런데 이렇게 함수에게 인수를 전달하는 방법에는 여러가지가 있습니다. 그치만 가장 많이 쓰이는 방법은 '값에 의한 호출(Call by Value)'과 '참조에 의한 호출(Call by Reference)' 정도입니다. 1. 값에 의한 호출(Call by Value) .. 2009. 3. 31. C 포인터, 확실히 알자(4) - 함수와 포인터 1. 포인터, 다시 들여다 보기 지난 강좌에서, 저는 포인터를 메모리상의 주소(Address)를 다루는 변수라고 정의했습니다. 이말은 즉, 메모리에 올라갈 수 있는 것이라면 그 어떤 것이든 포인터를 이용해서 접근할 수 있다는 얘기가 됩니다. (이론상으로...) 우리는 주로 메모리에는 데이터가 있다고 생각합니다. 자료를 담는 변수, 배열, 구조체 등의 자료구조들 역시 메모리라는 공간 안에서 관리되는 것이죠. 그래서 지금까지는 변수와 배열을 다루는 포인터에 대해서 이야기해왔습니다. 그런데, 우리가 작성한 프로그램 코드는 대체 어디에 존재하는 걸까요? 네, 당연히 메모리입니다. 그 어떤 프로그램 코드도 일단 메모리에 올라간 상태라야 비로소 CPU가 실행할 수 있는 것이죠. 그렇다고 하면, 포인터로 프로그램의 .. 2009. 3. 31. C 포인터, 확실히 알자(3) - 문자열과 포인터 서론 C 언어에서는 기본적인 자료형인 배열(Array)과 문자열(Stirng)을 다루는 것 조차도 포인터를 이해하지 않으면 안될만큼, 언어차원에서 포인터의 개념이 뿌리깊게 자리잡고 있습니다. 때문에 포인터를 이해하는 것은 곧 C 언어 그 자체를 이해하는 것과도 통하는 것이 있습니다. 이때문에 C가 어렵게 느껴지는 것이기도 하겠지요. 제 나름대로 C를 쉽게 정의 내려본다면, "왠만한건 다 포인터로 처리한다" 라고 말하겠습니다. 정말 C에서는 포인터로 못하게는게 거의 없습니다. 물론 그만큼 강력하지만 잘못다루면 심각한 에러를 만들어 낼 수 있고, 또 C를 이해하기 어렵게 만드는 요인이기도 합니다. 그 때문에 JAVA나 C# 같은 언어에서는 C++을 확장한 언어임에도 불구하고 포인터라는 것을 과감하게 없애버렸.. 2009. 3. 31. C 포인터, 확실히 알자(2) - 배열과 포인터 시작 포인터를 얘기할 때, 꼭 배열이란 것을 다시 언급하게 됩니다. 사실 C에서 포인터(Pointer)와 배열(Array)은 꽤 닮은 점이 있습니다. 결론부터 말하면, 배열이 내부적으로 포인터로 구현되어 있기 때문입니다. 1. 배열(Array) 배열이란 동일한 타입을 가지는 일련의 변수군을 정의한 겁니다. 가령 int A[5]; 이라고 선언하면 정수(int)형 변수 5개를 만들고 그것을 A 라는 하나의 이름으로 통합해서 관리하게 됩니다. 그러면 메모리상에서 배열은 어떤 모습일까요? 일단 배열의 각 원소가 할당받는 어드레스를 살펴봅니다. ──────────────────────────────────────── #include void main() { int A[5]; printf("%d %d %d %d %.. 2009. 3. 31. C 포인터, 확실히 알자(1) - 변수와 포인터 서론 C Language를 공부하면서 가장 이해하기 어려운 것이 무어냐고 물어본다면, 아마도 거의 대부분 "바로 포인터(Pointer)라는 녀석이다!" 라고 말할 것입니다. C에서 다른 건 다 이해가 되어도 "포인터 만큼은 죽어도 모르겠다" 라고 말하는 경우를 제 주변에서도 심심치 않게 봐왔습니다. 사실 C는 어려울 수밖에 없습니다. C를 그저 프로그래밍의 기초 과정에서 배우는 옛날 언어라고 생각하고 가볍게 볼만큼 만만한 녀석이 전혀 아닙니다. C는 어셈블리(Assembly)의 사촌입니다. 다시 말하면, C는 하드웨어 - 특히 마이크로프로세서(CPU)와 친한 녀석입니다. 때문에 하드웨어에 대한 기반 지식없이는 C를 제대로 이해할 수가 없습니다. 포인터라는 녀석이 특히 그렇습니다. C를 강력하게 만드는 무.. 2009. 3. 31. 이전 1 ··· 21 22 23 24 25 26 다음 반응형