파이썬의 특징

Programming/Python 2012. 11. 21. 03:13 |

# 대화 기능의 인터프리터 언어

-> 파이썬은 객체지향 기능을 강력히 지원하는 대화형 인터프리터 언어다. 컴파일하고, 실행해 보고, 에러를 고치는 기존의 절차에서 벗어나 작성한 다음 바로 테스트하는 간단한 언어다. 따라서 테스트 과정이 크게 단축된다. 

자바와 같이 바이트 코드를 생성하지만 명시적으로 컴파일할 필요도 없다. 그저 프로그램을 작성하고 수행하면 된다. 그러면 필요한 바이트 코드가 자동으로 생성된다.


# 동적인 데이터 타입 결정 지원

-> 파이썬은 동적으로 데이터 타입을 결정하므로 데이터 타입에 관계없는 일반화된 코드를 작성할 수 있다. 

ex) def add(a, b):

return a+b

이렇게 작성하면 정수, 문자열, 리스트등 자료가 입력되었을 때, 그 자료에 맞는 +메쏘드 (C++의 operator+와 같은 것을 말하는 듯) 를 자동으로 호출한다. 

또한 복잡한 형 선언이나 크기 선언을 해 줄 필요도 없다.


# 플랫폼 독립적 언어

-> 대부분의 운영체제에서 동작한다. 바이트 코드를 생성하므로 소스 코드 없이도 다른 컴퓨터에서 즉시 수행된다.


# 개발 기간 단축에 초첨을 둔 언어

-> 파이썬은 실행의 효율성보다는 개발 기간 단축에 초점을 둔 언어다. 실행 속도로 말하자면 어셈블리 언어를 제외하고는 C에 견줄 만한 프로그래밍 언어는 없다. 

그러나, 실행속도가 조금 느리더라도 개발 기간을 단축할 수 있는 언어를 택할 것이다.  수행 속도 10분을 줄이기 위해 29일을 손해 볼 수는 없는 법.


# 간단하고 쉬운 문법

-> 파이썬은 begin ... end나 { }를 사용하지 않는다. 

들여쓰기(Indentation)로 블럭을 구분한다. 프로그래머들에게 강제적으로 블록에 대한 줄을 일관되게 맞추어 프로그램을 작성하게 함으로써 프로그램의 가독성과 이해도를 높이고 있다.


# 고수준의 내장 객체 자료형 제공

-> 파이썬은 일반적으로 사용되는 리스트(List), 사전(Dictionary),  문자열(String), 튜플(Tuple) 등의 자료 구조를 제공한다. 


# 메모리 자동 관리

-> 파이썬은 쓰레기 수집(Garbage Collection) 기능을 사용하여 필요할 때 메모리를 자동 할당하고 사용이 끝났을 때 자동으로 해제한다. 또한 필요에 따라 메모리를 늘리기도 하고 줄이기도 한다.


# 쉬운 유지 보수

-> 파이썬의 깔끔한 코드는 이해하기 쉬워서 코드의 유지 보수가 용이하다.


# 많은 수의 라이브러리 제공

-> 파이썬은 이미 만들어진 많은 수의 라이브러리를 제공한다. 정규식 매칭부터 네트워킹까지 원하는 웬만한 기능은 이 라이브러리에서 찾을 수 있다. 

또한 서드파티에서 제공하는 수많은 외부 모듈이 있다.


# 짧아지는 코드

-> 파이썬은 일급 함수(First Class Function : 1. 함수 객체를 변수에 저장 가능 2. 함수에서 리턴값으로 사용 가능 3. 함수에 인수로 전달 가능한 함수) 를 지원하며, 다중 상속과 지연 바인딩 기능을 지원하는 객체지향 언어이다. 


# 높은 확장성

-> 파이썬을 일명 접착제 언어(Glue Language)라고도 한다. 다른 언어나 라이브러리에 쉽게 접근해 그들을 사용할 수 있기 때문이다. 가장 보편적인 언어인 C와는 아주 잘 결합된다. 


# 확장(Extending) 및 내장(Embedding) 가능

->  C 등 다른 언어에서 파이썬을 호출할 수 있고, 그 응용 프로그램에 내장시켜 사용할 수 있다.파이썬에서 C 모듈을 호출하는 것도 물론 가능하다.

'Programming > Python' 카테고리의 다른 글

파이썬의 keyword  (0) 2012.11.21
파이썬 환경 변수 설정  (0) 2012.11.21
리눅스에서 스크립트 실행하기  (0) 2012.11.21
파이썬의 요소들  (0) 2012.11.21
Python  (0) 2012.11.21
Posted by scii
:

Python

Programming/Python 2012. 11. 21. 00:52 |

1989년 암스테르담의 귀도 반 로섬(Guido van Rossum)이 개발한 인터프리터 언어. 루비(Ruby), 펄(Perl)과 함께 대표적인 3세대 객체 지향형 스크립트 언어의 하나로서 문법 구조가 간단 명확하고, 언어 코아가 상대적으로 작은 대신 많은 시스템 호출과 풍부한 라이브러리, 윈도 시스템(X11, Motif, Tk, Mac, MFC)에 대한 인터페이스 등을 제공하여 개발·생산·재사용성이 높다. 또한 시스템 언어와 스크립트 언어의 중간 위치 성격과 C, C++를 사용해 새로운 모듈을 쉽게 만들 수 있는 등 다른 언어와 잘 융합되는 특징, 그리고 자유 소프트웨어 운동의 기수로서 다양한 분야에서의 활용이 기대되고 있다.




소프트웨어는 처음 만들어 내는 것보다 그 이후의 유지 보수가 훨씬 더 중요하다는 것을 깨닫는다면 파이썬의 진정한 가치를 느낄 수 있습니다.

- 어느 책의 머리말 중...


python은 1990년 귀도 반 로섬에 의해 첫 선을 보였다. 파이썬은 처음부터 객체지향적으로 잘 설계된 언어이다. 

※ 정확히 python은 1989년 12월 크리스마스를 심심하지 않게 보내려고, 네덜란드 암스테르담에 사는 귀도 반 로섬(Guido van Rossum)이 혼자 집에서 재미삼아 시작한 취미 프로그래밍 프로젝트에서 시작되었다고... 연구실은 닫혔고, 집에 컴퓨터는 있지만 특별히 다른 할 일이라고는 없었던 상황이었다고... 


파이썬은 한마디로 배우기 쉽고, 쓰기 쉽고, 간결하고, 효율적인 언어이다. 머리속에 있는 알고리즘을 명료하고 간단하게 표현하며, 구상한 알고리즘과 실제 구현의 거리를 좁혀 준다. 고수준에서 작성되는 짧고 명료한 코드는 코드 관리의 효율성을 높여 준다. 

버그가 적고 버그를 찾아내기도 쉬우며 누구나 그 코드를 보고 이해하기도 쉽다. 


파이썬을 '접착제(Glue)' 언어라고도 한다. 파이썬의 풍부한 모듈들은 순수한 파이썬 언어로도 개발되지만 C로 만들어진 모듈도 상당수가 있다. 그들 중에는 C 라이브러리를 파이썬에서 가져다 쓰는 경우도 많다. C 라이브러리 중에서 웬만한 좋은 라이브러리는 파이썬에서 사용할 수 있을 정도로 그 수는 늘고 있다.


Python은 C로 설계된 언어이다. 

Jython은 순수한 Java로 구현된 파이썬인데, 놀랍게도 기존의 자바의 모든 클래스를 그대로 사용할 수 있다.


파이썬의 특징

대략 5가지의 큰 장점을 가지고 있다.

1. 쉬운 유지 보수

- 간단명료하고 깔끔한 코드는 이해하기 쉬워서 코드의 유지 보수가 용이하다.

2. 강력함 

- 파이썬의 기초는 C로 이루어져 있다. 그러므로 개발환경 IDLE에서 뼈대는 파이썬으로 나머지는 C로 해도 상관이 없다. 그래서 다른 언어에 비해 쉬우면서도 강력함을 지니고 있다. 

3. 개발 기간 단축 (이익창출의 극대화)

- 파이썬은 실행의 효율성보다는 개발 기간 단축에 초점을 둔 언어다.

4. 무료

- 저작권 등록이 되어 있지만 자유롭게 사용하고 배포할 수 있다. 상용으로 사용할 경우에도 마찬가지. 물론 소스도 공개되어 있다.

5. 플랫폼 독립적 언어

- 리눅스, 유닉스, 윈도우 95/98/NT/2000, 도스, OS/2, Mac OS, Amiga 등 대부분의 운영 체제에서 동작한다. 플랫폼에 독립적이며 컴파일하지 않고도 동작하기 때문에 사용하기 쉽다,




python 언어를 공부하려고 한다. 그런데... 머리말부터 엄청나구만... python 자랑이 1장을 넘어가네~!! 정말 배우기 쉽고 효율적인 언어인가 보다. 이렇게 칭찬 하는것을 보면!!

이렇게 좋은 언어를 만든 귀도 반 로섬님에게 감사를 드립니다. 그리고 이렇게 좋은 언어를 공부하게되서 참 좋다~!!



'Programming > Python' 카테고리의 다른 글

파이썬의 keyword  (0) 2012.11.21
파이썬 환경 변수 설정  (0) 2012.11.21
리눅스에서 스크립트 실행하기  (0) 2012.11.21
파이썬의 요소들  (0) 2012.11.21
파이썬의 특징  (0) 2012.11.21
Posted by scii
:
Posted by scii
:

...

Programming/Simulation 2012. 11. 19. 01:10 |

공부할 자료도 많고 내용도 정~~말 좋은 곳!!!

http://libcinder.org/docs/v0.8.3/pages.html

'Programming > Simulation' 카테고리의 다른 글

C++ 로 만들어진 시뮬레이션 소스코드  (0) 2012.05.16
Posted by scii
:
프로그램이란?

- 프로그램이란 데이터를 표현하고, 그렇게 표현된 데이터를 처리하는 것이다.

여기서 말하는 '데이터의 표현'은 '데이터의 저장'을 포함하는 개념이다. 그리고 이렇듯 '데이터의 저장'을 담당하는 것이 바로 자료구조이다.

자료구조의 분류


선형구조 - 리스트

   - 스택

   - 큐


비선형구조 - 트리

      - 그래프


파일구조 - 순차파일

   - 색인파일

   - 직접파일


단순구조 - 정수

   - 실수

   - 문자

   - 문자열

 

선형 자료구조는 그 이름이 의미하듯이 자료를 표현 및 저장하는 방식이 선형(Linear)이다. 선형이라는 단어의 뜻 그대로 '선의 형태'로 이해하면 된다.


즉, 선형 자료구조는 데이터를 선의 형태로 나란히 혹은 일렬로 저장하는 방식이다. 

반면, 비선형 자료구조는 그 이름이 의미하듯이 데이터를 나란히 저장하지 않는 구조이다.


Posted by scii
:

# 상속관계에 놓여있는 두 클래스 사이에서, 유도 클래스의 포인터 및 참조형 데이터를 기초 클래스의 포인터 및 참조형 데이터로 형 변환할 경우에는 dynamic_cast 연산자를 사용한다.


# 상속관계에 놓여있는 두 클래스 사이에서, 기초 클래스의 포인터 및 참조형 데이터를 유도 클래스의 포인터 및 참조형 데이터로 형 변환할 경우에는 static_cast 연산자를 사용한다.



하지만, 다음의 조건만 만족하면!! dynamic_cast 연산자도 기초 클래스의 포인터 및 참조형 데이터를 유도 클래스의 포인터 및 참조형으로의 형 변환을 허용한다.


"기초 클래스가 'Polymorphic Class' 이다."



Polymorphic 클래스란, 하나 이상의 가상함수를 지니는 클래스를 뜻한다. 그러니 상속관계에 놓여있는 두 클래스 사이에서 기초 클래스에 가상함수가 하나 이상 존재하면, dynamic_cast 연산자를 이용해서 기초 클래스의 포인터 및 참조형 데이터를 유도 클래스의 포인터 및 참조형 데이터로 변환이 가능하다.


 

13행: Simple 클래스가 Polymorphic 클래스이므로 Complex 클래스도 Polymorphic 클래스이다.

24행: 포인터 변수가 가리키는 것은 Complex 객체이다.

25행: 기초 클래스인 Simple이 Polymorphic 클래스이므로 dynamic_cast 연산자로 형 변환이 가능하다.


위의 main함수에서 dynamic_cast 연산이 성공한 이유는?


-> 포인터 변수 simPtr이 실제 가리키는 객체가 Complex 객체이기 때문이다. 즉, 포인터 변수 simPtr이 가리키는 객체를 Complex 형 포인터 변수 comPtr이 함께 가리켜도 문제되지 않기 때문에 성공한 것이다.



만약, 안정적이지 못한 형 변환을 시도할 경우, dynamic_cast는 NULL 포인터가 반환된다.



이렇듯 dynamic_cast는 안정적인 형 변환을 보장한다. 특히 컴파일 시간이 아닌 실행 시간에(프로그램이 실행중이 동안에) 안전성을 검사하도록 컴파일러가 바이너리 코드를 생성한다는 점에 주목할 필요가 있다. 

물론 이로 인해서 실행속도는 늦어지지만, 그만큼 안정적인 형 변환이 가능한 것이다. 그리고 이러한 특성 때문에 연산자의 이름이 dynamic으로 시작하는 것이다.


static_cast는 안전성을 보장하지 않는다. 컴파일러는 무조건 형 변환이 되도록 바이너리 코드를 생성하기 때문에, 그로 인한 실행의 결과는 전적으로 프로그래머가 책임져야 한다. 그래서 이러한 특정 때문에(실행중인 동안에 안전성 검사를 진행하지 않는 특성때문에) 연산자의 이름이 static으로 시작하는 것이다. 

물론, 실행속도는 빠르다. 실행 시간에 안전성 검사를 별도로 진행하지 않기 때문이다. 






bad_cast 예외


- 프로그래머가 정의하지 않아도 발생하는 예외.

bad_cast 예외는 dynamic_cast 연산자를 이용한 형 변환의 과정에서 발생할 수 있는 예외이다.




29행: 참조자 ref가 실제 참조하는 대상이 Simple 객체이기 때문에 Complex 참조형으로의 형 변환은 안전하지 못하다. 그리고 참조자를 대상으로는 NULL을 반환할 수 없기 때문에 이러한 상황에서는 bad_cast 예외가 발생한다.


※ 위 예제에서 보이듯이, 참조형을 대상으로 dynamic_cast 연산을 진행할 경우에는 bad_cast 예외가 발생할 수 있기 때문에 반드시 이에 대한 예외처리를 해야 한다.


Posted by scii
:

C++ 에서 C 스타일의 형 변환 연산자를 가리켜 '오래된 C 스타일 형 변환 연산자(Old C-style cast operator)' 라 부른다. 이렇듯 C 스타일의 형 변환 연산자는 C언어와의 호환성을 위해서 존재할 뿐, C++에서는 새로운 형 변화 연산자와 규칙을 제공하고 있다 .



40행: 문제가 없어 보이기도 하다. 하지만 기초 클래스의 포인터 형을 유도 클래스의 포인터 형으로 형 변환하는 것은  일반적인 경우의 형 변환이 아니다. 


