클래스 선언 형식

[접근지정자][기타제어자] class 클래스명 [extends Super클래스][implements 인터페이스…]
{
    클래스 내용
}

  • 클래스는 객체를 표현한다.

  • [ ]: 생략 가능

  • 접근지정자(접근제한자): public, protected, default(기본), private     

  • { }: 클래스/메소드/생성자의 내용이 들어가는 블록이다. 빈 내용이더라도 블록은 꼭 써야 한다.
  • 기타제어자: static, final, abstract, native, transient, synchronized, volatile, strictfp 등

주의사항

  • 클래스명은 반드시 대문자로 시작
  • 자바언어는 대소문자 구별
  • 하드코딩(개발도구를 사용하지 않는 코딩) 시, 저장 확장자명을 .java로 할 것


생성자 선언 형식

[접근지정자]class 클래스명(파라미터) 

    생성자 내용
}

  • 선언한 Class가 실제로 생성될 때 실행되는 작업을 기술하는 공간이다.

  • [ ]: 생략 가능

  • 접근지정자(접근제한자): public, protected, default(기본), private     

  • { }: 클래스/메소드/생성자의 내용이 들어가는 블록이다. 빈 내용이더라도 블록은 꼭 써야 한다.
  • 파라미터: 생성자를 통해 클래스를 생성할 때 사용되는 인자값을 받아오는 변수 선언 부

주의사항

  • 생성자는 클래스명과 동일해야 한다.
  • { } 블록 안의 내용이 빈 공간인 것은 기본생성자이다. 그리고 기본 생성자는 생략 할 수 있다. 자바 컴파일러가 자동으로 생성한다.

함수 선언 형식

[접근제한자] [기타제어자] 리턴자료형 함수명([파라미터]) 

    [return 리턴값;]
}

  • 반복되어지는 코딩을 함수로 만들면 코드의 중복이 줄어든다.

  • 함수를 사용하면 구조적 프로그래밍이 가능하다.

  • 함수를 만들기 전에 생각해야할 3가지: 기능, 매개변수(파라미터), 리턴값(리턴자료형)

함수를 호출하는 방법

  • Call by Name: 파라미터 없이 함수명으로만 호출, 예) swap();
  • Call by Value: 파라미터에 값을 주고 호출, 예) swap(30);
  • Call by Reference: 파라미터에 참조 변수 값을 주고 호출, 예) swap(참조변수);
  • Call by Point: 포인트 주소값으로 호출(C언어에서 사용)

메인 함수 선언 형식

public static void main(String[] args)
{
// 실행 내용
}
  • 클래스를 만들고 실제로 실행하기 위해서는 메인(main) 함수가 필요하다.

  • 운영체제로부터 메모리를 할당 받아 프로그램을 실행하는 시작 지점이다.

  • 꼭 암기하자!!


자바는 객체지향 프로그래밍 언어이다. 본격적인 자바 소개에 앞서 프로그래밍 언어에 대해 알아보자.



프로그래밍 언어란?

  • 컴퓨터가 이해할 수 있는 언어는 0과 1로 이루어진 이진 코드(binary code)의 기계어(machine language)이다.

  • 그래서 사람과 컴퓨터가 대화하기 위해서는 사람의 언어와 기계어의 다리 역할을 하는 프로그래밍 언어(programming language)가 필요하다.

  • 프로그래밍 언어는 고급 언어와 저급 언어로 분류 할 수 있다.

고급언어

  • 고급 언어는 컴퓨터와 대화할 수 있는 언어 중에서 사람이 쉽게 이해할 수 있는 언어를 말한다.
  • 즉, 사용자 입장에서의 언어로써 우리가 일반적으로 프로그래밍 언어라고 부르는 C, C++, Java 등이 대표적인 예이다.
  • 고급 언어로 작성된 소스(source)는 컴퓨터가 바로 이해할 수 없기 때문에(기계어가 아니므로), 컴파일(compile) 과정을 통해서 컴퓨터가 이해할 수 있는 기계어로 변환해줘야 컴퓨터가 사용할 수 있다.

  • 컴파일 해주는 것을 컴파일러(compiler)라고 하며, 자바에서는 javac.exe가 담당한다.

  • 우리가 흔히 말하는 프로그램(program)이란 컴퓨터에서 특정 목적을 수행하기 위해 프로그래밍 언어로 작성된 소스를 기계어로 번역한 것을 말한다.

저급언어

  • 저급 언어는 기계어에 가까운 언어로, 어셈블리어가 대표적인 저급 언어이다.
  • 사람이 이해하기 어려워서 배우기 매우 까다롭다.

자바의 역사

  • 자바는 1991년에 썬 마이크로시스템즈(Sun Microsystems)사에서 제임스 고슬링(James Gosling)이 다른 연구원들과 함께 고안한 오크(Oak)라는 언어에서 시작되었다.

  • 오크는 처음에 가전제품에서 사용될 목적이었으나, 인터넷의 등장과 함께 인터넷에서 실행되는 프로그래밍 언어로 사용되었고, 이름을 자바로 변경하였다.

  • 1995년에 자바 1.0을 발표하였고, "Write Once, Run Anywhere"(한번 쓰고 어느 곳에서도 실행)를 약속하였다.

  • 1995년~1999년까지는 윈도우 프로그램 개발이 주류여서 C++언어에 비해 자바는 열세였다. 또, 메모리 및 CPU를 지나치게 많이 사용한다는 문제점이 있었다.

  • 하지만, 1999년도부터 인터넷이 활성화되면서 웹 애플리케이션 구축을 위해 자바 활성화되었다. 단 한번 작성으로 모든 곳에서 실행 가능한 언어는 자바뿐이었기 때문이다.


자바의 특징

자바는 이식성이 높은 언어이다.

  • 이식성이란 서로 다른 실행 환경을 가진 시스템 간에 프로그램을 옮겨 실행할 수 있는 것을 말한다.

  • 예를 들면 윈도우 운영체제에서 실행하는 프로그램을 리눅스 또는 유닉스에서 실행할 수 있으면 이식성이 높은 것이다.

  • 자바는 자바 실행 환경(JRE:Java Runtime Environment)이 설치되어 있는 모든 운영체제에서 실행 가능하다.

자바는 객체 지향 언어이다.

  • 프로그램을 개발하는 기법으로 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립 및 연결해서 전체 프로그램을 완성하는 것을 객체 지향 프로그래밍(OOP, Object Oriented Programming)이라고 한다.

  • 객체 지향 프로그래밍에 사용되는 언어를 객체 지향 언어라고 한다.
  • 자바는 객체를 만들기 위해 설계도인 클래스를 작성하고, 객체와 객체를 연결하여 목적에 맞는 프로그램을 만들어 낸다.
  • 자바는 객체 지향 언어의 특징인 캡슐화, 상속성, 다형성을 완벽하게 지원한다.

자바는 함수적 코딩 스타일을 지원한다.

  • 객체 지향 프로그래밍 이전에 Lisp 또는 Scheme와 같은 함수적 프로그래밍 언어들이 있었지만 큰 호응을 얻지 못했다.
  • 최근에 대용량 데이터 병렬 처리와 이벤트 지향 프로그래밍을 위해 함수적 프로그래밍이 다시 부각되고 있다.
  • 자바는 자바 8부터 람다식(Lambda Expressions)을 지원하여 함수적 프로그래밍을 지원한다.

  • 람다식을 사용하면 컬렉션의 요소를 필터링, 매핑, 집계 처리하는데 쉬워지고, 코드가 매우 간결해진다.

자바는 메모리를 자동으로 관리한다.

  • C++은 메모리에 생성된 객체를 제거하기 위해 개발자가 직접 코드를 작성해야 한다. 만약 이 작업을 성실하게 해주지 않으면, 프로그램은 불완전해지고 갑자기 다운되는 현상을 겪게 된다.

  • 자바는 개발자가 직접 메모리에 접근할 수 없도록 설계되었으며,. 메모리는 자바가 직접 관리한다.
  • 객체 생성 시 자동으로 메모리 영역을 찾아서 할당하고, 사용이 완료되면 쓰레기 수집기(Garbage Collector)를 실행시켜 자동으로 사용하지 않는 객체를 제거한다.

  • 자바 개발자는 메모리 관리의 수고를 덜고, 핵심 기능 코드 작성에 집중할 수 있다.

자바는 다양한 애플리케이션을 개발할 수 있다.

  • 자바는 다양한 운영체제에서 실행되는 프로그램을 개발할 수 있다.
  • 또, 단순한 콘솔 프로그램에서부터 클라이언트용 윈도우 애플리케이션, 서버용 웹 애플리케이션, 그리고 모바일용 안드로이드 앱 등 거의 모든 곳에서 실행되는 프로그램을 개발 할 수 있다.

  • 자바는 다양한 운영체제에서 사용할 수 있는 개발 도구와 API를 묶어 에디션(Edition) 형태로 정의하고 있다.

멀티 스레드(Multi-Thread)를 쉽게 구현할 수 있다.

  • 운영체제에 따라서 멀티 스레드를 구현하는 방법이 다르지만, 자바는 스레드 생성 및 제어와 관련된 라이브러리 API를 제공하므로 운영체제에 상관 없이 멀티 쓰레드를 쉽게 구현할 수 있다.

동적 로딩(Dynamic Loading)을 지원한다.

  • 자바 애플리케이션은 클래스로부터 생성 된 여러 개의 객체가 서로 연결되어 실행된다.

  • 애플리케이션 실행 시 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스를 동적 로딩해서 객체를 생성한다.

  • 또, 개발 완료 후 수정 사항이 발생하더라도 해당 클래스만 수정 하면 되므로 전체 애플리케이션을 다시 컴파일 할 필요가 없다. 따라서 유지보수를 쉽고 빠르게 진행 수 있다.

막강한 오픈 소스 라이브러리가 풍부하다.

  • 자바는 오픈 소스(Open Source) 언어이므로 자바 프로그램에서 사용하는 라이브러리 또한 오픈소스의 양이 방대하다.
  • 고급 기능을 구현하는 코드를 작성하는 대신 검증된 오픈소스 라이브러리를 사용하면 애플리케이션 개발 기간을 단축하여 생산성을 높이고 안정성도 높일 수 있다.

Lesson3_Data Analysis with R from Udacity_(1/2)

3장에서 배울 내용

  • 한 데이터 세트의 단일 변수 조사 방법
  • 히스토그램과 시각화와 관련 R 명령어
  • 데이터에 접근하는 방법



먼저 해야할 것은?

  • 탐색적 데이터 분석에 앞서, 연구의 목적을 돌이켜보고
  • 구하고자 하는 답에 대한 질문이 무엇인가? 상기
  • 연구에서 가장 중요한 변수를 이해하기 위해서
  • 그 변수들에 대한 요약과 시각화를 만드는 형태를 취할 것이다.



가상 페이스북 유저데이터

  • 이번 3장에서는 가상의 페이스북 유저 데이터를 이용한다.
  • 강의 노트에서 pseudo-facebook.tsv를 다운 받는다.
  • getwd() 명령어로 R에 설정된 현재 홈 디렉토리를 확인한다.
  • setwd("주소") 명령어로 홈 디렉토리를 설정할 수 있다.
  • 주의사항: 주소 경로는 '/' 로 구분한다.
setwd("C:/Users/Mingyu/workspace/3. R/Data Analysis with R_Udacity/data_analysis_with_r_udacity/")
getwd()
## [1] "C:/Users/Mingyu/workspace/3. R/Data Analysis with R_Udacity/data_analysis_with_r_udacity"
  • list.files() 명령어로 홈 디렉토리 내의 파일 목록을 확인한다.
list.files();
##  [1] "assets"                            
##  [2] "data_analysis_with_r_udacity.Rproj"
##  [3] "figure"                            
##  [4] "libraries"                         
##  [5] "problem_solve-lesson3.R"           
##  [6] "pseudo_facebook.tsv"               
##  [7] "Readme.txt"                        
##  [8] "summary_of_lesson3-1.html"         
##  [9] "summary_of_lesson3-1.Rhtml"        
## [10] "summary_of_lesson3.html"           
## [11] "summary_of_lesson3.md"             
## [12] "summary_of_lesson3.pdf"            
## [13] "summary_of_lesson3.Rmd"            
## [14] "summary_of_lesson3_cache"          
## [15] "summary_of_lesson3_files"          
## [16] "summary_of_lesson3_home.html"      
## [17] "summary_of_lesson3_home.Rmd"       
## [18] "test1.html"                        
## [19] "test1.Rhtml"
  • read.csv() 명령어로 pseudo-facebook.tsv를 불러온다.
pf <- read.csv('pseudo_facebook.tsv', sep ='\t')
  • \t 으로 구분하고, 불러온 데이터를 pf 변수에 담는다는 의미이다.



데이터세트 컬럼 확인하기

  • names(pf) 명령어로 pf 변수에 담긴 데이터세트의 컬럼 정보를 확인 할 수 있다.
names(pf)
##  [1] "userid"                "age"                  
##  [3] "dob_day"               "dob_year"             
##  [5] "dob_month"             "gender"               
##  [7] "tenure"                "friend_count"         
##  [9] "friendships_initiated" "likes"                
## [11] "likes_received"        "mobile_likes"         
## [13] "mobile_likes_received" "www_likes"            
## [15] "www_likes_received"



ggplot2을 이용한 히스토그램 작성

  • install.packages("ggplot2") 명령어로 ggplot2 패키지를 설치한다.
  • 설치가 완료되면 library(ggplot2) 명령어로 ggplot2 패키지를 로드한다.
  • 위에서 가상의 페이스북 데이터세트를 담고 있는 pf를 통해 히스토그램을 만들어보자.
  • qplot() 명령어를 사용한다
  • qplot()은 Quick plot의 약자로 ggplot2 패키지의 가장 기본적인 도표 작성 기능이다.
library(ggplot2)
qplot(x = dob_day, data = pf)
## stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.


  • qplot()의 인자 중 x는 dob_day 변수의 데이터를 가져오고, data는 pf 데이터 세트를 가져온다는 의미이다.



정확한 히스토그램 작성

  • 일수는 1~31일인데, 히스토그램은 10단위로 뭉뚱그려 표시되므로 직관적이지 못하고 에러메시지 발생.
  • 에러메시지: stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.
  • x 축의 단위를 수정해보자
qplot(x = dob_day, data = pf) + scale_x_discrete(breaks = 1:31)





(번외)히스토그램 꾸미기: ggthemes

  • ggthemes() 패키지를 사용하여 ggplot 패키지로 생성하는 도표들을 간단하게 꾸밀 수 있다.
## CRAN에서 다운로드
install.packages('ggthemes', dependencies = TRUE)
## GitHub에서 다운로드
library("devtools")
install_github("jrnold/ggthemes")
library(ggthemes)
qplot(x = dob_day, data = pf) + geom_histogram() + theme_wsj() +ggtitle("Day of Birth of Facebook users") + scale_x_discrete(breaks = 1:31)






페이스북 직원 Moira의 연구

  • 최근에 페이스북에서 청중들에 대한 사람들의 인식이 현실과 부합하는지 연구하고 있다.
  • 사람들이 공유한 콘텐츠를 실제 보는 사람은 누구인가?
  • 최근에 포스팅을 한 사람들을 대상으로 얼마나 많은 사람들이 이 포스트를 본다고 생각하나?라고 질문을 했다.
  • 그리고 실제로 단 몇초간이라도 그들의 포스팅을 본 사람들의 숫자를 세어보았다
  • 그 결과 사람들이 인식하는 청중들의 크기와 실 청중들의 크기는 달랐다.
  • 사람들의 예상은 실제 청중들의 크기의 1/4이다.



Faceting(패싯기법)

  • 앞서 만들었던 가상의 페이스북 데이터세트 pf에서 추출한 유저들의 생일 히스토그램을 월별로 분류한다.
  • facet_wrap() 명령어를 사용한다.
qplot(x = dob_day, data = pf) + scale_x_discrete(breaks = 1:31) + facet_wrap(~dob_month, ncol=3)

facet_wrap(가로축 데이터)
facet_grid(가로축데이터~새로축 데이터)



Axes(축)의 조정

  • 가상의 페이스북 데이터의 아웃라이어 데이터를 제외하고 의미있는 데이터만 분석하고자 한다.
  • 지정한 변수의 값을 제한하기 위하여 qplot()명령어에 xlim인자를 추가하거나
  • scale_x_continuous(limits) 명령어를 연결하여 사용한다.
qplot(x = friend_count, data = pf, xlim = c(0, 1000))
## stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.


qplot(x= friend_count, data = pf) + scale_x_continuous(limits=c(0,1000))
## stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.



binwidth (빈 너비, 막대 저장 넓이)

  • 조금 더 정확하게 히스토그램을 분석하기 위해서 x축 값의 단위를 작게 지정한다.
  • 또, binwidth(막대 저장 넓이)를 조정하여 더 작은 단위로 데이터를 분석할 수 있다.
qplot(x = friend_count, data=pf, binwidth = 25) + scale_x_continuous(limits = c(0, 1000), breaks = seq(0, 1000, 50))


  • binwidth를 더 쉽게 이해하기 위해 binwidth 값을 100으로 설정한 도표를 보자.
qplot(x = friend_count, data=pf, binwidth = 100) + scale_x_continuous(limits = c(0, 1000), breaks = seq(0, 1000, 50))

  • 즉, 히스토그램의 막대가 포함하는 값들이 많아져 데이터가 뭉뚱그려 보여지게 된다.



성별로 구분하기

  • 가상의 페이스북 유저 데이터의 친구 숫자 히스토그램을 성별로 나누어 보자.
qplot(x = friend_count, data=pf, binwidth = 25) + scale_x_continuous(limits = c(0, 1000), breaks = seq(0, 1000, 50)) + facet_wrap(~gender)





NA 제외하기: subset() 사용

  • 성별 라벨에 체크를 하지 않은 유저들의 데이터는 NA로 저장되어있어 원치 않은 히스토그램이 생겨났다.
  • NA를 제외한 결과를 볼 수 있게 명령문을 조정하자
# subset 사용
subset(pf, !is.na(gender))
  • subset(데이터세트, 조건식): 데이터세트에서 조건식을 충족하는 값만 출력
  • 논리 부정 연산자 ! 사용하여, gender 컬럼에 na가 포함 되었으면 true를 반환하는 조건식을 부정하므로
  • pf 데이터에서 gender 컬럼에 na가 포함 안된 값들을 data를 가지게끔 데이터세트를 구분한다는 뜻
qplot(x = friend_count, data=subset(pf, !is.na(gender)), binwidth = 15) + scale_x_continuous(limits = c(0, 1000), breaks = seq(0, 1000, 50)) + facet_wrap(~gender)




NA 제외하기: na.omit() 사용

  • 앞서 살펴본 subset() 이외에도 na.omit() 명령문을 사용할 수 있다.
  • 모든 observations (데이터세트의 값들) 중에 NA를 가지는 값들을 제외하고 보여준다.
qplot(x = friend_count, data=na.omit(pf), binwidth = 15) + scale_x_continuous(limits = c(0, 1000), breaks = seq(0, 1000, 50)) + facet_wrap(~gender)

  • 주의사항: 무조건 NA값을 제외하므로 어떤 변수를 분석하냐에 따라 데이터 분석에 오류가 생길 수 있다.


작업 폴더 셋팅


1. C:\ 경로에 Java 폴더 생성


2. Java 폴더에서 workspace와 setup_download 폴더 생성


3. 이클립스 실행 후 workspace 경로 설정시 C:\Java\workspace 지정


4. 이 후 다운로드에 필요한 파일은 setup_download에 생성



JDK 설치



1. http://www.oracle.com 접속


2. Downloads 클릭


3. 좌측 Java SE 클릭 → 상단 탭 Overview 우측의 Download 클릭


4. Java 아이콘 모양 밑 Download 클릭(다운로드 경로 C:\Java\setup_download)



5. Java SE Development Kit 8u51 하단 Accept License Agreement 체크

a. JDK = Java Development Kit (자바 개발 도구)

b. SE = Standard Edition

c. 8u51 = JDK 8버전, Update 51


6. 운영체제에 맞는 설치파일 다운로드 클릭

a. 윈도우 운영체제 확인: 윈도우키+s → '시스템' 검색 → '시스템 종류' 확인

b. 64비트: x64 파일, 32비트: x86 파일


7. 4번 화면으로 이동하여 스크롤을 내려 'Additional Resources' → Java SE 8 Documentation 우측 DOWNLOAD 클릭


8. Java SE Development Kit 8u51 Documentation 항목 Accept License Agreement 체크하고 다운로드

a. Java API(매뉴얼 라이브러리)


10. JDK SE 1.8_51 설치파일 실행 후 계속 Next

a. 기본 설치 위치: C:\Program Files\Java\jdk1.8.0_51

b. 처음에 JDK가 설치 된 후 JRE(Java Runtime Environment)가 설치 됨

c. JDK와 같이 C:\Program Files\Java\ 에 설치됨


11. JDK가 어느 경로에서든 사용 가능하도록 path 설정 작업

a. 6-a와 같이 시스템 창에 진입

b. 좌측에 고급 시스템 설정 클릭

c. 시스템 설정 창에서 하단 환경 변수 클릭

d. 시스템 변수란에서 Path 변수를 클릭 후 편집

e. 변수 값에서 맨 마지막 글자 뒤에 ; (세미콜론) 입력

f. C:\Program Files\Java\jdk1.8.0_51\bin 붙여넣기

g. 참고: 추후 톰캣 설치 시에는 시스템 변수에 JAVA_HOME을 새로 만들고 path를 수정해야함


11. 10번 작업 수행 여부 확인

a. 윈도우 키 + S → cmd

b. javac -version 입력

c. 자바 버전이 나오면 10번 작업이 잘 수행되었다는 것


12. CLASSPATH 설정

a. 10-c 이후 시스템 변수에 새로 만들기 클릭 변수명에 CLASSPATH, 변수 값에 . (온점) 입력

b. . (온점): 현재 디렉토리



이클립스(Eclipse) 설치



1. https://eclipse.org/downloads/ 접속

2. 첫번째 Eclipse IDE for Java EE Developers 다운로드(운영체제에 맞게)

3. 압축 풀기(경로: C:\eclipse)
a. 경로가 길어 오류가 난다면 root 디렉토리(C:\) 에서 압축파일 명을 임의로 줄인 후 압축 풀기

4. eclipse.exe 실행

5. workspace 경로 설정(C:\Java\workspace)





프로그래머 10계명 


1. 정보를 모음에 소홀히 하지 말고 설명서를 읽음에 게을리 하지 말지어다. 오늘 필요 없는 정보는 내일 필요하리라. 가장 가치 있고도 저렴한 지식은 책 속에 있느니라. 서점과 동료의 책꽂이에 무엇이 꽂혀 있는지 때때로 살피어라. 무심코 흘렸던 종이 한 장이 너의 근심을 풀어 주었으리라. 설명서는 충분히, 꼼꼼히 읽을지어다. 모든 의문은 설명서를 안 보는 데서 생기니라. 그렇더라도 모두 다 읽을 필요는 없느니라. 


2. 너의 PC가 안전하다고 믿지 말지어다. 5분 후에 정전이 되고 내일 너의 하드가 맛이 가리라. 그러하니 너의 소중한 소스 코드는 정기적으로 여러 군데에 단계별로 백업해 두어라. 


3. 변하는 수를 다룰 때에는 늘 조심할지어다. 정수가 절대로 그 한계를 넘지 않으리라 가정하는 것은 어리석음이라. 127, -128, 255, 32767, -32768, 65535, 이 숫자들을 너의 골수에 새기어라. 0.0은 0이 아니니 실수는 원래부터 결코 정밀하지 않느니라. 부호 없는 것과 있는 것을 어울리거나 정수끼리 나눌 때에는 늘 조심하여라. 


4. 무슨 일을 반복시킬 때에는 처음과 끝에 유의할지어다. 너의 컴퓨터는 1보다는 0을 좋아 하니라. 배열의 첨자가 그 범위를 넘지 않을지 손 댈 때마다 따져 보아라. 수식에 1을 더하거나 뺄 때에는 늘 긴장하라. 너의 프로그램은 단지 한 번 덜해서 틀리고 한 번 더해서 다운되느니라. 


5. 항상 모든 경우의 수를 고려하고 섣불리 생략하지 말지어다. 절대로 일어나지 않을 일은 반드시 일어나고, 가장 드물게 일어날 일이 가장 너를 괴롭히리라. 그러하니 언제나 논리에 구멍이 없는지 꼼꼼히 따져 보고, if를 쓸 때에는 else부터 생각하라. 


6. 함수 안에서 매개 변수값은 결코 믿지 말지어다. 지금 그 매개 변수가 결코 가질 수 없다는 값을 내일부터는 가지리라. 그러하니 매개 변수값이 올바름을 항상 검사할지어다. 그렇더라도 처리 속도가 문제가 되는 경우는 예외이니라. 


7. 오류를 알려 주는 기능은 있는 대로 모두 활용할지어다. 컴파일러의 경고는 모두 켜 두어라. 경고는 곧 오류이니라. 오류를 알리는 함수의 결과를 확인하지 않는 우를 범하지 말지어다. 모든 파일 입출력과 모든 메모리 할당은 조만간 실패할 것이라. 


8. 한 번의 수정과 재컴파일만으로 연관된 모든 것이 저절로, 강제로 바뀌도록 할지어다. 어떠한 것을 수정했을 때에 연관된 것이 따라서 변하지 않는다면 그것이 곧 벌레이니라. 컴파일러로 하여금 매개 변수 리스트를 완전하게 검사하도록 하고, 언젠가 손대야 하거나 따라서 변해야 하는 수치는 전부 매크로로 치환하며, 형 정의를 적극 활용하여라. 


9. 사용자가 알아서 잘 써 주리라고 희망하지 말지어다. 너의 프로그램은 항상 바보와 미친놈만이 쓰느니라. 사용 설명서를 쓸 때에는 결코 빠뜨리지 말아라. 빠뜨린 만큼 사용자는 너를 괴롭힐 것이니라. 


10. 매사에 겸손하고 항상 남을 생각할지어다. 가장 완벽한 프로그램일수록 가장 완벽하게 숨은 벌레가 있느니라. 네가 이 세상 최고의 프로그래머라고 떠들며 자만할 때, 옆집 곳간에서는 훨씬 더 뛰어난 것을 묵묵히 만들고 있느니라. 아무렴 프로그래밍은 혼자 잘나서 할 게 아니니, 너로 인해 다른 사람들도 더불어 잘 되면 그얼마나 좋은 것이냐. 


이 모든 것을 깨닫고 지키려 애쓰는 자는, 있어도 없어도 되어도 아니 되어도 늘 평온하리라.있나니 너희는 모든 프로그램에 대해서 위의 프로시줘를 따를 지니라. 


- 터보C정복 저자 임인건 ( 출처: https://kldp.org/node/60903 )

'프로그래밍' 카테고리의 다른 글

웹 애플리케이션 동작 원리  (2) 2016.03.17

+ Recent posts