비트 연산자

  • 0과 1로 표현이 가능한 정수타입만 비트 연산이 가능하다.

  • 피연산자를 int 형으로 자동 형변환

비트 반전 연산자(~), 틸드 연산자

  • 정수 타입의 피연산자에만 사용
  • 피연연사즐 2진수로 표현했을 때 비트값인 0을 1로, 1은 0으로 반전
  • 부호가 반대인 새로운 값이 산출됨

비트 논리 연산자(&, |, ^)

  • 비트논리 AND 연산자(&): 두 비트 모두 1일 경우에만 연산 결과가 1
  • 비트논리 OR 연산자(|): 두 비트 중 하나라도 1이면 연산 결과 1
  • 비트논리 XOR 연산자(^): 두 비트 중 하나는 1이고 다른 하나가 0일 경우 연산 결과는 1

비트 이동 연산자(<<, >>, >>>), 쉬프트 연산자

  • a << b: 정수 a의 각 비트를 b만큼 왼쪽으로 이동(빈자리는 0으로 채워짐)
  • a >> b: 정수 a의 각 비트를 b만큼 오른쪽으로 이동(빈자리는 정수 a의 최상위 부호 비트와 같은 값으로 채워짐)
  • a>>>b: 정수 a의 각 비트를 b만큼 오른쪽으로 이동(빈자리는 0으로 채워짐)





연산 관련 개념

  • 연산(Operation): 프로그램에서 데이터를 처리하여 결과를 산출하는 것

  • 연산자(Operator): 연산에 사용되는 표시나 기호

  • 피연산자(Operand): 연산되는 데이터
  • 연산식(Expressions): 연산자와 피연산자를 이용하여 연산의 과정을 기술한 것

연산자 정리표

연산자 종류

연산자

피연산자

산출값

기능 설명

산술

+, -, *, /, %

이항

숫자

사칙연산 나머지 계산

부호

+, -

단항

숫자

음수와 양수의 부호

문자열

+

이항

문자열

문자열을 연결

대입

=, +=, -=, *=, /=, %=,

&=, ^=, |=, <<==, >>==, >>>==

이항

다양

우변의 값을 좌변의 변수에 대입

증감

++, --

단항

숫자

1만큼 증가/감소

비교

==, !=, >, <, >=, <=,

instanceof

이항

boolean

값의 비교

논리

!, &, |, &&, ||

단항

이항

boolean

논리적 NOT, AND, OR 연산

조건

(조건식) ? A : B

삼항

다양

조건식에 따라 A또는 B 하나를 선택

비트

~, &, |, ^

단항

이항

숫자

boolean

비트 NOT, AND, OR, XOR 연산

쉬프트

>>, <<, >>>

이항

숫자

비트를 좌측/우측으로 밀어서 이동


연산의 방향과 우선순위

연산자

연산방향

우선순위

증감(++,--), 부호(+,-), 비트(~), 논리(!)

높음

산술(*,/,%)

 

산술(+,-)

 

쉬프트(<<, >>, >>>)

 

비교(<, >, <=, >=, instanceof)

 

비교(==, !=)

 

논리(&)

 

논리(^)

 

논리(|)

 

논리(&&)

 

논리(||)

 

조건(?:)

 

대입(=, +=, -=, &=, /=, %=, &=, ^=, |=, <<=, >>=, >>>=)

낮음


증감 연산자( ++ , -- )

  • 전위형: 피연산자 앞에 위치, 다른 연산보다 증감 먼저 수행 ( int i = 0; ++i )
  • 후위형: 피연산자 뒤에 위치, 다른 연산 수행 후 증감 실행 ( int j = 0; j++; )

논리 연산자( &&, ||, &, |, ^, !)

  • 일반논리AND연산자, 논리곱(&&): 피연산자 모두 true일 경우 연산 결과 true
  • 일반논리OR연산자, 논리합(||): 피연산자 중 하나만 true이면 연산 결과는 true
  • 배타적 논리합(^): 피연산자가 하나는 true이고 다른 하나가 false일 경우에만 연산 결과 true

논리 부정 연산자(!), (=not 연산자)

  • 참 또는 거짓을 부정한다.
  • !true → false
  • !false → true

덧셈연산자(+) / 문자열 연결 연산자(+) 비교

  • print( 4 + 5 ) => 정수 + 정수 => 9 // 덧셈연산자로 더하기 연산 수행
  • print( "4" + 5 ) => 문자열 + 정수 => "45" (문자열) // 문자열 연결 연산자로 4와 5 문자열을 연결
  • print( "4" + "5") => 문자열 + 문자열 => "45"(문자열) // 문자열 연결 연산자로 4와 5 문자열을 연결

0으로 나누기 또는 나머지 연산을 수행할 수 없음(오류 발생)

  • 실수를 0으로 나누면 무한대(Infinity) 결과값
  • 실수를 0으로 나머지 구하기 하면 NaN(Not a Number)결과값

조건연산자

  • 형식 => 항1 : 항2 : 항3;
  • 항1이 참이면 결과값은 항2
  • 항1이 거짓이면 결과값은 항3


자료형

  • 자바의 자료형은 크게 두 가지로 구분된다.

  • 첫째, 기본 자료형(Primitive Data Type)이다.

  • 둘째, 참조 자료형(Referenced Data Type)이다.
  • Wrapper Class : 기본자료형을 참조형 클래스로 만들어 놓은 클래스로, Object 클래스의 Number 클래스에 속한다. 모든 데이터를 단일 하게 일괄 관리하기 위해 Wrapper 클래스를 사용한다. 나중에 자세히 다룰 예정이니 지금은 참고만 하자.

자료형

명칭

크기

기본값

범위

Wrapper Class

논리

boolean

1byte

false

true, false

Boolean

문자

char

1byte

2byte

\u0000,

null

0~127,

0~65535

Character

정수

byte

1byte

0

-128~127

Byte

 

short

2byte

0

-32,768~32,767

Short

 

int

4byte

0

-2,147,483,658~2,147,483,647

Integer

 

long

8byte

0

-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

Long

실수

float

4byte

0.0

-3.4 * 1038 ~ 3.4 * 1038

Float

 

double

8byte

0.0

-1.7 * 10308 ~ 1.7 * 10308

Double

문자열

String

Resizable

null

Resizable

참조자료형


        * 정수형은 int, 실수형은 double이 기본 자료형이다.

기본 자료형(Primitive Data Type)

  • 숫자(정수, 실수)와 문자인 char 자료형과 논리형으로 구성되어 있다.
  • 스택 영역에 생성되고 실제 값을 변수에 저장한다.
  • 실수 자료형이 정수형보다 크다.
  • float 자료형의 값에는 F(또는 f) 접미사를 붙여야 한다.예) 3.14f, 3.14F
  • double 자료형도 명시할 경우 D(또는 d) 접미사를 붙일 수 있으나, 기본 실수형이므로 생략 가능하다.
  • long 자료형 값에는 L(또는 l) 접미사를 붙여야 하나, 정수형 중에 가장 큰 자료형이므로 자동 형변환이 되어 생략 가능하다.

참조 자료형(Referenced Data Type)

  • 객체(Object)의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 타입이 있다.
  • 메모리의 번지(주소)를 값으로 갖는다.
  • 참조 변수는 스택(Stack)영역에 생성되고 객체의 값을 가진 힙 영역의 주소가 저장된다.
  • null 값을 가지면 주소를 참조하는게 아니라 null 값을 가지는 것, 힙 영역에 참조할 값들은 쓰레기(Garbage)가 되어 Garbage Collector가 처리하여 메모리를 확보한다.
  • 선언

자료형 변수명(참조변수명) = new 초기화;

예) 

int x = 3; double pi = 3.14; // 정수와 실수형 변수를 선언하고 값을 대입하여 초기화.

int x = getNumber(); // 정수형을 반환하는 임의의 함수인 getNumber()로부터 값을 받아 대입하여 초기화.

x = 4; // 스택 영역에 생성되어 있는 x의 값에 새로운 값인 4를 대입

Date today = new Date(); // Date 참조 자료형의 객체인 today 변수 선언 후, new 연산자로 Date() 객체로 초기화.

* new 연산자 = 참조타입의 값을 힙(heap)메모리에 생성




클래스 선언 형식

[접근지정자][기타제어자] 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. 통합된 데이터(integrated data)

    - 여러 곳에서 사용하던 데이터를 통합하여 하나로 저장된 데이터를 의미

    - 각자 사용하던 데이터의 중복을 최소화하여 중복 저장으로 인한 데이터 불일치 현상 제거

    2. 저장된 데이터(stored data)

    - 문서로 보관된 데이터가 아니라 디스크 같은 컴퓨터 저장장치에 저장된 데이터를 의미

    - 컴퓨터 프로그램을 이용하여 디스플레이하거나 인쇄물로 출력 가능

    3. 운영 데이터(operational data)

    - 조직의 목적을 위해 사용하는 데이터

    - 업무를 위한 검색을 할 목적으로 저장된 데이터

    - 조직의 목적과 관계없이 저장된 데이터나 단순 입출력 데이터 같이 임시로 저장된 데이터는 운영 데이터에 속하지 않는다.

    4. 공용 데이터(shared data)

    - 한 사람 또는 한 업무를 위해 사용되는 데이터가 아닌 공동으로 사용되는 데이터

    - 데이터는 어느 순간이라도 둘 이상의 프로그램 또는 여러 사람이 동시에 사용할 수 있다.


     데이터베이스 특징

    1. 실시간 접근성(real time accessibility)>

    - 데이터베이스는 실시간으로 서비스된다.

    - 실시간이란 사용자가 요청하는 순간에 실제 데이터를 서비스하는 것을 말한다.

    2. 계속적인 변화(continuous change)

    - 데이터베이스의 저장된 내용은 어느 한 순간의 상태를 나타내지만,

    - 데이터 값은 시간에 따라 항상 바뀐다.

    - 삽입(insert), 삭제(delete), 수정(update) 등의 작업으로 바뀐 데이터 값을 저장한다.

    3. 동시 공유(concurrent sharing)

    - 데이터베이스는 서로 다른 업무 또는 여러 사용자에게 동시에 공유된다.

    - 동시 병행이라고도 한다.

    - 데이터베이스에 접근하는 사용자 데이터 요청 프로그램이 동시에 여러 개 존재한다는 의미이다.

    4. 내용에 따른 참조(reference by content)

    - 데이터베이스에 저장된 데이터는 데이터의 물리적인 위치가 아닌 데이터 값에 따라 참조된다.

    - 사용자가 원하는 데이터를 얻기 위해 데이터 값을 사용하여 조건을 제시하면 데이터베이스는 이에 해당하는 데이터를 검색해준다.


     데이터베이스 시스템의 구성

    - 각 조직에서 사용하던 데이터를 모아서 통합하고 서로 공유하여 생기는 장점을 이용하는 시스템

    - 데이터베이스 관리시스템(DBMS, Database Management System), 데이터베이스, 데이터모델이 있다.

    - DBMS: 사용자와 데이터베이스를 연결해주는 소프트웨어로 주기억장치에 상주한다.

    - 데이터베이스: 데이터를 모아둔 토대

    - 데이터모델: 데이터가 저장되는 기법에 관한 내용으로, 눈에 보이지 않는 논리적인 개념




    작업 폴더 셋팅


    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)





    사물인터넷(IoT, Internet of Things)



      



      오프라인의 산업을 크게 확장시킨 18세기 중반 영국에서 시작된 산업혁명에 이어, 온라인 산업을 크게 확장시킨 20세기 정보화 혁명이 있었고, 우리는 얼마전까지 정보화 시대에 살았다. 그러나 지금은 초연결 혁명이 일어나고 있다. 물리적 공간과 가상 공간이 결합하여 모든 것이 인터넷과 연결되는 시대, 우리는 이를 사물인터넷 시대라 부른다.

      스마트팩토리, 스마트카, 스마트홈이라는 말을 들어본 적이 있는가? 직역하자만 똑똑한 공장, 똑똑한 자동차, 똑똑한 집이라는 뜻인데 어떻게 사물이 똑똑해질 수 있다는 것인가? 이는 사물인터넷을 개념을 이해하면 답을 구할 수 있다. 2000년대 후반, 유럽의 한 RFID 학회에서 언급된 사물인터넷 개념은 SF 공상영화에서나 나올 법한 일들로 치부되었다. 그러나 2015년 현재, 우리는 많은 기기들과 연결되고 있다. 우리가 늘 손아 쥐고 다니는 스마트폰을 중심으로, 센서와 통신시스템을 가진 사물들과 연결되면서 더 스마트한 삶을 누릴 수 있게 되었다.


     정의


      사물인터넷 기술이란 전홍배(2015)에 따르면, 물들이 네트워크 통신기술을 이용해 서로 소통할 수 있는 프레임워크 및 연관기술들을 지칭하는 말이다. 고유 ID 및 센서와 통신 기능을 탑재한 우리 주변의 사물들이 유무선 통신 네트워크에 연결되어 스스로 정보를 수집 및 분석하고, 이를 기반으로 사람과 사물, 사물과 사물에 대한 모니터링 및 제어, 최적의 서비스 제공을 통해 인간의 삶을 더욱 이롭게 하는 기술이다.
      즉, 각각의 사물들은 각각의 ID를 가지며, 하나의 객체로써 작동하는 것이다. 현재 우리의 모습과 사물인터넷 시대의 모습을 한 번 비교해보면, 현재 우리는 집에 들어가기 위해서는 현관문을 직접 열어야 하며, 집에 들어온 후 불을 키기 위해서는 직접 스위치를 켜야 한다. 냉방 혹은 난방을 위해 난방기 또는 에어컨을 리모콘을 통해 가동시켜야 한다. 샤워를 하기 위해 화장실 불을 키고 샤워기를 틀어야 하며, 적절한 온도를 맞추기 위해 그 순간엔 장인의 손이 되어 온도를 맞춘다.




      반면, 사물인터넷 시대에서는 현관문 앞에 서면 자동으로 주인을 식별하고 문이 열린다.(식별하기 위한 도구는 생체정보 인식, 카메라 인식 등 여러가지가 있을 수 있다.) 집에 들어서면 설정된 방식대로 (전기를 아끼기 위해 일부러 불을 안 킬수도 있고, 자동으로 내 방만 불이 켜지게끔 설정할 수도 있다) 불이 켜지고, 디지털 온도계가 학습된 적정 온도를 맞춰주기 위해 자동으로 냉/난방기를 가동시킨다. 이 후 화장실에 들어가 샤워기를 켜면 학습된 적정 온도의 물이 나온다.
      이 정도면 별거 아니라고 생각할지도 모르겠지만, 이처럼 하나의 기계가 스스로 정보를 수집 및 분석하여 학습하고, 다른 사물과 통신하며 제어할 수 있고, 공유할 수 있는 사물들이 집 뿐만 아니라 도처에 존재하게 된다면 어떨까? 우리가 상상속에 생각하던 공상과학들이 현실이 될 수 있다. 
      앞어 스마트카를 언급 했었는데, 무인자동차는 주변 사물들을 인식하며 학습된 알고리즘을 통해 움직일 것이다. 하지만, 더 중요한 것은 다른 사물들과 정보 공유이다. 주행 중이던 앞 차가 급정거를 했을 때, 앞 차가 급정거 직전에 스스로 판단하여 급정거 할 요인이 생기면 바로 뒷차에 정보를 공유한다고 생각해보자. 앞차가 급정거 후에, 뒷차가 '앞차가 급정거 했다'는 정보를 받고 자신도 급정거를 하는 동작을 수행하는 것보다, 더 빠르게 속도를 줄이는 동작을 수행하여 더 정확한 자동운전 기능이 실행될 수 있다. 이러한 기능은 지난 2015년 2월 11일 발생한 영종대교 106대 추돌사건과 같은 일은 더 이상 생기지 않을 것이다.



     특징

     1. 쌍방향과 가시성
      사물인터넷은 각각의 사물들이 쌍방향으로 의사소통이 가능한 특징을 가진다. 스마트폰이 나온 이후, 우리는 쌍방향 생활을 '수동적'으로 해왔다. TV영상, 뉴스 등을 보고 바로 댓글을 달아 자신의 의사를 표현할 수 있었다. 앱을 통해 여러 서비스를 이용할 때만 수동적으로 단방향의 정보를 보내거나 받아왔다.
      그러나 사물인터넷 시대의 사물들은 스스로 정보를 수집하고 처리하고 공유하며 각각의 사물들이 연결되며 '능동적'으로 의사소통을 한다. 앞서 스마트카 예를 들었던 것처럼, 스스로 판단하여 주변 사물들에 정보를 전달하며, 그 사물들이 재전송할 필요가 있는 정보는 또 바로 받아서 처리한다. 이러한 능동적인 쌍방향 의사소통은 무한한 인터넷 세계 속에서 더욱 더 많은 정보를 창출하여 정보의 양이 어마어마하게 늘어날 것이다. 또 각 객체들이 도처에 존재하므로 정보의 흐름을 쉽게 알 수 있는 '가시성'도 확보될 것이다.

      2. 클라우드 컴퓨팅과 연결
      모든 사물들이 정보를 수집하고 처리하고 저장하는 등의 일을 수행하며서 그 정보들을 계속 쌓아놓고 있는다면 저장용량이 많이 필요할 것이다. 이는 사물들의 크기가 커지고 비용이 증가할 수 밖에 없다. 그러나 이러한 정보들을 클라우드 컴퓨팅을 통해 웹상에 정보를 저장한다면 사물 자체에 드는 비용은 크게 줄어들 것이며, 사물인터넷 시대의 개막을 더욱 앞당길 것이다. (아니, 이미 열렸다고 보며 확장 속도를 촉진시킬 것이다)
      또, 하나의 사물이 모든 정보를 처리한다면 그 주변의 비슷한 기능을 수행하는 사물들과 처리하는 정보와 중복되는 것이 많을 것이다. 이느 큰 낭비이며, 하나의 사물이 가져야할 사양이 높다는 것을 의미한다. 그러나 클라우드 컴퓨팅을 통해 사물들간에 실시간으로 필요한 정보를 주고받으며, 정보를 처리한다면 더 효율적으로 정보를 처리할 수 있다. 그리고 사물들이 가져야할 사양이 높을 필요가 없어, 이 또한 비용을 감소시킨다.

      3. 융합 및 통합을 주도
      미래창조과학부외 관계부처 합동으로 이뤄진 '정보통신전략위원회'(2014)에 따르면 ICBM(IoT, Cloud, Bigdata, Mobile) 융합형 서비스를 발굴하여 창의적인 사물인터넷 시장을 창출하고 확산시키는 것을 처번째 과제로 삼았다. 이처럼 사물인터넷은 독립적으로 가능할 수 없고, 사물들이 정보를 처리하고 공유하기 위한 클라우드 서비스와 수많은 정보들을 처리하는 빅데이터, 그리고 어느 곳에서나 연결될 수 있는 모바일이 서로 융합하여야만 가능한 것이다. 이러한 융합은 기존에 볼 수 없었던 새로운 산업을 만들 뿐만 아니라, 기존의 산업들간에 '새로운 연결' 도 만들어낼 수 있다.

      4. Service-oriented Business Model의 지향
      사물인터넷 시대의 비즈니스 모델은 서비스 지향적이다. 즉, 사물인터넷 요소가 들어간 어떠한 제품을 파는 것이 목적이 아니라, 그 제품을 통해 지속적으로 서비스를 제공해야하는 것이다. 단순하게 설정된 특정 온도로 집안 전체의 온도를 조절할 수 있는 디지털 온도계를 사는 것이 아니라, 온도계가 스스로 학습하여 지속적으로 적절한 온도를 맞춰주는 것이다. 우리가 지속적으로 사용하는 많은 물품들이 제품 그 자체로써 좋아서 사용하는 것이 아니라, 그 제품이 제공하는 서비스를 지속적으로 사용하기 때문이다. 스마트폰도 아무리 좋은 제품이라도 제공하는 서비스가 형편없으면 사용하지 않는 것과 같다.



     요소 기술


      1. 사물ID
      사물인터넷 시대에서는 각각의 사물들이 주체가 된다. 각 사물들은 서로 정보를 공유해야 하고, 사람과 연결을 해야 한다. 이 때 각 사물들이 사물ID를 가지고 있어야만 원하는 특정 사물에 연결이 가능하다. 우리가 인터넷을 사용할 때도 IP주소를 받는 것과 동일하다.

      2. 사물 정보 디바이스
      사물인터넷 시대의 각 사물들은 주변을 인식하는 센서(Sensor), 정보를 수집하고 처리하고 판단하는 컴퓨터(Chipset), 다른 사물들과 연결하는 통신기능, 저전력 기술, 초소형 기술이 집합되어 구성된 디바이스다. 이 중 센서 기술이 가장 중요하다. 각 사물들은 정보를 얻기 위해 먼저, 주변 환경을 인식해야 한다. 그렇기 때문에 센서 기술이 사물의 기능의 척도가 되어 가장 중요하다.

      3. 네트워크
      네트워크 기술은 사물이 각 사물들, 플랫폼과 연결하는데 중추적인 역할을 한다. 기존의 통신 및 네트워크 기술에는 WLAN, Wi-Fi, 3G/LTE, Bluetooth, NFC 등이 있다. 각 네트워크 기술들마다의 특징과 필요성에 따라 달리 사용되어진다. 이러한 통신 기술에는 표준이 중요한데, 아직 사물인터넷 네트워크 프로토콜 표준은 정해지지 않았다. MQTT(Message Queuing Telemetry Transfer) 프로토콜이 사물인터넷 표준으로 대두되고 있다.

      4. 플랫폼&서비스
      사물인터넷에서 플랫폼의 역할은 디바이스에서 수집한 데이터의 저장, 관리, 가공, 분석 및 제공까지의 모든 일련의 처리 기술들이 플랫폼 하에서 작동이 시키는 것이다. 전홍배(2015)에 따르면, 플랫폼 기술요소에는 쿼리엔진/리포팅, 제어/관리, 미들웨어 기술들이 있으며, 서비스 요소 기술로는 자율컴퓨팅, 초소형OS, 상황인지, 위치인식 기술들과 같은 소프트웨어 기술들과 데이터의 처리, 저장 및 분석 기술, 보안과 관련한 암호화, 개인정보보호 요소 기술들이 있다.
      쉽게 말하면, 도처에 있는 각 사물들이 보내오는 데이터를 저장부터 제공까지의 과정들을 통합적으로 수행하는 것이다. 그래서 여러 기업들이 앞다투어 사물인터넷 플랫폼을 구축하고 입지를 세우려는 것이다. 예를 들면, 삼성 스마트홈이라고 한다면 집안의 여러 스마트 기기들이 삼성이 제공하는 플랫폼 하에서 작동이 되어야 서로 데이터를 주고 받고, 사용자는 각 사물들을 하나의 플랫폼 하에서 조작, 관리 및 통제 할 수 있게 된다.


     참고문헌

    전홍배(2015), "사물인터넷 기술의 개념, 특징 및 전망", Entrue Journal of Information Technology Vol.14, No.1 / Special Issue 2015.
    미래창조과학부 외 관계부처 합동(2014), "사물인터넷 기본계획", 2014년 5월 8일.


    프로그래머 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 )

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

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

    + Recent posts