이 예제의 문제점은 40행에 있다. 이것이 실수인지 아니면 일부러 이렇게 했는지 그 의도를 모르기 판단하기 힘들기 때문이다. 


그래서 이러하 유형으 논란과 문제점 때문에 C++ 에서는 다음과 같이 총 4개의 연산자를 추가로 제공하면서 용도에 맞는 형 변환 연산자의 사용을 유도하고 있다. 


static_cast

const_cast

dynamic_cast

reinterpret_cast


위의 형 변환 연산자들을 사용하면 프로그래머는 자신이 의도한 바를 명확히 표시할 수 있다. 따라서 컴파일러도 프로그래머의 실수를 지적해 줄 수 있고, 코드를 직접 작성하지 않은 프로그래머들도 코드를 직접 작성한 프로그래머의 실수여부를 판단할 수 있다. 







dynamic_cast : 상속관계에서의 안전한 형 변


dynamic_cast<T>(expr)

즉, <> 사이에 변환하고자 하는 자료형의 이름을 두되, 객체의 포인터 또는 참조형이 와야 하며, () 사이에는 변환의 대상이 와야 한다. 


※ dynamic_cast 연산자를 사용하겠다는 것은 다음의 의미가 담겨있다.

- 상속관계에 있는 유도 클래스의 포인터 및 참조형 데이터를 기초 클래스의 포인터 및 참조형 데이터로 형 변환하겠습니다.




※ 43행의 형 변환은 의도적으로라도 하면 안된다. 그러나 40행 같은 경우에는 경우에 따라서 필요할 것도 같다. 이러한 경우엔 어떻게 해야 하나?

- 이러한 형 변환을 의도적으로 진행한다는 것을 명시하기 위하 형 변환 연산자를 사용해야 한다.  그리고 그에 맞는 형 변환 연산자가 바로 static_cast 연산자이다.







static_cast : A타입에서 B타입으로


static_cast<T>(expn)

이것은, 유도 클래스의 포인터 및 참조형 데이터를 기초 클래스의 포인터 및 참조형 데이터로뿐만 아니라, 기초 클래스의 포인터 및 참조형 데이터도 유도 클래스의 포인터 및 참조형 데이터로 아무런 조건 없이 형 변환시켜 준다.

하지만 그데 대한 책임은 프로그래머에게 있다. 

 



43행 같은 경우에는 어떻게 해서든 정당화될 수 없는 상황이다. 따라서 이러한 형태로 문장을 구성하면 안된다. 하지만 static_cast는 dynamic_cast와 달리 이것 또한 허용한다. 


즉, static_cast 연산자는 dynamic_cast 연산자와 달리, 보다 많은 형 변환을 허용한다. 하지만 그에 따른 책임도 프로그래머가 져야 하기 때문에 신중하게 선택해야 한다. 

dynamic_cast 연산자를 사용할 수 있는 경우에는 dynamic_cast 연산자를 사용해서 안전성을 높여야 하며, 그 이외의 경우에는 정말 책임질 수 있는 상황에서만 제한적으로 static_cast 연산자를 사용해야 한다. 


※ 보다 빠른 static_cast 연산자

- dynamic_cast 연산자보다 static_cast 연산자를 사용했을 때 연산의 속도가 더 빠르다. 따라서 이러한 이유로 dynamic_cast 연산자를 사용해도 되는 상황에서 조차 static_cast 연산자를 사용하는 경우도 적지 않다.



static_cast 연산자는 기본 자료형 데이터간의 형 변환에도 사용이 된다. 




static_cast 연산자는 '기본 자료형 간의 형 변환'과 '클래스의 상속관계에서의 형 변환'만 허용을 하지만, C언어의 형 변환 연산자는 다음과 같이 말도 안되는 형 변환도 허영하기 때문에 여전히 static_cast 연산자의 사용은 의미를 갖는다.



위에서 보인 형 변환은 static_cast 연산자로는 불가능한 형 변환이다. 즉, 여전히 static_cast 연산자는 C언어의 형 변환 연산자보다 적은 것을 허용하고 있으며, 이로 인해서 static_cast 연산자를 보는 순간 다음과 같이 판단할 수 있다.


"상속관계에 있는 클래스의 포인터 및 참조형 데이터의 형 변환인가? 아니면 기본 자료형 데이터의 형 변환인가?"







const_cast : const의 성향을 삭제하라.


C++에서는 포인터와 참조자의 const 성향을 제거하는 형 변환을 목적으로 다음의 형 변환 연산자를 제공하고 있다.

const_cast<T>(expn)



참조자, 포인터의 const 성향을 제거하는 것이 가치를 떨어뜨릴 수 있다. 허나, 다른 이면에선 나름의 의미를 발견할 수 있다. 위의 예제처럼.


이렇듯 const_cast 형 변환 연산은, 함수의 인자전달 시 const 선언으로 인한 형의 불일치가 발생해서 인자의 전달이 불가능한 경우에 유용하게 사용이 된다. 


※ 위 예제에서 보이는 것과 같이 const_cast 연산자의 긍정적인 측면이 잘 드러나는 경우에만 제한적으로 사용해야 한다.

const_cast 연산자는 volatile(컴파일러의 최적화를 제한하는 목적) 의 성향을 제거하는데도 사용할 수 있다.







reinterpret_cast : 상관없는 자료형으로의 형 변환


reinterpret_cast 연산자는 전혀 상관이 없는 자료형으로의 형 변환에 사용이 되며, 기본적인 형태는 다음과 같다.

reinterpret_cast<T>(expn)


reinterpret_cast 연산자는 포인터를 대상으로 하는, 그리고 포인터와 관련이 있는 모든 유형의 형 변환을 허용한다.



7행: int 형 정수에 바이트 단위 접근을 위해서 int형 포인터를 char형 포인터로 형 변환하고 있다.

10행: 바이트 단위 데이터를 문자가 아닌 정수의 형태로 출력하기 위해서 char형 데이터를 int형으로 변환하고 있다.



reinterpret_cast 연산자는 포인터와 관련이 있는 모든 유형의 형 변환을 허용한다고 했다. 

따라서 다음과 같은 문장의 구성도 가능하다.



위 예제의 경우에 크게 의미를 부여하기 어렵지만, 특정 상황에서는 이러한 유형의 연산이 유용하게 사용되기도 하며, 이는 reinterpret_cast 연산자가 포인터와 관련이 있는 모든 유형의 형 변환을 허용한다는 사실을 뒷받침하기도 한다.


Posted by scii
:

new 연산자에 의해서 발생하는 예외


- new 연산에 의한 메모리 공간의 할당이 실패하면 bad_alloc이라는 예외가 발생한다. 

bad_alloc은 헤더파일 <new> 에 선언된 예외 클래스로써 메모리 공간의 할당이 실패했음을 알리는 의도로 정의되었다.



위 예제에서 보이듯이 프로그래머가 정의하지 않아도 발생하는 예외도 있다. 






모든 예외를 처리하는 catch 블록



마지막 catch 블록에 덧붙여지는 경우가 많은데, 대신 catch의 매개변수 선언에서 보이듯이, 발생한 예외와 관련해서 그 어떠한 정보도 전달받을 수 없으며, 전달된 예외의 종류도 구분이 불가능하다. 







예외 던지기


- catch 블록에 전달된 예외는 다시 던져질 수 있다. 

그리고 이로 인해서 하나의 예외가 둘 이상의 catch블록에 의해서 처리되게 할 수 잇다. 




예외처리는 가급적 간결한 구조를 띠는게 좋다. 따라서 정말로 필요한 상황이 아니라면, 굳이 예외를 다시 던지기 위해서 노력할 필요는 없다. 


Posted by scii
: