반응형

2018년 첫 회사를 퇴사하고 잠시 앱 개발에 관심을 가졌기에 이미 자주 사용한 C#을 활용할 겸 자마린을 공부했었다.

당시에도 이미 국내 자마린 카페가 서서히 죽어가고 있었는데, 그래도 온라인 강의도 있기는 있었으니 사용자는 있었다.

하지만 Fluter 의 등장으로 많은 자마린 개발자들이 옮기는 흔적들이 곳곳에 있었는데, 2024년에는 개발자들 사이에서는 사실상 죽은 프레임 워크 취급을 하는 것 같다.

Xamarin.Form 이 죽을 수 밖에 없는 이유에 대해서 생각을 해보면 그럴만한 것이 Xamarin.Form 이 동작하는 구조는 각 안드로이드, iOS, (그리고 Windows phone)를 감싼형태의 프레임워크였고, 하나의 소스코드를 사용한다고 하지만, 이것이 완전하지 않았다. 그리고 C#의 언어적으로 막는 이중 참조 구조가 필수적으로 필요한 구조가 되었기 때문에 2번씩 빌드해야 적용되는 경우도 발생했다.

따라서 신경써야 할 것이 많은 프레임 워크였고, 다른 경쟁 프레임 워크에 비해서 경쟁력이 떨어졌다(특히 Fluter). MS 에서 C# 언어 자체를 발전 시킨것처럼 지속적으로 발전을 시켰으면 다행이었겠지만, 그러지 않았다. 아마 구글링을 해도 2018년 기점으로 새롭게 올라운 글이 많이 않을 것이다.

아 물론 MS사 웹사이트를 빼고

반응형
반응형

개요

 어떠한 값에 대해서 약속한 값을 코드라고 표현 한다. 컴퓨터에서 문자 즉, 글자를 표현 할 경우 실제로 글자를 그리는 것이 아니라 이미 각 문자에 대한 그림 즉, 폰트에 해당하는 코드 값을 이미 약속해서 컴퓨터에 저장해 놓고 문장은 숫자 코드들을 보내서 대응 되는 문자를 표시하는 방식으로 동작한다.

이는 모르스 부호 같은 초기 신호 체계에서도 2가지 신호(연결됨과 끊어짐)를 가지고 알파벳으로 치환하여 메시지를 보내는 것과도 같다.

 영어에 익숙하다면, 코드로 축약하는 것을 인코딩 코드를 문자 등으로 해석하는 것을 디코딩의 의미와도 동일하다.

 문자열을 언급하기 전에 문자 코드에 대해서 언급하는 이유는 파이썬과 같은 고도화 된 프로그래밍 언어를 처음 접한 입문자들은 종종 글자를 그대로 사용되는 것으로 생각하는 사람이 있기 때문에 이러한 문자 code 에 대해서 다루게 되었다.

역사

초기 코드

전자 기기로 구성된 컴퓨터의 상용화는 미국에서 먼저 진행 되었다. 때문에 미국 기업(IBM) 입자에서 글자를 표현하기 위해 코드를 구성했을 때 7개의 bit(비트)로 구성이 가능했다. 이는 특수기호까지 포함한 코드였다.

ASCII 코드

컴퓨터와 각종 통신장비의 제작으로 각 제조사별로 코드를 만드는 것보다는 표준을 정의하여 사용하게 되었다. 이를 America Standard Code for Information Interchange(미국 정보 교환 표준 부호)로 각 글자머리를 따서 ASCII가 되었다. 이 ASCII는 7 bits로 구성이 되어 있다.

Byte의 탄생

 사실상 초기 문자 하나를 표현할 수 있는 단위로 비트와 구분하기 위해 사용되었다. 용어의 최초의 사용은 1956년 IBM에서 설계과정에서 표기한 것이 오늘날 정착 되었다고 한다.

오늘날은 1 Bytes 는 8 bits로 정착이 되었지만, 초기에는 7 bits, 8bits 등 여러개의 bit를 묶어서 혼용하여 사용하였다. 하지만 오늘날에도 종종 저수준 기기 제어시 신호가 7 bit로 된 회로를 볼 수 있다.

 정보 통신 분야에서는 bytes의 이러한 모호성을 배제하기 위해 정확하게 8 bits를 의미하는 옥텟(octet)이라는 단위를 사용한다.

UNICODE

컴퓨터의 사용이 전세계로 확산됨에 따라서 전세계의 모든 문자와 기호를 표현하기 위한 표준 작업이 진행이 되었고 이를 표현한 것이 UNICODE라 한다. UNICODE 포멧으로 UTF-8, UTF-16, UTF-32 등이 있다. 이중 현재 널리 사용되고 있는 것은 가변형인 UTF-8 이다.

UTF-8이 널리 사용되기 이전에는 각 회사별로 독자적인 국가 언어 코드를 만들어서 사용했었다. 예를 들어 일본어로 발매된 Windows 용 소프트웨어의 경우 따로 한글화를 지원하지 않는다면, 한글 Windows에서 사용할 수 없다.

유니코드가 정착화 되기 이전의 경우 영문으로 발매된 게임 소프트웨어를 동아시아 계열의 한자나 한글로 번역하는 것이 결코 쉽지 않음을 예상할 수 있다. MS사의 Windows 10 이전의 경우 국가별로 독자적인 방식으로 2 bytes로 영어와 혼용을 표기하였기 때문에 해당 운영체제 내에서 응용프로그램을 개발을 할 경우 다른 나라 언어로 번역을 지원할 때 지금보다 더 많은 어려움이 따랐었다. 과거(Windows 10 이전)에 윈도우즈에서 프로그래밍을 하신분은 EUC-KR 이라는 포멧을 들어 본적이 있을 것이다.

UTF-8

 인터넷 브라우저 등 가장 널리 사용되고 있는 가변형 유니코드이다. ASCII 코드에서는 7 bits만 사용하기 때문에 사용하지 않는 비트를 사용해서 하나의 문자를 인식하는 크기를 가변으로 지정한다. 아래와 같은 방식을 통해서 최대 4 bytes를 한문자로 인식을 하기로 규약되어 있다.

[0][x][x][x] [x][x][x][x] --> 아스키 코드

[1][1][0][x] [x][x][x][x], [1][0][x][x] [x][x][x][x] --> 2 bytes

[1][1][1][0] [x][x][x][x], [1][0][x][x] [x][x][x][x], [1][0][x][x] [x][x][x][x] --> 3 bytes

[1][1][1][1] [0][z][z][z], [1][0][z][z] [x][x][x][x], [1][0][x][x] [x][x][x][x], [1][0][x][x] [x][x][x][x] --> 4 bytes

4 bytes 에서 z로 표현된 영역은 서로게이트라는 UTF-16 에서 등장한 개념이다. 이는 글자를 BMP 라는 맵형태로 관리하는데, 충분하지 않기 때문에 보조값을 의미한다. 보조문자 영역으로도 불린다.

이 문자 코드로 인간이 사용하는 다양한 문자가 등록 되어 있고, 심지어 현재 인간이 사용하지 않는 문자도 포함되어 있다. 여담이지만, 코드중 가장 점유율이 높은 문자는 한자이다. 그 다음이 한글이다. 한글의 점유율이 높은 이유는 하나의 문자 즉, 조합된 문자들을 코드로 넣어놓았기 때문이다.

문자는 코드

 이로써 컴퓨터는 숫자 값 뿐만 아니라 문자를 저장 할 때 문자를 직접 저장하는 것이 아니라 미리 정의 되어 있는 코드로 저장을 한다. 때문에 우리가 지금 이 글도 눈으로 디코딩된 문자를 보고 있으나 실제로 저장되어 있는 것은 숫자로 된 코드이다. 그리고 이러한 코드 덕에 적은 용량으로 많은 정보를 저장하고 표기할 수 있다.

반응형

'Python > 배경이 있는 파이썬' 카테고리의 다른 글

리스트(list)  (0) 2024.04.27
문자열(str)  (1) 2024.04.27
숫자형(int, float)  (0) 2024.04.24
변수(variable)와 상수(constant)  (0) 2024.04.23
개발 환경 만들기  (0) 2024.04.22
반응형

개요

 자료형은 프로그램에서 값을 다루기 위해서 정의된 것이다. int와 float는 기본적으로 정의 되어 있는 기본 자료형이다. 내부에서는 숫자도 구분하고 문자열도 구분 한다. Python 에서는 대입하는 결과를 문법이 유추해서 변수의 자료형을 정의하여 값을 대입한다.

 이 때문에 코드를 작성했을 때 숫자 자료형을 명확히 구분하지 않는 것 같으나 내부적으로는 구분을 하고 있다. 정수형은 int, 실수형은 float로 구분하고 있다. 실수형이 표현 가능한 숫자의 범위가 더 크기 때문에 소수점이 포함된 수치와 정수형 수치를 연산하게 되면 python은 자동으로 실수형으로 자료형을 바꿔서 연산을 한다.

 int 형은 정수형만 표현하여 내부적으로 0과 1을 하나씩 카운트 하는 방식이라 비교적 정확한 연산이 가능하다. 반면 float  는 소수를 포함한 실수형이라 내부적으로 실수부 자리 표기를 분리해서 사용하기 땜누에 비교적 큰 범위의 숫자 표현이 가능하지만 연산 횟수가 많으면 오차가 발생한다. 이 이유는 진법에 의한 수학적인 이유 때문이다. float 형은 잦은 연산을 하지 않는 것이 좋고 유효숫자를 정해 놓는 것이 오차를 줄일 수 있다.

 float 형에서 많은 연산을 하면 왜 오차가 발생하는지는 기회가 되면 정리하도록 하자.

산수 연산자(Arithmetic Operators)

숫자형은 기본적인 사칙연산을 사용할 수 있다. 이외 기본적인 연산자에 대해서 살펴보자. 만약 C 나 다른 언어를 알고 있다면 Python 만의 독특한 연산자도 보일 것이다. 반대로 python 에서는 없어진 연산자도 있을 것이다.

+

더하기 연산자이다. 이 연산자를 기준으로 좌우의 값을 더한다. int 형 값과 float 형의 값을 연산하게 될 경우 최종적으로 float 값으로 반환이 된다.

1 + 1.1
# 2.1 (float)

1.1 + 1
# 2.1 (float)

1 + 1
# 2 (int)

*

 곱 연산자이다. 연산자의 좌우의 값을 곱한다. 왼쪽이나 오른쪽 값 중에 float 형이 있는 경우 결과는 float 형이 된다.

1 * 1
# 1

2 * 2
# 4

2 * 1.1
# 2.2

-

빼기 연산자이다. 연산자의 오른쪽에 있는 값을 왼쪽에 있는 값에서 뺀다. 마찬가지로 int와 float 값을 연산할 경우 최종 결과는 float 형이 된다.

3 - 1
# 2

1 - 3
# -2

1.1 - 2
# -0.9

/

나누기 연산자읻다. 일반적으로 타 프로그래밍 언어에서는 연산자의 좌우가 int 형일 경우 몫만 반환한다. 그러나 파이썬에서는 몫으로 딱 나눠떨어지지 않으면 float 형으로 변화해서 소수점으로 결과를 반환한다.

3 / 2
# 1.5

10 / 2
# 5

//

몫 연산, 일반적인 타 프로그래밍 언어에서 나누기 연산자를 사용한 결과와 같다. 나누었을 때 나머지가 있어도 무시하고 몫만 반환한다.

3 // 2
# 1

10 // 2
# 5

%

나머지 연산. 연산자의 오른쪽 값으로 나누었을 때 나머지만 반환한다. 이때 나머지는 int 형으로 반환한다. 프로그래밍에서 은근히 많이 쓰이는 연산이다.

3 % 2
# 1

10 % 2
# 0

**

제곱 연산자이다. 파이썬의 독특한 문법이다. 실제로는 여러번 곱하는 걸 코드상 간당하게 작성한 것이기 때문에 여러번 곱연산 한것과 성능차이는 크지 않다.

2 ** 3
# 8

할당 연산자(Assignment Operators)

축약된 형태의 연산자로 연산자의 왼쪽 값과 오른쪽 값을 연산한 결과를 다시 왼쪽 변수에 대입하라는 의미이다. 대입 연산자처럼 왼쪽은 변수가 되어야 한다.

+=

 왼쪽의 값에 오른쪽에 있는 값을 더한 뒤에 다시 왼쪽 변수에 대입을 한다. 만약 왼쪽이 int 형이고 오른쪽이 float 형인 경우 왼쪽도 float 형이 된다.

a = 1
a += 1
a
# a 는 2

a += 1.1
a
# a 는 3.1

*=

 연산자의 왼쪽 변수값에 오른쪽 값을 곱 연산한 결과를 왼쪽 변수에 대입을 한다.

a = 1
a *= 3
a
# a 는 3

a *= 3
a
# a 는 9

-=

연산자의 왼쪽 변수 값에 오른쪽 값을 빼기 연산한 결과를 왼쪽 변수에 대입을 한다.

a = 10
a -= 2
a
# 8

/=

연산자의 왼쪽 변수 값에서 오른쪽 값을 나누기 연산한 결과를 왼쪽 변수에 대입을 한다.

a = 10
a /= 2
a
# 5

a /= 2
a
# 2.5

//=

 연산자 왼쪽 변수 값에 오른쪽 값으로 나누기 연산한 몫을 왼쪽의 변수에 대입한다.

a = 5
a //= 2
a
# 2

%=

연산자의 왼쪽 변수 값에 오른쪽 값으로 나눈 나머지를 왼쪽 변수에 대입한다.

a = 5
a %= 2
a
# 1

**=

연산자의 왼쪽 변수값에 대한 오른쪽 값 만큼 제곱하여 왼쪽 변수에 대입한다.

a = 2
a **= 3
a
# 8

a **= 2
a
# 64

 

반응형

'Python > 배경이 있는 파이썬' 카테고리의 다른 글

문자열(str)  (1) 2024.04.27
문자 code  (0) 2024.04.24
변수(variable)와 상수(constant)  (0) 2024.04.23
개발 환경 만들기  (0) 2024.04.22
파이썬 3 설치  (0) 2024.04.22
반응형

개요

프로그램에서 가장 기본적이면서 중요한 개념이다.

흔히 프로그램에서 주 메모리를 사용한다는 것은 변수에 값이 담기거나 변수가 있을 때와 동일하다.

변수 정의

 파이썬에서는 미리 동작이 지정되어 있는 키워드인 예약어를 제외하고 문자로 시작하는 대부분의 단어를 변수명으로 사용할 수 있다. 그리고 변수명은 가장 맨앞의 문자가 숫자가 와서는 안된다. 대입 연산자를 기준으로 앞(좌항)의 문자들이 변수명으로 인식된다. 여기서 대입 연산자는 일반 수학에서 등호(=)를 대입 연산자라 한다.

 대부분의 다른 프로그래밍 언어들은 변수를 지정할 때 변수의 형(type) 또는 변수임을 알리는 키워드를 사용한다. 파이썬의 경우 변수를 정의 할 때 별도의 타입 키워드를 사용하지 않는다.

 파이썬(3부터)에서는 기본 스크립트 문자 인코딩을 UTF-8 코드를 지원하기 때문에 변수명에 영문 + 숫자 외의 다른 언어를 사용할 수 있다. 문자 인코딩에 대해서는 향후에 설명을 한다.

상수의 정의

상수는 코드상 직접 숫자나 문자열(문장)을 작성한 것을 상수로 취급한다.

수학시간의 방정식에서 항상 정해진 값을 상수라고 한다. 파이썬에서의 상수는 숫자나 문자열을 적은 것 자체를 상수로 취급한다. 이는 문자도 내부적으로는 숫자 코드로 작성되었기 때문이다.

True, False, None 과 같은 예약 키워드도 상수로 취급한다.

상수는 대입연사자의 좌항, 즉 왼쪽에 있을 수 없다. 이는 상수의 정의상 변하면 안되기 때문이다.

# 상수
1
3
44
"hello"
False
True
None

대입 연산자(=)

대입 연산자는 오른쪽에 있는 값을 왼쪽에 넣는 것을 의미한다.

앞에서도 잠시 언급했지만, 해당 연산자의 왼쪽에는 상수가 올 수 없다. 예를 들어 (1 = 2)라고 하면 1은 이제부터 2이다 라는 말인다. 논리적으로도 말이 안된다.

다른 연산자들보다 우선순위가 가장 낮아 가장 나중에 연산된다.

a = 1
# a는 1의 값을 갖게 됨

1 = 2
# 문법 에러

뭘보누 = 3
# 뭘보누 라는 변수는 3이라는 값을 갖게 됨

print(뭘보누)
# 3
반응형

'Python > 배경이 있는 파이썬' 카테고리의 다른 글

문자 code  (0) 2024.04.24
숫자형(int, float)  (0) 2024.04.24
개발 환경 만들기  (0) 2024.04.22
파이썬 3 설치  (0) 2024.04.22
배경이 있는 파이썬  (0) 2024.02.22
반응형

개요

 메모장과 python만 있어도 충분히 프로그램을 만들 수 있다(어셈블러는 지금도 이렇게 하기도 한다). 하지만, 프로그램 언어에 대해서 검사를 해주는 많은 개발 도구들이 있는데, 굳이 이를 사용하지 않고 개발할 이유가 없다. 특히 숙련된 프로그래머 조차도 오타로 인해서 버그나 에러가 발생하는 경우가 많다.때문에 이를 방지하기 위해서 문법 검사, 문법 하이라이트 및 디버그 도구를 사용할 수 있는 통합개발환경(IDE)를 사용하는 것을 권장한다.

 윈도우 환경에서 Python을 설치한 경우 기본적으로 제공되는 Python IDLE이 있고, 가장 강력한 PyCharm, 가벼우나 확장기능으로 범용으로 사용되는 Visual Studio Code 등 다양한 개발 도구들이 있다.

함수나 class 를 배우기 전까지는 IDLE(유닉스 환경에서는 터미널에서 python을 입력하여 보이는 화면을 사용하면 된다.) 를 사용하여 실습을 진행해도 충분하다. class 이후부터는 개발 툴을 사용하는 것을 권장하는데, 여기서는 가벼운 Visual Studio Code(줄여서 VS Code)를 사용할 것이다.

IDEL Shell

Windows OS에서는 IDEL Shell 이라는 별도의 간단한 인터프리터 환경을 제공한다. 물론 다른 유닉스 환경에서는 터미널에서 'python' 혹은 'python3' 명령어를 입력하여 진입이 가능하다. Windows 역시 IDEL Shell 없이 명령프롬프트 혹은 Power Shell을 통해서 진입이 가능하다.

문법에 대해서 바로 확인이 가능한 환경이기 때문에 소스코드를 작성하다가 간단한 문법이 생각 안날 경우 사용해도 괜찮다. 다만, 복잡한 함수와 클래스를 다루게 될 경우 오히려 불편하므로 초기 파이썬 입문할때 주로 많이 사용하게 된다.

VS Code 설치

웹 브라우저에 구글로 vs code를 검색하거나 code.visualstudio.com 을 접속하면 된다. 보통은 웹 브라우저가 사용자의 컴퓨터의 OS를 인식하여 알맞는 VS Code 버전을 보여준다. 설치 과정은 특별한 것은 없다.

VS Code Extension

VS Code는 기본적으로 확장 가능한 간단한 텍스트 편집기이다. 개발도구로 사용하기 위해서는 확장 기능을 설치하면 된다. 그리고 확장 기능들은 MS외에도 다양한 개발사 혹은 개인 개발자들이 만들었다. 만약 원하는 기능이 없는 경우 관련 문서를 참조하여 자신이 직접 만들 수 도 있다.

Python을 위한 기본 확장기능으로 python(microsoft), Pylance(microsoft), isort(microsoft) 를 최소한을 설치하면 된다. 이외 관련된 추가 기능은 어떤 기능인지 확인하고 나서 추가를 하면 된다.

그 외 디버깅을 위해서는 code runer(jun Han)을 추가로 설치하면 좋다. 디버깅 과정은 .py 파일로 프로그램을 만들었을 경우 에러를 찾는 용도로 용이하다.

반응형

'Python > 배경이 있는 파이썬' 카테고리의 다른 글

문자 code  (0) 2024.04.24
숫자형(int, float)  (0) 2024.04.24
변수(variable)와 상수(constant)  (0) 2024.04.23
파이썬 3 설치  (0) 2024.04.22
배경이 있는 파이썬  (0) 2024.02.22
반응형

개요

Windows 를 제외하면 대부분의 OS(주로 유닉스 계열로 리눅스로 불리는 것들과 OS X라 불리는 apple 에서 만든 OS들)는 기본적으로 Python3가 설치되어 있다. 이 때문에 입문시 초기 파이썬 설치는 Windows 에서만 진행하면 된다.

다운로드

 구글에서 python 으로 검색하거나 주소창에 python.org 를 직접 입력하여 접속을 해도 된다. 다운로드 받을 수 있는 버전은 시기에 따라서 차이가 있다. 현직 개발자가 아니거나 입문자라면 최신버전을 받아도 무난하다.

 python 3.10 부터 많은 부분이 변화 되었기 때문에 하위 호환이 안되는 경우가 있다. 대신에 이러한 변호로 인해 python이라는 언어가 더 급진적으로 발전하게 된다. C#의 경우 2년만에 2.0 에서 6.0 까지 버전업을 한 사례도 있다.

 

설치

다운로드 받은 파일을 실행하면 python을 설치할 수 있다. 처음 python을 설치한다면 이 때 하단의 Add python.exe to PATH 항목을 체크하고 나서 install Now 부분을 클릭하여 설치를 진행하면 된다.

Add python.exe to PATH의 의미

원도우즈 뿐만 아니라 대부분의 운영체제에서는 '환경변수'라는 것이 존재한다. 이 환경변수내에 파일 경로 혹은 폴더 경로가 설정되어 있다면, 해당 파일 경로가 아닌 곳에서도 프로그램을 실행할 수 있다.

즉, 우리가 앞으로 만드는 python 소스코드를 python.exe (혹은 python.out)을 통해서 실행되기 위해서는 환경변수에 추가 되어야 아래와 같이 간단하게 실행할 수 있다.

# ${} 은 보통 글자 내용에 해당하는 특정한 값을 의미함
python.exe ${python source code file path}

만약 환경변수에 등록을 하지 않았다면 다음과 같이 실행을 해야한다.

c:\users\${user}\AppData\Local\Programs\Python\Python311\python.exe ${python source code file path}

설치 확인

버전 확인

명령 프롬프트 혹은 Power shell 에서 다음 명령어를 실행하면 된다. 실행 결과로 버전 정보가 나오면 정상적으로 설치가 된 것이다. 정상적으로 확인 되었다면 실습 준비가ㄷ된 것이다.

 

python --version

명령 프롬프트 열기

윈도우 키를 누르고 cmd를 입력하면 '명령 프롬프트'가 보인다. 이를 클릭하여 실행하면 된다.

power shell 열기

윈도우 키를 누르고 power shell을 입력하면 power shell 이 보인다. 이를 클릭하여 실행하면 된다.

반응형

'Python > 배경이 있는 파이썬' 카테고리의 다른 글

문자 code  (0) 2024.04.24
숫자형(int, float)  (0) 2024.04.24
변수(variable)와 상수(constant)  (0) 2024.04.23
개발 환경 만들기  (0) 2024.04.22
배경이 있는 파이썬  (0) 2024.02.22
반응형

작성 계기

요즘에는 회사에서 신입이나 인턴을 받게 되면 대부분 파이썬 언어를 써본적이 있다. 그래서 파이썬을 통해서 간단한 작업을 요청을 해도 너무나 오래 걸리는 경우를 많이 겪었다. 심지어 석사과정을 마쳤고 석사과정 중 논문을 위해 파이썬을 썻던 사람임에도 불구하고 이런 경우가 종종 있다. 왜 이런일이 생기는가 생각해보게 되었다.

 그 결과 파이썬 입문서는 이미 많이 있는데, 배부분 파이썬 문법과 언어에만 초점이 맞춰져 있다 보니 배경을 모르는 상태에서 암기를 한 결과가 아닐까 싶다. 그리고 문법에 초점을 맞추다 보니 배경 설명이 생략이 되고 문법위주로 설명하다 보니 필요성에 대해서 이해를 못 한 것이 아닐까 싶다. 물론 프로그래머 같은 전문가가 되고자 할 경우에는 작은 주요내용을 봐두는 것이 향후 실무에 도움이 된다는 것에 대해서는 동의한다.

 하지만 프로그래밍 언어들의 문법들은 어느날 갑자기 생겼다기 보다는 컴퓨터라는 기계가 발명된 이래 수 많은 엔지니어들의 경험이라는 배경속에서 프로그래밍 언어가 만들어져 왔고 기존 언어에서 새로운 문법이 추가되기 도 한다. 특히나 파이썬이 발전하는 속도도 과거에 비해서 많이 빨라지고 있다.

 배경 없이 프로그래밍 언어만 공부한다면 입문자에게는 단순히 암기해서 사용하는 언어에 불과하다. 이러한 암기는 잊기도 쉽고 이해하기도 어렵다. 때문에 가능하면 이러한 배경에 대해서 기록 하려고 했다.

그리고 입문자라면 가져야 하는 자세가 입문을 순차적으로 보고 난 다음 다시 정의 된 내용을 확인하는 것을 강하게 권장한다. 자신이 이해를 하기 위해서 다른 서적을 이용해도 상관이 없다.

여기서 입문, 초금, 중급 이렇게 3단계로 나누어서 서술할 계획이다. 이중 초급만 되도 어느정도 간단한 스크립트 형태의 프로그램은 충분히 작성할 수 있을 것이다(그리고 이건 필자의 기준이기도 하다). 고급이 없는 이유는 고급정도라면 이런 문서를 볼 필요가 없고, 시시각각 프로그래밍 언어에 대해서 결정하는 포럼에서 활동해야 하기 때문이다. 아니면 파이썬 자체를 발전시키기 위해 기여할 것이다. 그리고 그 조건으로 아마 C 도 능통해야 할 것이다. 이는 파이썬이 C로 만들어졌기 때문이다.

이 글을 쓴 시점에는 이미 개인 Notion으로 초급 중반까지 작성하고 옮겨 적으면서 수정하는 것이다.

목차

입문

  1. 파이썬 설치
  2. 개발 환경 만들기
  3. 변수(variable)와 상수(constant)
  4. 숫자형(int, float)
  5. 문자 code
  6. 문자열(str)
  7. 리스트(list)
  8. 튜플(Tuple)
  9. 딕셔너리(dict)
  10. 불리언(boolean)
  11. 코드 블록, 조건문(if)
  12. 반복문(while, for)
  13. 함수(function)
  14. 모듈(module)
  15. 클래스(class) 입문
  16. 클래스로 보는 자료형
  17. 파일시스템

초급

  1. 내장함수
  2. csv 파일 응용
  3. 예외처리
  4. 클래스 초급
  5. 정규표현식
  6. 간단한 스크립트 만들기
  7. yield와 generater
  8. 자료형 관리
  9. 주피터 노트북
반응형

'Python > 배경이 있는 파이썬' 카테고리의 다른 글

문자 code  (0) 2024.04.24
숫자형(int, float)  (0) 2024.04.24
변수(variable)와 상수(constant)  (0) 2024.04.23
개발 환경 만들기  (0) 2024.04.22
파이썬 3 설치  (0) 2024.04.22
반응형

과거에는 내용 정리할 수 있는 수단이 블로그 등 별로 없었지만 one note, notion 등 다양한 기록과 정리 수단이 생기면서 부터 블로그를 잘 사용하지 않게 된 것 같다. 특히나 자체 제작한 블로그가 아니라 기존 서비스를 사용하다 보니 기존에 기록한 내용들을 다시 검색하는 것이 어려운 것도 한 몫 한 것 같다.

문제는 지식과 경력이 누적 되고 나서 남에게 내가 가지고 있는 수준을 어필 할 수 있는 수단은 결국 블로그라는 것이다. 카카오 같은 국내에서 영향력이 큰 기업에서 신입 개발자 채용을 할 경우 블로그도 하나의 참조 자료로 한다고 공개적으로 발언이 되었으니 블로그를 관리하는 신입 개발자가 앞으로도 많이 늘어나리라 본다.

물론 신입 개발자가 아닌 경력 개발자는 부담이 덜하지만 분야에 따라서 필요하다 그리고 보통 서버 분야 백엔드 개발자들 중 인지도 있는 개발자의 경우 유튜브나 블로그 등 하나 정도는 꾸준히 운영하고 있는 경우가 많다.

다만, 2022년경 부터인가? 대 개발자 전성 시대였다. 이때 개발자 지망하거나 전향을 희망하는 사람들이 많아지고 동시에 개발 관련된 블로그가 많이 생긴 듯하다. 덕분에 가끔 기억이 안나서 검색을 하게 될 경우 잘 못 이해하고 기록되어 있는 블로그를 종종 자주 보게 된다.

예를 들어 프로그램내에서 예외 처리가 되는 원리는 예외가 발생하면 해당 에러 클래스를 catch 해주는 코드 블럭이 나올때까지 상위 코드 블럭으로 강제로 벗어나면서 최종적으로 더 이상 벗어날 코드 블럭이 없다면, OS 혹은 가상머신 단에서 강제로 프로그램을 종료 시킨다. 이것이 흔히 말하는 "프로그램이 죽는다"라는 표현한다. 이는 시스템에 문제가 생기기 전에 해당 프로그램을 강제로 종료 시키는 최악의 상황에서는 최선 방법이기 때문이다.

이전 1년 정도 지난 신입이 예외 처리를 이상하게 해서 어떻게 동작하는지를 물어보니 코드 블럭을 벗어나는 것에 대해서 잘 모르더라...
그리고 그렇게 설계한 이유도 설명하지 못 했다. 그래서 추궁 아닌 추궁을 해보자 자신이 검색해서 참조한 블로그에 그렇게 적혀 있다더라 하고 말한다.

물론 블로그 작성자도 억울 할 수 있다. 파이썬으로 프로그래밍을 시작하는 경우 아무래도 쉽게 설명하는 것에 대해 집중 되어 있다 보니 자세한 설명이 부족한 경우가 많고 또 설명이 있다 하더라도 쉽게 결과를 볼 수 있는 언어이다 보니 자세히 안보고 지나치는 경우들이 있는 것 같다.

아무튼 다시 원점으로 돌아와서 나는 그 동안 하나의 기록 수단으로 생각해왔다. 신입 시절 열심히 블로그에 기록하다가 기록 수단이 바뀌고 나서 한동안 작성을 하지 않았는 데, 돌고 돌아서 민감한 정보를 제외하고 다시 블로그에 정리해야 겠다는 생각이 든다.

반응형
반응형

Computer Vision 이미지 자료형

배경

Python2 시절까지만 해도 성능을 중요시했던 컴퓨터 비젼 분야는 오랫동안 C/C++ 계열이 메인이었는데, 지금은 컴퓨터 비젼을 한다면 Python도 필수로 해야 하는 시대가 되었다. 이건 딥러닝 파급의 효과가 가장 컸다. 다만, 최근에 내가 놓친 부분을 알기위해서 빠른 지식 습득 수단으로 강의를 듣고 있는데, 강의에서도 그렇고 회사에서 기술이전으로 로봇공학쪽 박사 포닥중인 강의 하시는 분도 그렇고 그냥 다르니 주의해라는 듯이 설명해서 내 입장에서는 난감했다. 사실 본래 자료형이 만들어진 목적이 있기 때문이다.

그래서 끄적여 본다.

Python 이미지 처리 모듈

기본적으로 이미지의 첫 출발은 이미지를 메모리에 올리는 것 부터 시작이 된다. Python 에서는 대표적인 모듈이 3가지가 존재한다. PIL, Scikit Image, OpenCV. 이중에서 현재는 OpenCV를 많이 사용하고 있다.다만, 대부분 이 라이브러리들은 이미지 파일을 로드하게 되면 numpy 모듈의 array로 로드를 하는 특징이 있다.

PIL

Python Image Library 로 초기 Python 영상처리 많이 사용했다. 필자도 OpenCV 보다 PIL 을 주로 썼었는데, 이는 OpenCV의 경우 BGR로 로드하는 반면 이 라이브러리는 RGB로 로드가 되었기 때문에 이런 변환 코드를 덜짜기 위해서 썼었다. 파이썬은 성능보다 생산성을 추구하였으니 말이다. 문제는 PIL 이 현재는 유지보수가 잘 안되고 있다. 지금의 PIL는 fork 된 프로젝트 중에서 호환만 경우 유지되고 있는 수준이다.

Scikit Image

Scipy 기반으로 제공되는 라이브러리이다. Scipy는 SCI 이름에서 알 수 있듯이 연구 용도로 많이 사용한다. 경우에 따라 Scipy 는 상당히 높은 수준의 연산을 도와주는 모듈들이 있다. 그러나 필자를 포함해서 널리 사용되지는 않는 것 같다.

OpenCV

인텔에서 개발하다가 오픈 소스로 전환된 라이브러리다. 이미지 로드시 BGR로 메모리에 올라가는 것을 특징으로 갖는데 이는 초기에 성능을 위해서 인텔 CPU가 리틀엔디안 방식으로 데이터를 처리하기 때문에 일부러 뒤집은 탓이다. OpenCV1 시절은 C, OpenCV2 시절은 C/C++, OpenCV3 에서는 Java/Python 이런식으로 확장되어 왔다. Mat 이라는 자체 이미지 자료구조를 가지고 있었는데, Python 에서는 numpy.array 자료구조를 사용한다.

개인적으로 numpy.array로 로드 되는 것을 처음 알았을 때는 기존 Mat 보다 이미지 정보가 적어서 불편하다 생각했지만, 수학적인 연산도 자연스럽게 사용할 수 있었고 그렇지 않아도 느린 버전업이 빨라 졌다. 즉 버그 픽스가 빨라졌다는 것이다. numpy 경우 Matlab 처럼 멀티 스레드로 메트릭스 연산을 하기 때문에 C로 단일 스레드로 연산한것 보다 빠르다.

numpy.array

numpy 모듈은 태생이 수학자들이 만든 C로 만들어진 모듈들이다. Python 이 런타임이 느린 언어이지만, 이 모듈로 간단히 몇 줄로 크게 뒤지지 않는 병렬 계산이 가능하다. 게다가 구조도 직관적이기도 하다.

다만 문제는 태생이 메트릭스 연산을 위해서 탄생한 구조이다보니 나중에 컴퓨터 비젼관련 라이브러리에서 다룰때 종종 헷깔리게 된다. 이미지에서의 크기의 개념은 (가로 x 세로)이나 메트릭스에서는 (행, 열) 개념이기 때문이다. 이미지의 값을 numpy에 넣게되면 (세로, 가로) 느낌으로 사용하게 된다.

이때문에 초보자들은 여기서 많이 틀린다. 문제는 내가 모든 강의를 들은 것은 아니지만 대부분 주의 하고 외우세요 하면서 가르치시더라. 태생이 원래 수학적 접근의 차이라 다른것 뿐이지만 말이다. 사실 각 모듈의 태생의 목적을 알면 헷깔릴 일이 별로 없다. 깜박해도 금방 생각날테니 말이다.

그렇다 이 말 하려고 어그로 끌었다. "모듈의 태생을 알면 이유를 알 수 있다"

이제 배경을 알았으니 array shape을 받을 때 rows, cols, dim = np.array().shape 형태로 사용하는 것이 좀 더 덜 헷깔릴 것이다. 작지만 유용한 팁이라 할 수 있다.

덤 OpenCV 가 cv2 인 이유

덤으로 이글을 쓰는 시기에 OpenCV4가 사용되고 있다. 그럼에도 Python 에서는 cv2 라는 모듈 네임을 사용하고 있다. 대체 왜 그럴까? cv2 부터 C++이 도입되면서 OpenCV 코드들이 객체화가 되었다. 그리고 Mat 이라는 class 를 사용했었는데, Python 에서는 Mat 대신 numpy를 사용하지만, 둘이 사용법이 비슷하고 굳이 cv3 처럼 올릴 필요가 없다. 객체지향으로 개발하는 이유가 원래 이런 것들을 유지하려고 했던것이 아니었겠는가? 그리고 성능을 위해서 알고리즘은 여전히 C++로 구현되고 Java를 포함해서 Python에 wrapper 된 경우도 많다. 그리고 CV2라는 네임스페이스는 C++이 쓰는 것 아니었는가?

반응형
반응형

개요

ubuntu 20.04 LTS 에서 OpenCV C++ 기본 빌드 환경에 대해서 샘플로 작성한 포스트. 해당 샘플은 카메라로 받은 이미지를 OpenCV imshow() 를 통해서 보여준다.

기본 틀이기 때문에 처음에는 복붙으로 확인이후 자신이 개발하고자 하는 것에 맞춰서 수정해 나가면 된다. 물론 makefile 기반이다.

굳이 camera 코드를 샘플로 작성한 이유는 임베디드 환경에서 카메라 다루게 되는 경우 성능상 C++을 써야 하기 때문이다. 특별한 이유가 없다면 가능하면 그냥 opencv-python 을 사용하자(하지만 제품을 만들려면 저사양 고성능을 뽑아야 하느라 삽질하겠지).

makefile sample

makefile 에 대해서 배운적이 없다면 복붙전에 읽어보고 사용하는 것이 좋다. 파일명은 반드시 makefile로 지어야 한다.  make clean 을 할 경우 규칙에 의해서 빌드 결과와 실행 파일이 삭제 되도록 되어 있다.

# Makefile
CPPFLAGS = -std=c++14 $(shell pkg-config --cflags opencv4)
LDLIBS = $(shell pkg-config --libs opencv4)
# source file name
OBJS = webcam_sample.o
# result execute file name
TARGET = test

all: $(TARGET)

$(TARGET): $(OBJS)
	g++ $(CPPFLAGS) -o $@ $< $(LDLIBS)

clean:
	rm -f *.o
	rm -f $(TARGET)

camera sample code

널리 알려져 있는 camera sample code에서 실행시 카메라 번호를 수정할 수 있도록 약간만 수정한 소스코드이다. 

// webcam_sample.cc
#include <opencv4/opencv2/videoio.hpp>
#include <opencv4/opencv2/highgui.hpp>
#include <iostream>
#include <string>

bool is_number(const std::string& s)
{
// 
    return !s.empty() && std::find_if(s.begin(), 
        s.end(), [](unsigned char c) { return !std::isdigit(c); }) == s.end();
}

int main(int argc, char** argv)
{
    int cam_num = 0;
    if (2 == argc) {
        auto camNumParam = std::string(argc[1]);
        if (is_number(camNumParam)) {
            cam_num = std::atoi(camNumParam);
        }
    }

    cv::VideoCapture cap(cam_num);
    if(!cap.isOpened()) {
        std::cout << "did not open camera" << std::endl;
        return -1;
    }
    cv::Mat frame;
    while(1)
    {
        cap >> frame;
        cv::imshow("Camera Capture", frame);
        if (cv::waitKey(30) >= 0)
        {
            break;
        }
    }
    return 0;
}

카메라 장치 다룰때 주의사항

우분투는 먼저 인식한 카메라 장치 순으로 번호를 부여한다. 일반적으로 웹에 돌아다니는 예제는 0번으로 되어 있지만, 노트북같은 환경에서 usb 카메라를 붙이면, 노트북 기본 카메라가 0번, usb web cam은 1번으로 잡히게 된다.

또한 다른 프로그램에서 카메라를 점유(사용)하고 있을 경우에는 다른 프로그램에서 접근을 할 수 없다.

반응형

'Computer Vision' 카테고리의 다른 글

Computer Vision 이미지 자료형  (0) 2024.01.18
Ubuntu 20.04 OpenCV 4.x + cuDNN 설치  (0) 2023.04.26

+ Recent posts