MINERVA/Python 2022. 5. 27. 14:41
반응형

0. 정의
순서(번호)를 붙여 나열되어 있는 객체를 의미. 여기서 순서(번호)를 인덱스(index)라고함
각각의 요소(element) 또는 데이터(data)들이 연속적으로 이어진 자료형을 의미하며, 각, 데이터(data)에는 순서(번호)를 붙여 나열함

 

다시 정리하면, 
시퀀스 자료형으로 만든 객체를 시퀀스 객체라고 하며 시퀀스 객체 안에 들어있는 값들을 요소라고 부릅니다.

1. 시퀀스 자료형 종류
list, tuple, 문자열, range, bytes, bytearray

2. 시퀀스 자료형 특성
1) 인덱싱 (indexing)
- 인덱스를 통해 값에 접근가능(인덱스는 0부터 시작)

2) 슬라이싱 (slicing)
- 일부분의 값을 얻을 수 있음, 원본에는 영향미치지 않음

3) 연결(concatenating)
- '+' 연산자를 통해서 두 객체를 연결해서, 새로운 시퀀스 객체를 생성

4) 반복
- '*' 연산자를 통해서 객체를 원하는 만큼 반복 가능

5) 크기
- len(객체명)을 통해 객체안에 있는 값(element)의 갯수를 확인

 

3. 예제

인덱싱(indexing) 예제
인덱싱(indexing) 결과
슬라이싱(slicing) 예제
슬라이싱(slicing) 결과
연결(concatenating) 예제
연결(concatenating) 결과
반복(interating) 예제
반복(interating) 결과

반응형
posted by choiwonwoo
:
MINERVA/C_CPP 2022. 5. 24. 16:28
반응형

최근 트랜드는 데이타 처리 관련해서는 Python을 사용해서 작업하는 경우가 많지만, 최근 프로젝트에서 C++로 excel 파일을 사용해야 하는 경우가 있어, 몇가지 라이브러리를 테스트 진행후 개인적으로 강추하는 라이브리를 공유합니다.

 

https://www.libxl.com/download.html

 

LibXL download

LibXL for Windows 4.0.3   i386 x64 Download Date: 2022-02-01 Size: 29 679 292 bytes MD5: B42C5F0D63DF834066CA17D393468AFC LibXL for Linux 4.0.3   i386 x64 armhf Download Date: 2022-02-01 Size: 25 354 244 bytes MD5: F08C6EDB8B912A9431F271DEC3E6FD80 Li

www.libxl.com

해당 라이브러리에 익숙해지는 방법은 아래의 예제 파일을 보시면 금방입니다.

그리고, 각 API에 대한 메뉴얼은 index.html 파일을 오픈하여보시면 자세하게 나와있습니다.

index.html

개인적으로 근래 접한 오픈소스중에 가장 완성도가 높은것으로 보입니다. 각 platform , 32/64bits, 컴파일러 버젼별 지원이 어지간한 상업용 수준입니다.

 

감사합니다.

반응형
posted by choiwonwoo
:
MINERVA/C_CPP 2022. 5. 23. 19:22
반응형

[기본 이론]

# 기본 개념
- 컴파일러는 클래스의 객체를 생성시 자동으로 생성자, 소멸자, 복사생성자, 복사 대입 연사자를 생성함

# (기본) 생성자란?
- 클래스(class)의 인스턴스(instance) or 객체(object)가 생성되는 시점에 자동으로 호출되는 특수한 멤버함수이다.
이 생성자 함수에서는 클래스의 멤버 변수 초기화를 담당함

 

# 소멸자란?
- 객체(object) 소멸시 자동으로 호출되는 함수

- 객체 메모리를 정리함

# 복사 생성자란?
- 기존에 있던 객체를 복사해서, 객체를 생성할 때 호출되는 생성자
- 자신과 같은 클래스 타입의 다른 객체에 대한 참조(reference)를 인수로 전달받아, 그 참조를 가지고 자신을 초기화

# 복사 대입 연산자라?
- 같은 타입의 객체를 이미 생성되어 있는 객체에 값을 복사할 때 호출되는 함수

# 깊은 복사(deep copy)와 얕은 복사 (shallow copy)
- 객체를 생성하고 초기화시킬 때 멤버 변수를 어떻게 초기화하느냐에 따라 깊은 복사가  될 수 있고, 얕은 복사가 될 수 있습니다.

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

