1.3 C++ 언어 소개    [DOC]    [SMTS]

 컴퓨터의 속도가 빨라짐에 따라 소프트웨어의 덩치도 커지게 되었고, C 언어로는 규모가 큰 프로그램을 개발할 때 프로그램의 코드를 관리하는데 어려움을 겪게 되었다. 이러한 점을 개선하기 위해서 C 언어와의 하위 호환성을 유지하면서 객체 지향 특성 (object oriented programming) 및 편의 기능들을 추가하여 1983년 즈음에 Bell 연구소의 Bjarne Stroustrup 이 C++ 언어를 개발하였다.


Bjarne Stroustrup, Creator and Developer of C++ programming language

[그림 1.3.1] C++ 언어를 개발한 Bjarne Stroustrup


C++에서는 C 언어의 struct 자료 구조를 확장한 class라는 새로운 자료 구조를 이용하여 객체 지향 프로그래밍 방법론을 구축하였으며 이는 다른 현대적인 프로그래밍 언어들에 지대한 기여를 하였다. 이것에 영향을 받아 1991년에는 Guido B.A.가 python의 초기 버전을 발표하였으며, 1995년도에는 C++의 영향을 받은 JAVA라는 언어가 Sum Microsystem 사의 James Gosling 에 의해서 만들어졌다. 또한 2000년에는 Microsoft 가 C++과 JAVA의 장점을 취한 C#이라는 언어를 만들어 ,NET framework의 핵심 언어가 되었다. 이외에도 Javascript, PHP 등 웹프로그래밍 언어들도 C/C++의 영향을 받아서 개발되어 널리 사용되고 있다. 파이썬과 자바 그리고 자바스크립트는 현대의 컴퓨팅환경에서 가장 널리 쓰이는 프로그래밍 언어들이다.


다른 언어들에 비해서 상대적으로 오래된 역사에도 불구하고 C++은 현재까지도 중요한 비중을 차지하고 있으며 속도나 성능이 매우 중요한 임베디드 시스템 개발이나 게임 프로그래밍에 많이 사용되고 있다.  또한 마이크로콘트롤러(microcontroller)나 DSP(digital signal processor)의 프로그래밍에서는 C/C++언어가 아직도 주력으로 사용되고 있으며 특히 아두이노(arduino)와 같은 인기있는 오픈 하드웨어 플랫폼도 C++언어를 사용한다.


 전술한 바와 같이 다른 주요한 언어들이 C/C++언어의 영향을 많이 받아 설계되었으므로 C/C++언어를 익히면 다른 언어로 건너갈 때 훨씬 용이하므로 전산 관련 학과에서 프로그래밍 입문 언어로 C/C++이 많이 사용된다.


Posted by 살레시오
,

 심파이(sympy)의 행렬 객체는  Matrix이다. 이 Matrix 객체를 생성할 때는 리스트를 넘겨주면 된다. 넘겨준 리스트의 각 요소는 행렬의 행이 된다. 기본적인 사용 예는 다음과 같다.


>>> Matrix([[1,0],[0,1]]) #[1,0]이 1행, [0,1]이 2행이 된다.
>>> Matrix([[11, 22, 33]]) # 리스트의 첫 번째 요소인 [11,22,33]이 1행이 된다.
>>> Matrix([11, 22, 33]) # 11이 1행, 22가 2행, 33이 3행이 된다.


다른 방법으로 행의 개수와 열의 개수를 명시적으로 지정해 주는 방법이 있다.


>>> A = Matrix(2, 3, [1,2,3,4,5,6])
⎡1  2  3⎤
⎣4  5  6⎦

>>> B = Matrix(4, 4, range(16))
⎡0   1   2   3 ⎤
⎢4   5   6   7 ⎥
⎢8   9   10  11⎥
⎣12  13  14  15⎦


행 요소와 열 요소의 관계를 파이썬 함수로 작성하여 이것을 사용할 수도 있다.


>>> def f(i,j):
 if i==j : return 1
 else : return 0

>>> Matrix(4,4,f)
⎡1  0  0  0⎤
⎢0  1  0  0⎥
⎢0  0  1  0⎥
⎣0  0  0  1⎦


명시적 함수뿐만 아니라 익명 함수도 사용할 수도 있다.


>>> Matrix(3, 4, lambda i,j:1-(i+j)%2)
⎡1  0  1  0⎤
⎢0  1  0  1⎥
⎣1  0  1  0⎦


특수한 행렬을 생성하는 함수도 있다. eye() 함수는 항등 행렬을 생성하며, zeros() 는 영행렬을 그리고 ones()는 일행렬을 만들어 준다.


>>> eye(4)
>>> zeros(2)
>>> ones(3)
>>> ones(1,3)


대각행렬을 생성하는 diag() 함수도 있다. 스칼라나 행렬을 인수로 주면 그것들로 대각행렬을 생성한다.


>>> diag(1,2,3)
>>> diag(-1, ones(2,2), Matrix([5,7,6]))


스칼라는 1x1 행렬로 간주되며 주어진 행렬들을 대각 위치에 놓는다.


 난수 행렬을 발생시킬 수도 있으며 randMatrix() 함수를 이용한다.


>>> randMatrix(4) # 4x4 행렬 생성
>>> randMatrix(3,4) # 3x4 행렬 생성
>>> randMatrix(5, symmetric = True) # 5x5의 대칭행렬 생성


이 행렬의 요소는 100이하의 양의 정수로 채워진다.


[표 1] 행렬 객체의 생성 용례들

용법

내용

Martix(list)

Matrix([list1, list2,...])

Matrix(r, c, seq)

Matrix(r, c, func)

열벡터 생성

행렬 생성

seq를 이용하여 r x c 행렬 생성

함수를 이용하여 r x c 행렬 생성

eye(n)

n x n 단위행렬

zeros(n)

zeros(r, c)

n x n 영행렬

r x c 영행렬

ones(n)

ones(r, c)

n x n 일행렬

r x c 일행렬

diag(arg1, arg2, ...)

args 요소들의 단위행렬 생성

randMatrix(n)

randMatrix(r, c)

n x n 난수행렬 (대칭행렬은 symmetric=True 옵션을 지정)

r x c 난수행렬


 한 가지 주지할 사항은 Matrix 객체는 mutable 하다는 것이다. 따라서 immutability 가 필요한 곳(예를 들어 딕셔너리의 키)에는 사용할 수 없다. immutable행렬이 필요하다면 ImmutableMatrix 를 이용하면 된다.




Posted by 살레시오
,

  파이썬의 수학함수를 이용하기 위해서는 math 모듈을 import해야 한다. 기본 (표준) 모듈이므로 설치 과정 없이 다음과 같이 로드할 수 있다.


-------------------------------------------------------------------

             >>> import math

-------------------------------------------------------------------


이 모듈의 수학 함수는 표준 C언어의 그것들을 구현한 것이다. 실수 연산을 수행하며 대부분의 경우 float형을 반환한다.


 복소수 연산을 위해서는 cmath 모듈을 이용해야 한다. 이것도 역시 기본 모듈이므로 별도 설치 없이 다음과 같이 로드할 수 있다.


-------------------------------------------------------------------

             >>> import cmath

-------------------------------------------------------------------

이 모듈에는 복소수 연산을 위한 다양한 함수들이 있는데 여기에 잘 정리되어 있다.

 하지만 math 모듈은 인수가 실수 (스칼라) 에 대해서만 적용이 되고 cmath 는 복소수 (스칼라) 인 경우에만 적용이 된다는 단점이 있다. 만약 행렬 연산이 필요하다면 이 두 모듈은 사용할 수 없으며 numpy 를 사용해야 한다. 이 모듈은 파이썬의 고급 연산 분야의 기본 모듈로서 벡터 혹은 행렬에 대한 요소간 연산을 지원하므로 가장 적용 범위가 넓다. 또한 python(x,y) 나 winPython 같은 패키지를 사용하면 쉽게 인스톨 없이 바로 import 하여 사용할 수 있다.

winPyhon : 과학 계산용 파이썬 패키지

[#00107]


Posted by 살레시오
,

 파이랩(pylab)은 파이썬을 마치 MATLAB처럼 사용할 수 있도록 하는 목표를 가지고 개발되고 있는 모듈로서 내부적으로 numpy, scipy, 그리고 그래픽을 생성하기 위한 matplotlib 라는 모듈을 사용한다. 이 모듈은 matlab 사용자들을 python 쪽으로 옮겨오는데 편의를 주기 위해서 개발되기 시작한 것 같고 한 때 사용의 편의성 때문에 많이 사용되었던 것 같다. 특히 그래픽을 생성하는 기능은 MATLAB과 매우 흡사한데 이는 matplotlib 의 함수들은 MATLAB문법에 맞게 wrapping 해서 제공하기 때문이다.


 하지만 파이썬 커뮤니티 내부에서는 pylab은 몇 가지 이유로 사용하기를 권장지 않는 듯 하다. 가장 큰 이유는 그 안에서 사용되는 파이썬 모듈 간 구분이 잘 이루어 지지 않아 혼동을 준다는 것이다. 아래 포스트에 자세한 이유가 소개되어 있다.


 please stop using python


현재 pylab에 대한 자료가 별로 많지 않고 2013년 이후로 업데이트도 없다. 단지 하위 호환성을 일정 기간 유지하기 위해서 관련 내용을 완전히 삭제하고 있지는 않은 것 같다. 특히 수치 해석시 많이 사용되는 파이썬쉘인 ipython 을 사용할 때에는 더더욱 권장되지 않는다.




Posted by 살레시오
,

  winPython의 python 콘솔을 실행하면 pylab 이 기본적으로 import 되어서 함수들을 엄격하게 구분해서 사용하는 것이 무척 불편하다. pylab 을 사용하는 것은 파이썬 커뮤니티 안에서 권하지 않는다.


 파이썬 콘솔에서 백그라운드로 임포트되는 모듈들은 다음과 같이 'scientific'이라는 명령을 입력하면 상세한 내용을 확인할 수 있다.

-----------------------------------------------------------------------

>>> scientific


This is a standard Python interpreter with preloaded tools for scientific

computing and visualization. It tries to import the following modules:


>>> import numpy as np  # NumPy (multidimensional arrays, linear algebra, ...)

>>> import scipy as sp  # SciPy (signal and image processing library)

>>> import matplotlib as mpl         # Matplotlib (2D/3D plotting library)

>>> import matplotlib.pyplot as plt  # Matplotlib's pyplot: MATLAB-like syntax

>>> from pylab import *              # Matplotlib's pylab interface

>>> ion()                            # Turned on Matplotlib's interactive mode

>>> import guidata  # GUI generation for easy dataset editing and display


>>> import guiqwt                 # Efficient 2D data-plotting features

>>> import guiqwt.pyplot as plt_  # guiqwt's pyplot: MATLAB-like syntax

>>> plt_.ion()                    # Turned on guiqwt's interactive mode


Within Spyder, this interpreter also provides:

   * special commands (e.g. %ls, %pwd, %clear)

   * system commands, i.e. all commands starting with '!' are subprocessed

     (e.g. !dir on Windows or !ls on Linux, and so on)

-----------------------------------------------------------------------

 파이썬 콘솔 기동시에 pylab을 import 하지 않으려면 다음과 같은 과정을 거쳐야 한다. 먼저 Tools > Preferences 의 Console 탭에서 Advanced settings 항목으로 들어간다.

여기서 Default PYTHONSTARTUP scrip 를 선택하면 파이썬의 기본적인 세팅으로 기동하는 것이다. 아예 아무런 모듈도 import하지 않고 시작하려면 이것을 체크하면 된다.


 과학계산 모듈을 초기에 import 하는 일은 scientific_startup.py 에 기록되어 있는데 아래 그림과 같이 pylab을 로딩하는 부분을 주석 처리하면 pylab 이 import 되는 것을 막을 수 있다.


추가적으로


              %ls (파일리스트)

              %pwd (현재 디렉토리)

              %clear


등의 명령이 사용가능함을 알 수 있다.

Posted by 살레시오
,

  컴퓨터로 프로그래밍을 하다 보면 눈이 쉽게 피로해지는데 컬러 테마를 어두운색 계열로 바꾸어 놓으면 도움이 된다. 윈파이썬의 경우 spyder를 기본 IDE로 사용하는데 spyder의 Tools > Preferences 메뉴에서 Editor, Console 텝의 옵션을 조정하면 dark theme 를 사용할 수 있다.

먼저 Editor 텝에서 다음 그림과 같이 color scheme 을 변경한다. 이것을 적용하면 프로그램 에디터의 테마가 다크테마를 적용되어 어두운 배경에 밝은 색 폰트로 변경된다.



아래 그림에서는 체크를 해제하여야 console창과 python쉘의 배경이 검은색으로 된다.



만약 ipython쉘을 사용한다면 다음과 같이 ipython탭에서 설정을 해주어야 한다.



이렇게 설정해 놓으면 눈이 훨씬 편하게 작업할 수 있다.

Posted by 살레시오
,

  자바 식별자는 길이에 제한이 없으며 '_' 뿐만 아니라 '$' 문자도 사용할 수 있다는 점이 특이하다.


  자바에서는 반복문 앞에 라벨을 붙여서 그 라벨을 break, continue 문 뒤에 붙여 중첩된 반복문을 한꺼번에 벗어날 수 있다.


loop1: for(...) {

    for (… ) {

        …

        break loop1; //바깥쪽 루프를 벗어남.

        …

        continue loop1: //바깥쪽 루프의 그 다음 반복을 바로 수행.

    }

}


반복문의 이름이 지정되지 않은 break, continue 문은 그것을 포함하는 가장 안쪽의 반복문을 제어하지만 이처럼 라벨링을 이용하면 그 바깥쪽의 반복문을 제어할 수 있다.


  그리고 JAVA5 이상부터는 C#의 foreach 나 파이썬의 for문과 같은 기능을 사용할 수 있다. 문법은 다음과 같다. 


for(자료형 변수명: 집합) {

}


여기서 집합은 배열,콜렉션,enum 등이다. 이렇게 하면 예를 들어 배열의 각 요소가 변수명에 대입되어 차례로 반복문을 수행하게 된다.


enum Week { 월, 화, 수, 목, 금, 토, 일 }

public static void main(String args []) {

    // enum 타입을 foreach 로 출력

    for (Week day : Week.values()) { // Week.values()에는 Week 의 값들이 교대로 들어갑니다.

    System.out.println(day + "요일");

}


// 정수 배열을 foreach 로 출력

int[] num = { 14, 54, 52, 26, 62, 55 };

for (int i : num)

    System.out.println(i);


// 문자열 배열을 foreach 로 출력

String names[] = { "수성", "금성", "지구", "화성" };

for (String s : names)

    System.out.println(s);

}

[#00065]


Posted by 살레시오
,

  winPython 은 초기에 python console을 실행시키게 되어 있다. 만약 ipython을 기본으로 사용하고 싶다면 다음과 같은 과정으로 설정하면 된다.


먼저 python console을 초기 기동시 자동으로 시작하게 하지 않으려면 Tools > Preferences 메뉴에서 다음 그림과 같은 옵션을 체크 해제한다. 이 옵션의 체크가 해제되면 winPython을 실행시킬 때 console 창이 자동으로 실행되는 것을 억제할 수 있다.



그 다음 ipython 옵션에서 다음 탭을 체크하여 선택한다.



그러면 이제 winPython을 실행시키면 초기에 python console 대신 ipython 이 실행된다.

[#00066]


Posted by 살레시오
,

1. 파이시리얼(pyserial) : 파이썬 시리얼통신 모듈

 먼저 pyserial을 소개하도록 하겠다. pyserial은 시리얼 통신을 하기 위한 파이썬 모듈이다. 만약 winPython 을 사용한다면 pyserial 이 기본으로 설치되어 있다. ( 처음에는 이 사실도 모르다가 따로 설치를 해야 하겠거니 짐작하고 한참을 헤맸었다. ) 따라서 바로 import 하면 사용할 수 있다.  주의할 점은 모듈명은 pyserial이 아니라 그냥 serial 이라는 것이다.


>>> import serial


일단 아두이노를 연결하면 윈도우 장치관리자에서 COM포트 번호를 확인할 수 있다. 아두이노 우노를 연결하고 내 컴퓨터의 예를 보면 아래와 같이 'COM22'번으로 잡혀있다.



먼저 시리얼 통신 객체를 생성하여야하는데 serial 모듈에 있는 Serial 클래스 (즉, serial.Serial 클래스이다.)를 이용하면 된다. 생성자의 정의는 다음과 같다.


class serial.Serial

__init__(
    port=None,
    baudrate=9600,
    bytesize=EIGHTBITS,
    parity=PARITY_NONE,
    stopbits=STOPBITS_ONE,
    timeout=None,
    xonxoff=False,
    rtscts=False,
    writeTimeout=None,
    dsrdtr=False,
    interCharTimeout=None
)


입력 인수들:


  • port - 장치명. 윈도우즈에서는 'COM0', 'COM1' 등이다.

  • baudrate - 보레이트(baud rate) 예를 들면 9600, 115200 등.

  • parity - 패리티비트. FIVEBITS, SIXBITS, SEVENVITS, EIGHTBITS 등이 가능하다.

  • stopbit - 정지비트. STOPBITS_ONE , STOPBITS_ONE_POINT_FIVE , STOPBITS_TWO 등이 가능하다.

  • timeout - 수신 시간 제한 설정

  • xonxoff - 소프트웨어 흐름 제어를 설정

  • rtscts - 하드웨어(RTS/CTS) 흐름 제어 설정

  • dsrdtr - 하드웨어(DSR/DTR) 흐름 제어 설정

  • writeTimeout - 송신 시간 제한 설정

  • interCharTimeout


예외 발생


  • ValueError - 입력 변수값에 오류가 있을 경우 발생

  • SerialException - 시리얼 통신 장치에 오류가 있을 경우 발생


이것을 보면 포트 정도만 지정해 주어도 기본적으로 생성이 되는 것을 알 수 있다. 포트는 'COM22'와 같이 문자열로 넘겨주어야 한다. 포트명을 특정해 주면 즉시 장치와 연결이 open된다. 시리얼통신 장치를 다 사용하였다면 obj.close() 를 호출하여 반드시 닫아주어야 한다.




Posted by 살레시오
,

2. 아두이노로부터 수신 실험

 실험을 위해서 다음과 같은 간단한 프로그램을 아두이노 우노에 다운로드 하였다. 이 프로그램은 전원이 켜지면(또는 리셋 버튼을 누르면) "Hello python." 이라는 문자열을 보낸다.


void setup() {
   Serial.begin(9600);
   Serial.println("Hello python.");
}

void loop() {
}


그리고 파이썬에서 Serial 객체의 인스턴스를 다음과 같이 생성한다.


>>> ard = serial.Serial('COM22')


이렇게 하면 ard 변수에 Serial 클래스의 인스턴스가 생성된다. 이제 이 변수를 이용해서 아두이노에서 보내는 값을 읽어들일수 있다.


>>> obj = ard.readline()
>>> obj
b'Hello python.\r\n'


아두이노 쪽에서 println()함수를 썼기 때문에 끝에 \r\n 두 개의 개행 제어 문자가 붙어서 넘어왔다.


 한 가지 주의할 것은 Serial.readlin() 함수의 반환 객체가 문자열이 아니라 bytes 라는 파이썬 객체로서 각각의 문자의 아스키코드 바이트 값의 배열이라는 점이다. 이것을 파이썬 문자열(string)로 변환하려면 bytes.decode()함수를 이용하면 된다.


>>> str = obj[:-2].decode()
>>> str
'Hello python.'


이제 str 변수에 아두이노로 부터 전송된 문자열이 정확히 저장되었다. 여기서 obj[:-2] 와 같이 인덱싱을 한 것은 \r\n 두 문자를 제외하기 위한 것이다.





Posted by 살레시오
,