'C언어'에 해당되는 글 2건

  1. 2015.07.06 개발자들의 영원한 숙제, 'NULL' 이야기 (1)
  2. 2013.04.10 From 0 to C, 디자이너에게 코딩이란? (3)

웹뿐만 아니라 애플리케이션, 데이터베이스 등 대부분의 개발에서 중요하게 맞닥뜨리게 되는 것이 바로 'NULL'이라는 개념입니다. 'NULL'이란 아무것도 없음을 의미하는 단어이며, 0이나 " "와 같은 공백과는 다른 개념입니다. 

프로그래밍을 접하지 않으신 분들이라면 쉽게 와 닿지 않을 텐데요. 그런 분들을 위해 개발에 있어서 'NULL'이 어떤 의미를 가지는지 알아보려고 합니다. 





NULL이란?


NULL이 '영원한 숙제'인 것은 아마도 많은 개발자들이 NULL을 마주하는 경우가 주로 프로그래밍 중에 에러 메시지로 고생할 때이기 때문이라고 생각합니다. 이 개념을 만들어낸 당사자도 '몇십 억짜리 실수'라고 이야기할 정도로, 프로그래밍을 하면서 많은 예외 상황을 만들어 냅니다.


프로그래밍 언어인 C언어에서는 생성된 메모리의 주소를 '포인터'라는 것이 가리키게 되어 포인터를 통해 데이터를 가져올 수 있게 됩니다. 이때 포인터가 아무것도 가리키고 있지 않다는 것을 나타내기 위해 NULL이라는 개념을 사용하게 되는 것입니다. 따라서 메모리에 0이나 " "와 같은 공백이 존재하여 포인터를 통해 값을 가져와 연산 등에 활용될 수 있는 반면에, NULL은 포인터가 가져올 값이 없는 상태를 말하므로 그 활용에 제약이 큽니다.  





데이터베이스의 경우에서도 마찬가지로 값이 존재하지 않음을 나타내는 데 사용되며 그 값을 'NULL값'이라고 합니다. Oracle, Mysql과 같이 데이터베이스를 처리하는 벤더마다 NULL값을 처리하는 방식이 구체적으로 다르지만, 기본적으로 '아직 입력되지 않은 값' 또는 '알 수 없는 값'을 의미합니다. 결국 '존재하지 않는 값'이므로 SQL(구조적 질의 언어)을 이용한 다양한 연산에서도 제약을 받게 됩니다. 

대중적으로 쓰이고 있는 Oracle 데이터베이스의 경우로 제약에 관한 예를 들어보겠습니다. 사칙 연산( +, -, *, / )의 경우입니다. 흔히 'NULL값에 3을 더하면 아무것도 없는 것에서 3을 더하니까 3이겠지'라고 생각하실 수 있지만, 결과는 NULL입니다. 이것은 숫자의 형태가 아닌 어떤 것과 연산을 시도하려는 논리적 오류에서 발생하는 것입니다. 





이해를 돕기 위해 간단하게 예를 들어보자면 통장의 잔액이 0원인 상태가 0의 개념이라면, 통장 자체를 개설하지 않아 계좌번호가 없는 (또는 계좌번호를 모르는) 것이 NULL값의 개념인 것입니다. 계좌번호가 없는 상태에서 돈을 입금하는 것은 말이 안 되겠죠?

사칙연산과 관련하여 좀 더 깊게 들어가면, Sum(선택한 모든 값을 더해주는 함수)과 같은 집계 함수에서는 경우가 다릅니다. NULL값이 포함되어 있어도 이를 제외하고 계산이 가능한데, 이는 데이터베이스 관리 시스템을 만든 곳에서 사용자를 배려한 처사가 아닐까 합니다. 

데이터베이스를 사용하는 사용자는 입력된 데이터를 가지고 효과적으로 원하는 정보를 출력해내는 것을 원할 것입니다. 수많은 레코드 중에서 극히 일부 레코드 값이 NULL값이라고 해서 집계 처리 결과를 무조건 NULL로 리턴한다면, 이로 인해 다양한 경우에서 제약을 받을 것입니다.



영원한 숙제


위에서 말한 이러한 규칙들이 다른 데이터베이스에서도 동일하게 적용되는 것은 아닙니다. 다양한 상황에 따라서 NULL규칙이 일관적이지 않은 부분도 개발자를 힘들게 하지만, 각각의 데이터베이스 종류별로 NULL에 대해 상이한 규칙을 갖는 것도 개발자를 힘들게 합니다. 

C언어에서는 NULL로 인해 'Null Pointer Dereference'가 발생합니다. 





일반적으로 Null Pointer Dereference가 발생하면 실행 중인 프로그램이 종료됩니다. 또한 보안적으로 취약해질 수 있습니다. 공격자가 의도적으로 이러한 Null Pointer Dereference를 실행하는 경우, 그 결과 발생하는 예외 사항을 추후 공격을 계획하는 데 악용할 수 있기 때문입니다.

이를 막기 위해서는 특별한 방법은 없습니다. 코드를 작성할 때 미리 이러한 경우를 계산하여 작성하거나, Null 포인터 체크를 통하여 프로그램이 실행 중에 중단되는 경우가 없도록 하는 것입니다. 하지만 실제 업무에서는 몇백 또는 몇천 줄 그 이상의 코드를 일일이 체크하기란 쉬운 일이 아닙니다. 이렇게 개발자의 야근은 늘어나는 것일까요? 



현명한 개발자의 해결책


야근을 피하고 효율적으로 개발하는 현명한 개발자가 되기 위하여 어떤 방법을 사용해야 할까요? 


1. 정적분석도구의 사용  

우선 정적 분석 도구(Static Code Analysis Tool)를 사용하는 것입니다. 정적 분석은 컴퓨터 소프트웨어를 분석하는 방법 가운데 하나로, 그 소프트웨어로부터 만들어진 프로그램을 실제로 실행해보지 않고 분석하는 방법입니다. 분석된 정보를 이용하는 것뿐만 아니라 있음 직한 코딩 에러를 표시해주는 것, 프로그램이 어떤 속성을 만족하는지 수학적으로 증명하는 것까지 다양합니다.    



 사진출처: Wisedog's Lifelog



2. 안드로이드 대안 언어 '코틀린'

코틀린이라는 안드로이드 개발 언어는 제트브레인이 2011년 만든 언어입니다. 문법적으로 C언어와 비슷한 자바와 호환이 되는 장점이 있으며, 이와 더불어 자바보다 문법 자체가 간결하여 유지보수를 조금 더 편하게 할 수 있고 다양하게 표현을 확장할 수 있습니다. 





C와 마찬가지로 자바에서도 NULL과 관련한 예외 상황이 NullPointerException이라는 이름으로 발생합니다. 하지만 코틀리는 NULL값을 코드에서 없애는 것을 지향하여, 결과적으로 프로그램이 실행 중에 예외 상황을 만나 중단되는 위험을 줄여주며 안정성을 높여줍니다.


다양한 프로그램 분석 방법과 NULL을 지양하는 대체 언어를 선택하는 것들은 모두 좋은 대안이 될 수 있지만, 최선의 방법은 개발자들이 NULL에 대해 완벽하게 이해하고 사용하는 것이라는 사실에는 변함이 없습니다. 

개인적으로는 반드시 NULL을 쓸 필요가 없고 NULL을 허용할 필요가 없다고 생각합니다. 무식하지만 우직하게 개발을 해 나가는 방법이 있습니다. 데이터베이스에는 데이터를 입력할 때 'NOT NULL'이라는 조건을 두어 무조건 NULL값을 허용하지 않을 수 있으며, 따라서 NULL을 허용했을 때 생기는 문제점을 미리 방지할 수 있습니다. C나 Java같은 언어를 사용함에도, 0과 공백을 활용하여 값이 없음을 개발자 스스로 인식하지만, 포인터가 데이터가 있음을 인지하게 하는 방법도 있습니다.   

이러한 방법들은 개발의 배경이 되는 상황, 개발 관련 요구사항, 개발자의 의도에 따라서 개발자 스스로가 선택해서 사용해야 합니다. 그리고 개발자가 NULL에 휩쓸려 급급하게 에러를 수정하며 따라가는 것이 아니라, 주도적으로 NULL을 이용해 나간다면 좀 더 효율적인 프로그래밍을 할 수 있을 것입니다. 

지피지기면 백전백승!


by 수달 발자국

출처: 위키백과, 아이티데일리디비가이드넷, 블로터, Javarevisited


Posted by slowalk

From 0 to C

 

 

멀티미디어를 다루는 디자이너들이 늘어가고 있습니다.
 증강현실과 인터렉티브 디자인과 같은 첨단 환경을 통해 코더와 디자이너가 서로의 벽을 넘나드는 요즘, 흘러 넘치는 생각을 실현시키기 위해선 코딩을 이해하는 것이 중요합니다. 하지만, 태생부터 숫자와 친하지 않은 디자이너들... C언어 책을 앞에 두고 끙끙대다 결국,"난 창의적인 사람이라 이런 구조적인 일은 나랑 안맞아"라는 변명을 늘어놓는 사람들이 한둘이 아닙니다. 이런 이들에게 탁구공, 나무상자, M&M 초콜릿같이 주변에 있는 사물들로 코딩을 가르치는 사람들이 나타났습니다!

 

 

바로 네덜란드 
암스테르담에 위치한 Hello, Savants!의 Ubi de Feo입니다. 그는20년 넘게 코더로 일해온 자신의 경력을 살려 초보자들이 프로그래밍 언어라는 추상적인 개념을 컴퓨터와 책을 통해 이해하는 것이 아닌, 보고 만지며 이해할 수 있는 워크숍, From 0 to C을 통해 쉽게 이해할 수 있도록 만들었습니다.

 

 

from 0 to C from HELLO, SAVANTS! on Vimeo.

 

 

그의 워크숍은 조금 특이합니다.

먼저, 컴퓨터를 저~ 멀리 치우고, 모니터도, 전선도 모두 모두 저~ 멀리 치웁니다.
그리고 나무상자와, 탁구공, M&M 초콜릿같은 주변에서 흔히 볼 수 있는 물건들을 가져옵니다. 물컵도 좋고 연필도 좋습니다.

 

 



몸을 움직이는 수업을 진행하기 전 그는 학생들과 이야기를 나누며 숫자와 2진법에 대한 숫자의 세계에 대해 알려줍니다. 그리곤 컴퓨터가 수행하는 프로세스를 여러개의 스테이지로 구분해봅니다. 구분된 스테이지가 복잡해질 즈음, 학생들은 컴퓨터 부품을 대체한 역할을 맡게됩니다. 학생과 선생님은 각 스테이지를 돌아다니며 탁구공이나 M&M 초콜릿을 가지고 컴퓨터의 작동원리를 직접 손으로 놓아보기도 합니다. 이때 학생들은 간단한 프로그래밍 언어를 배웁니다. 액션스크립트나 자바스크립트도 같은 방법으로 적용되며 앞으로 사용될 프로그래밍 언어의 토대를 이해할 수 있습니다. 

 

 

그렇다면 어떻게 컴퓨터의 작동 원리를 
사물을 이용해 이해할 수 있을까요? 
예를들어, 탁구공은 2진법을 설명할때 사용됩니다. 4개의 구멍이 뚫린 상자를 제작하여 이 상자 2개로 1byte를 나타내는 방법입니다.(상자의 각 구멍은 1bit로 8bit=1byte입니다.)
이때 이 상자 가장자리에는 bit와 byte를 나타내는 표시자와 숫자를 표시, 이진법을 쉽게 알려줍니다.
이렇게 상자와 탁구공을 통해 '세는 방법'을 천천히 소화하는 과정에서 학생들은 수량을 가장 최적화된 방법으로 표현하는데 집중합니다.

 

 




프로그래밍 언어를 배울때 다양한 타입의 메모리'크기'에 대해 배울일이 많다고 합니다. 이때 byte를 '그리는' 방법을 배워 얼마나 많은 양의 데이터를 저장할 수 있는지 탁구공와 상자를 통해 'see' 볼 수 있다면, 여러분이 '크기'에 대한 개념을 이해하는게 더 쉬워질거라고 하네요.

 

 

 

이탈리아 Treviso의 Digital Accademia에서 열린 "From 0 to c" 워크숍

 

 

다른 예로 
M&M 초콜릿은 데이터의 양을 나타내기 위해 사용합니다. 그리고 컴퓨터상에서 사용하는 데이터의 공간과 데이터의 이동을 나타내기 위해 학생들끼리 서로 교환해보기도 합니다.

 

 



 

 

이렇게 시각적인 방법으로 컴퓨터에 대해 이해한 학생들에게 컴퓨터 언어를 가르치면 그때부터는 C언어나 액션스크립트, 자바스크립트 등 다양한 프로그래밍 언어를 문제 없이 받아들일 수 있다고 합니다.





그는 프로그래밍 천재를 만들고 싶기보단, 학생들이 문제를 해결해 나갈 자신이 다루는 언어가 무엇인지 알고 좋은 자세로 문제를 해결해나가는 방식을 가르치고싶다고 합니다.


그리고 무엇보다 여러해동안 학생들을 가르쳐오며 학생들과 얼만큼 높은 수준의 소통을 하느냐에 따라 학생이 배우고, 내용을 흡수하는 정도가 다르단것을 깨달았다고 하네요. 그래서 마치 고대 철학자들이 제자들에게 지식을 전해주는 방법처럼,  역시 수업시간에 학생들과 함께 몸을 움직이고 문답을 하며 프로그램을 진행한 것이  프로젝트의 성공의 열쇠였다고 합니다


좋은것들은(Good things) 자신이 하는 일을 좋아하는 미래의 프로그래머나 해커에게서 나올것이라 믿기때문에 이 프로그램을 어린 아이들이 이해할 수 있을 정도로 쉽게 만드는 것이 그의 목표라고 합니다.

프로그래밍이라는 어려운 개념을 구체적이고 시각적인 게임과 같은 과정으로 만든 그의 [프로세스 디자인]처럼 그동안 어렵게만 여겨 배우기를 포기했던 과학, 기술의 과정을 다른 방법으로 생각해보면 어떨까 하는 생각이 드는데요, 또 다른 재미난 방법으로 세상을 재밌게 만들어줄 그들의 프로젝트가 기대됩니다. 




| 출처 |  Hello, Savants! , From 0 to C , Wired_uk

by 사슴발자국





Posted by slowalk