[실무적인 정리]

지금까지는 C++을 배우면서 나오는 생성자에 관련된 이론을 정리하였습니다.
그런데, 저의 경우에 초심자일때는 어 머지(?)하는 부분이 있었습니다.

 

자 다시 간단히 정리하겠습니다.
복사 생성이란? 직관적으로 기존에 있던 것(객체)을 복사해서 생성하는 것이라고 정리하겠습니다.

왜? 계속 생성해서 사용하는 것보다, 이미 있는 것을 재사용하면 성능및 효율성이 좋다.

 

[예제1]
아래 코드를 보면, 복사생성자,대입연산자가 없는데??? 기능이 동작한다.

[예제1]
[예제1 결과]

그 이유는? 컴파일러가 암묵적으로 아래의 코드에 복사생성자와 대입연산자를 생성하여 실행되기 때문입니다.
이것을 디폴트 복사생성자, 디폴트 대입연산자라고 합니다.

 

이렇게 컴파일러가 다해주면, 객체 복사관련하여 많은 시간을 왜 배워야 하는가??? 그것은 컴파일러가 모든것 또는 완벽

하게 개발자의 요구를 충족시켜 주지 못하기 때문입니다.(개인적인 생각)

 

[예제2]

자 이제 공부를 해야 하는 이유를 알아 보겠습니다.

[예제2]
[예제2 결과]

예제1과 예제2를 비교하여 보면, 차이점은 reference 멤버변수만 추가되었고, 나머지는 동일합니다.

하지만 실행을 하여 보면, 정상적으로 동작하다가 위와 같은 crash error가 발생하는 것을 확인할수 있습니다.

 

그 이유는 객체 복사와 대입 연사자를 통해서, reference를 새로운 객체 B와 C에 정상적으로 전달되었지만, A, B, C 객체의 소멸자중 하나라도 호출되면, 남은 두개의 객체는 reference를 잃게되기 때문입니다.

 

기술적으로 이러한 문제점은 얕은 복사(shallow copy)의 문제점이라고 합니다.

 

여기서 얕은 복사(shallow copy)에 대한 정리를 하면, "객체 복사시 변수의 메모리 reference(주소)만 복사"하는 것을 의미합니다. ( call by value, call by reference 개념 필요) 여기서 중요점은 컴파일러가 자동지원(생성)하는 복사생성자와 대입연산자는 얕은 복사(shallow copy)만 지원한다. 그리고, 이 기능은 제한 점이 있다는 것이다.

 

이러한 문제점을 해결하기 위해서, 개발자는 생성자에 대해서 많은 시간을 투자하게 됩니다.

그리고, 이 얕은 복사(shallow copy)의 해결책은 깊은 복사(deep copy)입니다.

 

[예제3]

[예제3]
[예제3 결과]

예제3 코드를 보면, 복사 생성자와 대입 연산자가 추가된것을 볼수있습니다. 그리고, 실행결과는 예제2와 다르게 에러가 발생하지 않습니다.  그리고, 그 해결책은 객체복사 reference 변수의 메모리를 새로 할당해주는 것을 깊은 복사(deep copy)라고 합니다. (참고로, 이렇게 하면 메모리와 성능은 떨어집니다.)

 

[개인적 생각]

솔직히 신입일때 좀 허무했던것 같습니다. 결국에는 개인적으로 c++ 오버로딩과 메모리 관리로 해결이 된 것으로 생각되었습니다. 하지만, 많은 이론을 공부했습니다. (여러종류의 생성자, 깊은복사/얕은 복사등... )

 

 

 

 

 

 

 

 

 

 

반응형
posted by choiwonwoo
:
MINERVA/Python 2022. 5. 23. 16:39
반응형

z파이썬은 모든 것이 Object이다. 그리고, Object를 비교는 2가지 관점으로 고려된다.

 

1) 같은 Object인가?(같은 인스턴스인가?)  --> 비교연산자: is

2) Object value 값이 같은가? --> 비교연산자 ==

 

예제)

[예제1]
[결과1]

# 예제1 과 결과1를 보면, "is" 비교 연산자는 object의 id, 즉, memory address가 같으면 True를 반환함을 확인

 

[예지2]
[결과2]

# 예제2 과 결과2를 보면, "==" 비교 연산자는 object가 가지고 있는 실제 value를 비교하여 같으면 True를 반환

# 여기서 전제조건은 같은 Data typs이여야 함

반응형
posted by choiwonwoo
:
MINERVA/Python 2022. 5. 20. 19:02
반응형

저의 경우에는 C/C++, Java 개발 언어를 선경험하고, Python을 접하게 되었을때 객체 종류(mutable,immutable)에 대한 부분은 많이 낯설게 느껴지는 부분이었습니다. 그래서, 초기에 이 부분에 많은 시간을 할애하여 공부하였습니다.

 

저는 아래의 두줄에 대한 내용을 간단히 정리하고자 합니다.

"파이썬의 모든것은 객체(object) 이고, 객체는 두가지(mutable vs immutable)로 분류된다.
또한, 객체는 나타내는 변수는 값(value)에 대한 참조(reference)이다."

참고로, 객체는 class라고 기능과 다양한 데이터의 조합이고, 이 클래스의 인스턴스(instance)를 객체(object)라고 합니다.
인스턴스란 class가 메모리의 영역에 할당되었다는 것을 의미함

 

1. 기본적인 접근

위의 예제와 실행결과를 간단히 보면, 변수 y에 변수 x값을 넣고, 변수 x의 값을 변경하였습니다. 이때, 마다 객체의 주소를 확인해보면, 매번 다른것을 확인 할수 있습니다. 이것은 매번 객체가 생성되었다는 것을 의미합니다.

 

개인들마다 결과를 보고 당연(?)하게 또는 이건 머지(?)하고 느끼는 분이 있을 듯합니다.
아마, 당연하게 느끼시는 분들은 x 와 y가 메모리의 다른 영역에 객체가 생성다고 느끼시는 분들이고, 의문을 가지시는 분들은 메모리 레퍼런스(reference) 참조를 왜 하지 않지? 라고 생각하시는 분들일 것입니다.

제가 여기서 중요하게 생각해봐야 할 부분은 객체의 ID, 주소가 계속 바뀌고, 즉, 메모리에 새로운 객체가  매번 생성된다는 의미 입니다. 이것은 저와 같은 c/c++ 개발자에게 객체 생성은 많은 비용(cost)이 든다고 배운 사람에게는 매우 금기시 되어 있는 부분입니다.   

 

참조: Python은 GC(가비지 컬렉터)가 주기적으로 객체를 해제합니다.

 

2. mutable(가변) vs immuable(불가변) 객체
개인적으로 성능과 효율성 이슈로 Python 창조자는 객체를 아래의 기준으로 2가지로 분류하였다고 생각합니다.

 

# mutable(가변) 객체: 값 변경시 객체 ID(즉, 메모리 주소)가 변경되지 않는, 즉 생성된 처음 위치에서 변경가능
# immuable(불가변) 객체: 값 변경시에 새로운 객체를 생성, 즉 새로운 객체 ID(즉, 메모리 주소)를 가지게 하였습니다.

 

객체분류: https://choiwonwoo.tistory.com/entry/Python-Data-Types-Object-Types?category=969492 

 

[Python] Data Types, Object Types

1.기본적 오브젝트 분류 2. 객체 종류 - 파이썬의 모든 변수는 객체의 인스턴스다. 그리고, 객체는 2종류로 구분(1. Mutable, 2. Immutable)된다. - 객체가 인스턴스화될 때마다 고유한 개체 ID가

choiwonwoo.tistory.com

 

예제를 보면, mutable 객체인 listX와 immutable 객체를 생성하고 값을 추가하는 같은 작업을 하지만, 메모리를 관리하는 부분이 확실하게 다름을 확인할수 있습니다.

 

3. 결론

간단하게 파이썬에서 메모리 관점을 가지고 변수를 생성 및 변경시 내부적으로 어떻게 동작하는 방법에 대해서 정리하였습니다. 이 부분은 심각하게 생각하지 않고 작업은 가능하지만, 실질적으로 프로젝트 결과물에 대한 성능평가시 큰 차이를 보이게 할 수 있습니다.  

반응형
posted by choiwonwoo
:
MINERVA/Python 2022. 5. 12. 14:38
반응형

1.기본적 오브젝트 분류

출처: https://www.geeksforgeeks.org/

 

2. 객체 종류

- 파이썬의 모든 변수는 객체의 인스턴스다. 그리고, 객체는 2종류로 구분(1. Mutable, 2. Immutable)된다.

- 객체가 인스턴스화될 때마다 고유한 개체 ID가 할당되고, 객체 유형은 런타임에 정의되며 이후에는 변경할 수 없습니다. 그러나 변경 가능한(mutable) 객체인 경우 상태가 변경될 수 있습니다.

- 변경 가능한 객체는 상태나 내용을 변경할 수 있고, 변경할 수 없는 객체는 상태나 내용을 변경할 수 없습니다.

 

3. WHY?

- 호기심? 파이썬을 만든 사람들은 왜? 객체 2가지로 분류를 하였을까? 답: 속도와 비용 때문이다.

  (이 부분에 대해 기술적으로 좀더 깊게 보고자 한다면, 얕은 복사(shallow copy) 와 깊은 복사(deep copy)에 대해서 보면 더 이해가 잘 됩니다.)

- 가변(mutable) 객체와 불변(immutable) 객체는 파이썬에서 다르게 처리됩니다. 
  변경할 수 없는 개체는 액세스가 더 빠르고 복사본을 생성해야 하기 때문에 변경 하는 데 비용이 많이 듭니다.
  반면 가변 객체는 변경하기 쉽습니다.

 

4, 예제

5. 정리

- 개체의 크기 또는 내용을 변경해야 하는 경우 가변 개체를 사용하는 것이 좋습니다.

 

반응형
posted by choiwonwoo
:
MINERVA/Java Script 2022. 4. 21. 04:39
반응형

윈도우 환경에서 Visual studio code에 Code Runner를 설치 후, js 파일을 실행시키면, 아래와 같은 에러가 발생하는 경우가 있습니다.

희한하게 Mac에서는 괜찮고, 윈도우에서만 발생함

 

[원인]

Code Runner가 자바스크립트 코드를 실행 시, Node.js command실행하기 때문에 발생

 

[해결방법]

https://nodejs.org/ko/

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

최신의 LTS 버젼을 설치 후 Visual studio code 재실행

반응형
posted by choiwonwoo
:
MINERVA/Git 2022. 4. 20. 21:52
반응형

앞에서 기본적은 Git의 동작 방법에 대해서 설명을 하였습니다.

그런데, 저의 경우 visual studio, pycharm, android studio, atom 등을 사용하면서, console에서 git을 사용하기 보다는 visual환경을 사용하는 것이 생산성과 편의성이 높아 GitHub Desktop을 사용합니다.

 

그래서, 해당 내용을 간단히 정리하고자 합니다.

 

1.Download:  https://desktop.github.com/

 

GitHub Desktop

Simple collaboration from your desktop

desktop.github.com

2. Github 로그인

다운받은 파일을 실행(GitHubDesktopSetup-x64.exe)후 Github에 로그인(계정이 없으면 생성후 로그인)

이름과 이메일 등록후 로그인

3. 로그인후 tutorial repository 만들기

1) crate a tutorial repository 클릭

- 앞에서 local repository를 만들고, remote repository를 각각 설명했지만,

   아래의 글을 보면, 동시 생성된다는 것을 확인할수 있고, 해당 저장소가 private하게 만들어짐을 확인

로긴 성공화면

3. 확인

 

1) Default 생성된 로컬 저장소

2) 원격 저장소(remote repository)

 

확실히 console에서 git init, git add, git commit, git push 등등하는 것보다 월등히 편하다.

그리고 실무적으로 visual 하게 작업하는것이 잔실수를 줄이기도 합니다.

동작 개념만 명확히 이해하고 있다면, GUI환경에서 작업하는 것이 좋을 듯합니다.

 

감사합니다.

 

반응형
posted by choiwonwoo
:
MINERVA/Git 2022. 4. 20. 19:28
반응형

정리 방향은 Git 역사, 철학등은 모두 스킵하고, 클라이언트(개발자) 측면에서 필수적인 부분만 정리하고자 합니다.

(참고: Git 이전에는 cvs, svn 등이 있었지만, 현재는 Git이 천하통일(?))

 

1. What?(Git 이란?)

- 소스코드/리소스를 효과적으로 관리하기 위해 리누스 토르발스가 개발한  분산형 버전 관리 시스템(VSC)이다.

 

2. How to use?(어떻게 사용)

- "작업 공간에서 작업한 내용을 스테이지에 올려서 로컬 저장소에 커밋하고, 이를 푸시해서 원격 저장소로 보낸다"

 

1) 작업공간(working space)

- 개인 PC에서 작업내용(코드, 이미지 편집)을 담고 있는 프로젝트 폴더를 말함

 

2) 스테이지(stage)

- 작업한 내용이 올라가는 임시 영역을 말함 --> 매우 학문적인 표현 ㅠㅠㅠㅠ

- 직관적으로 표현하면, 작업 공간에서 생성/변경이 발생한 파일을 다음 커밋에 반영하기 위해 추적하는 것을 말함

- 스페이지하는 것을 인덱스(index)한다고 표현하기도 함

- 추적되는 파일은 스테이지 영역(stage area)에 넣는다고 함.

cf) 언스페이지(unsatge): 추적을 해제, 즉 스테이지 영역(stage area)에서 제외시킴

 

[명령어]

- git add : 작업내용을 추적(stage)시키는 명령어입니다.

ex) git add . //현재 폴더의 모든 파일과 디렉토리, 하위 디렉토리에 든 전부를 staging area에 추가한다. 

     git add 파일 //  파일을 staging area에 추가한다.

 

- git rm  : 작업 내용을 추적해제(unstage)시키는 명령어입니다.

 

3) 커밋(commit)

- 작업한 내용을 로컬 저장소에 저장하는 과정

- 스테이지(추적) 내용을 하나로 묶는 것을 말함

- commit과 동시에 로컬 저장소에 저장됨

- 직관적으로 표현:  작업공간(working space)의 스페이지(stage, index)내용을 커밋(변경, 추적내용)해서 저장소에 저장

ex) git commit -m "메시지" //메시지는 어떤 내용을 반영했는지를 나타냅

     git log     // 로컬 저장소(local repository)에서 commit된 이력을 확인

     git status // 마지막 commit 이후 작업 공간(work space)에서 변경이 있는 모든 파일을 보여줌

 

cf) 태그(tag)란? 커밋의 임의 위치에 쉽게 찾아갈 수 있도록 붙여놓은 이정표를 태그

3) 로컬 저장소(local repository)

-  PC에 작업내용이 저장되는 개인 전용 저장소

ex) git init  DAS // 로컬 저장소 생성

or

GitHub 사용

위와 같이 console or GUI를 통해서 작업공간(working space)를 생성하면,

.git 폴더가 생성되는되데, 이곳이 commit된 내용이 들어가는 로컬 저장소(local repository)입니다.

4) 원격 저장소(remote repository)

- 로컬 저장소에 있는 내용을 원격 서버에 여러사람과 공유 또는 공동작업을 위한 저장소

- Push/ Pull

Push/Pull

- Push: 로컬 저장소의 내용 중 원격 저장소에 반영되지 않은 커밋을 원격 저장소로 보내는 과정
- Pull: 푸시와 반대로 원격 저장소에 있는 내용 중 로컬 저장소에 반영되지 않은 내용을 가져와서 로컬 저장소에 저장하는 과정을 의미합니다. 이를 통해 다른 팀원이 변경하고 푸시한 내용을 로컬 저장소로 가져올 수 있습니다.

푸시 과정에서 충돌(Collision)이 일어나서 푸시가 거절된 경우, 풀을 통해 원격 저장소의 변경 내용을 반영한 뒤 다시 푸시를 시도해야 합니다.

 

// NEXT: 실제 실무중심에서 사용하는 명령어 정리

// 예: 원격 저장소에서 로컬 저장소로 소스코드를 복사 --> git clone 

반응형
posted by choiwonwoo
:
MINERVA/C_CPP 2022. 4. 19. 15:03
반응형

해당 에러가 발생시 해결방법

 

[예제]

void main(){

     char *pszBuff = NULL;

     return;

}

 

Error C2065 'NULL': undeclared identifier

 

[에러원인]

' NULL' 이 내장(build-in) 상수(constant)가 아니기 때문이다.

 

[해결]

1. Assign 0

 

void main(){

     char *pszBuff = 0;

     return;

}

 

2. include <stddef.h> or <iostream>

 

#include <stddef.h>

#include <iostream> // for C++

 

void main(){

     char *pszBuff = NULL;

     return;

}

 

3. #define NULL 0

 

#define NULL 0

 

void main(){

     char *pszBuff = NULL;

     return;

}

 

4. In newer C++(C++11 and higher):: nullptr

 

#include <iostream> // for C++

void main(){

     char *pszBuff = nullptr

     return;

}

반응형
posted by choiwonwoo
: