반응형

안녕하세요, 코딩유치원을 운영하고 있는 손생입니다.

 

 오늘은 지난 시간 소개드렸던 일론 머스크 트위터를 실시간 크롤링 하여 텔래그램으로 전송해주는 서비스를 통해서 코인 투자를 했다면, 어떤 수익률을 얻을 수 있었을지 데이터를 가지고 검증해보려 합니다.

 

 참고로 해당 아이디어는 일론 머스크의 말 한마디에 비트코인과 도지코인의 가격이 급등락하는 비이성적인 상황을 이용해서 코인 투자를 해보면 어떨까라는 생각에서 시작하였습니다.

 

2021.05.15 - [파이썬 프로젝트] - [파이썬 프로젝트] 일론 머스크 트위터 실시간으로 텔레그램 전송 받기

 

[파이썬 프로젝트] 일론 머스크 트위터 실시간으로 텔레그램 전송 받기

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. 오늘은 최근 코인 열풍의 가장 중심에 있는 테슬라의 CEO인 일론 머스크의 트위터를 실시간 크롤링해보았습니다. 이 프

coding-kindergarten.tistory.com

 

2021.05.20 - [파이썬 프로젝트] - 일론 머스크 트위터 실시간 크롤링을 통한 도지코인 매매 수익률 검증 (feat. How much is that Doge in the window?)

 

일론 머스크 트위터 실시간 크롤링을 통한 도지코인 매매 수익률 검증 (feat. How much is that Doge in th

안녕하세요, 이제 코딩유치원인지 코인유치원인지 헷갈리는 블로그를 운영하고 있는 손생입니다. 최근 일론 머스크의 말 한마디에 비트코인과 도지코인의 가격이 급등락하는 비이성적인 상황

coding-kindergarten.tistory.com

 

 

<결론>

 

결론부터 말씀드리면, 텔레그램을 보시고 즉시 매수하고 다음날 아침에 매도 하셨다면 약 10%의 수익률을 볼 수 있었습니다.

 

<근거>

 

우리나라 시간으로 2020년 5월 19일 약 11시 42분경, Elon Musk 트위터에 아래의 글이 올라왔었습니다.

 

 

 저는 텔래그램 알림을 받고 알았는데 "Tesla has" 라고 왔길래 아마도 텍스트만 크롤링 하기에 뒤에 이모티콘이 잘렸나보다 라고 생각하고 컴퓨터로 확인하느라 조금 늦었습니다.

 

 저 그림이 뜻하는 것을 잘 몰라서 구글에 검색해 보았더니 'diamond hands 뜻'이라고 검색해보았더니 아래와 같이 검색되었습니다.

 

 미국 개미들의 아지트는 '월스트리트베츠(Wall street bets·WSB)'라고 불리는 온라인 주식 토론방이다. 특정 종목에 ‘좌표’를 찍고 집중 매수를 권유하는 글, 주식이 떨어질 때 팔지 말라고 당부하는 글이 모두 여기에 올라온다. 주식을 팔지 않고 버틴다는 의미의 ‘다이아몬드핸즈(diamond hands)’나 주가를 달까지 끌어올린다는 의미의 ‘투더문(to the moon)’ 등 수많은 유행어가 이곳에서 나왔다. 
[출처: 중앙일보] 헤지펀드 박살낸 美 '불개미'…그들 읽는 키워드 ‘SURF’의 뜻

 

해당 트윗의 뜻을 테슬라가 비트코인을 팔지 않고 '존버'하고 있다라고 해석했고 업비트를 켜서 시세 차트를 확인해보았습니다.

 

 이미 제가 확인 했을 때는 1BTC에 4800만원을 왔다갔다 하고있었지만 해당 트윗이 올라왔을 때는 4600만원이 었던 걸 확인할 수 있습니다. 그리고 다음날 5시 40분 기준 5160만원인 것을 확인했습니다.

 

즉, 트위터를 보고 즉시 매수를 했다면 하락장에서도 10%정도의 수익을 올릴 수 있었다는 결론을 내릴 수 있습니다.

 

 

 솔직히 유명인의 말 한 마디 한 마디에 출렁이는 자산과 그걸 유발하는 대중들의 무분별한 투자에 대해서 회의감이 들기도 합니다만, 역으로 이 상항을 잘 이용한다면 수익을 올릴 수 있지 않나 싶습니다. 단, 장기적으로 보았을 때는 유효하지 않을 수 있기에 투자에 유의 바랍니다.

 

모두들 성투하세요!

 

 

반응형
반응형

세상에는 아주 단순한 진리가 있다.

 

"값을 지불하고 가치를 얻는다."

 

오늘은 이 주제에 대한 나의 생각을 정리해보고자 한다.

 

1.  사람은 자신이 가치있다고 여기는 것에 돈을 아끼지 않는다

 

우리는 스마트폰을 대부분 가지고 있다. 스마트폰은 어떤 가치를 제공해주는가?

 

2018년 통계청에서는 '근대 발명품 중에서 사람들이 무엇을 좋아하는가?'를 조사해서 공개한 적이 있다.

1~5위는 냉장고, 인터넷, 컴퓨터, 세탁기, 텔레비전라고 한다.

스마트폰은 인터넷, 컴퓨터, 텔레비전의 역할을 모두 가능한 뿐 아니라 시간과 장소에 구애받지 않는다. 

 

그렇기 때문에 사람들은 새로운 아이폰이 출시되면 밤새 줄을 서서 구매하기도 한다.

그 이유는 당연히 스마트폰이 주는 가치가 돈 100만원보다 더 가치있다고 생각하기 때문이다.

 

이렇듯 사람은 어떤 것이 가치있다고 생각할 때, 누가 시키지 않아도 스스로 지갑을 연다.

만약 그것이 많은 사람이 가치있다 여기고, 희소하기 까지 할 경우엔 서로 갖기 위해 엄청난 값을 지불한다.

 

2.  나는 어떤 가치를 제공할 수 있을까?

 

막연하게 돈을 많이 벌고 부자가 되고 싶다고 말하는 사람은 많다.

하지만 자신이 어떤 가치를 제공할 수 있을까 고민하는 사람은 많지 않다.

 

돈을 많이 벌고 싶다면,

내가 어떤 가치를 누군가에게 제공할 수 있는지 고민해야한다.

그리고 그 가치를 어떻게 타인에게 잘 알릴 수 있을지 고민해야한다.

 

직장인이라면 자신의 직무 능력을 상승시키고 이력관리를 통해 직장 상사 혹은 헤드헌터에게 잘 어필해야한다.

사업가라면 고객에게 어떤 가치를 제공할지 끊임없이 고민하고, 마케팅을 통해 그 가치를 설득하고 전달해야한다.

 

사업가와 직장인의 가장 큰 차이는 제품이나 서비스라는 가치를 제공하느냐 노동이라는 가치를 제공하느냐의 차이가 아닐까?

 

 

3.  나는 대체 불가한 가치를 제공하고 싶다

 

나는 내 시간을 온전히 나의 것으로 사용하고 싶다. 그리고 그 시간을 나만의 가치를 만드는 데에 쓰고 싶다.

돈 때문에 불필요한 것에 대부분의 시간을 쓰다가, 두려움 때문에 도전하지 못 한 삶을 후회하며 눈감고 싶지 않다.

 

나무에 앉은 새는 가지가 부러질까 두려워하지 않는다.

새는 나무가 아니라 자신의 날개를 믿기 때문이다.

 

- 류시화, <새는 날아가면서 뒤돌아보지 않는다> -

 

요즘의 나에게 많은 생각을 하게 만드는 문장이다.

 

부디 먼 훗날의 나 자신이 현재의 나를 한심하게 여기지 않을 선택과 노력을 하자.

더불어 나의 소중한 인연들도 주도적이고 후회없는 삶을 살기를 바래본다.

서로 끌어주고 밀어주면서 함께 간다면 그 무엇보다 행복하지 않을까?

 

아..그러고보니 마음은 그만먹고 행동하기로 했는데 또 마음먹고 있네.. 반성한다..

반응형
반응형

보통 직장인들이 자신의 삶을 '톱니바퀴 같은 삶'이라고 비유하곤 한다.

오늘은 그 비유에서 생각을 확장해서 회사라는 하나의 시스템을 정의해볼까 한다.

 

어떤 대상을 내가 알고있는 것에 빗대어서 이해하는 것은 새로운 지식을 받아들일 때 많은 도움이 되기 때문이다.

 

 


 

직무 = 톱니바퀴 혹은 부품

 

하나의 직무를 톱니바퀴 하나의 역할로 볼 수 있다.

회사의 직무는 크게 R&D, 생산, 품질, 구매, 영업, 기술지원, 재무, 인사, 총무, 기획, 마케팅 등으로 나뉜다.

작은 회사(중소기업)에 들어간다면, 여러 톱니바퀴의 역할을 수행할 수도 있을 것이고,

큰 회사(대기업)에 들어간다면 아주 작은 기어 하나의 역할만 수행하는 경우가 대부분이다.

 

사람들은 대부분 희소하여 대체불가하며, 비싸고 단단한 톱니바퀴가 되려고 노력한다.

 

 

회사 = 완성된 가치를 만드는 시스템

 

산업이 고도화 되면서 대다수의 개인은 누군가에게 값을 받고 팔 수 있는 제품이나 서비스를 온전히 혼자서 만들 수 없는 경우가 많다.

그래서 대다수는 현재 안정적으로 가치를 창출하고 돈을 벌어들이고 있는 회사라는 시스템에 이력서를 내고 입사하기 위해 노력한다.

입사 후, 우리는 지식, 기술, 시간, 노동력 등을 제공하고, 그 대가로 안정적으로 임금을 지급받는다.

여러 분야의 전문가들이 한 곳에 모여 시너지 효과를 발휘하는 회사는 자본주의 사회에서 최고의 시스템으로 평가받고 있다.

회사에 들어가서 선진화된 시스템을 체험하고, 배우는 것은 어쩌면 돈보다 더 값진 것일 수 도 있다는 생각을 해본다.

​자신의 직무에서 전문성을 최대한 발휘하고 성과를 내는 것도 중요하지만, 틈틈이 시간을 내서 타부서들이 어떤 역할을 하고 회사가 어떻게 돌아가는지 파악해보는 것이 좋다고 생각된다.

 

 

 

커뮤니케이션 = 윤활유

 

커뮤니케이션, 즉 소통은 톱니바퀴들이 맞물려 돌아갈 때, 마찰에 의한 마모와 소음을 줄여주는 윤활유 역할한다.

실제로도 일하다보면 소통이 서툴러서, 개인간 혹은 부서간에 오해가 생겨 감정이 상하기도 사이가 나빠지는 경우들이 있다.

그렇게 관계가 틀어지면, 문제가 발생했을 때, 서로의 책임소재를 찾는데에 시간을 쏟게되고, 일이 비효율적으로 진행된다.

어느 책에서 함께 일하고 싶은 사람은 일 잘하는 사람보다 소통이 잘되는 편한 사람이다라는 말을 본 기억이 있을 정도로, 소통의 중요성은 아무리 강조해도 지나침이 없을 것 같다.

 

개인적으로 '카네기 인간관계론'이 나에게는 많은 도움이 되었다고 생각한다. 아직 읽어보지 않았다면 꼭 읽어보길 추천한다.

 

 

관리자 = 제어 장치(엑추에이터, 센서)

 

시스템이 점점 커지고 복잡해질수록, 시스템이 잘 돌아가고 있는지 점검하고 수리하는 일은 급격히 어려워진다.

그래서 시스템의 주인은 시스템 내에 각 부품들이 체계적으로 잘돌아갈 수 있도록 유지/보수 하는 제어장치들을 배치한다.

회사에는 존재하는 각 부서/팀의 장들이 이 역할을 수행한다.

 

그들은 오랜 세월간 실무를 수행함으로써, 어떻게 돌아가는지 잘 알고 있으며, 그렇기 때문에 팀원들의 목표치를 설정하고, 이를 관리/감독 할 수 있다고 생각되어 회사로부터 관리자의 권한을 받게 된다.

비유를 해보자면, 윤활이 잘 안되어 부품들이 부딪히며 소리가 나면 윤활유를 공급하기도 하고, 부품이 본래의 성능을 내는지 계측하며, 성능이 확연히 떨어질 경우, 교체가 필요하다는 신호를 보내는 등의 역할을 하는거라고 생각해보면 좋을 것 같다.

 

 

돈, 자본 = 동력

 

시스템을 굴리기 위해서는 반드시 동력원이 필요하다.

건물, 장비, 원자재를 구매하고, 노동력을 확보하는 일에는 모두 다 돈이 필요하기 때문이다.

시스템을 설계한 창업자는 대출 혹은 투자를 받아서, 시스템을 제작하고 작동시킨다.

아무리 좋은 아이디어나 아이템이 있더라도, 사업을 시작하는 사람은 돈을 끌어올 수 없다면 아무것도 할 수 없다.

그래도 요즘은 세상이 좋아져서, 크라우드 펀딩(수 많은 개인으로 부터 받는 투자)으로 투자를 받는 것이 훨씬 수월해졌다.

만약 자신의 아이템에 확신이 있고, 그것을 실현시킬 능력이 있다면, 도전해보는 것도 좋다고 생각한다.


글을 끝마치며..

 

코로나로 인해 4차 산업형멱의 시대가 더 빨리 다가오는 듯 하다. 점점 인공지능과 로봇에게 사람들의 일자리는 없어져갈 것이다.

만약 직장인으로 계속 살아남으려면 대체 불가하고 시간이 지날수록 가치가 올라갈 수 있는 직무를 선택해야 한다고 생각한다.

사업을 한다면 전통적인 제조업이나 유통업 보다는 IT 자신만의 콘텐츠를 만드는 것이 좋다는 생각이 든다.

반응형
반응형

 

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

 

지난 프로젝트를 통해서 아래와 같은 프로그램들을 만들어보았습니다.

 

2021.04.05 - [파이썬 프로젝트] - [파이썬 프로젝트] 원하는 주제의 네이버 뉴스 텔레그램으로 5분마다 전송 받기

2021.05.15 - [파이썬 프로젝트] - [파이썬 프로젝트] 일론 머스크 트위터 실시간으로 텔레그램 전송 받기

 

하지만 해당 프로그램들은 컴퓨터가 계속 켜져 있어서 파이썬 코드가 계속 실행되어야 하는 문제가 존재합니다.

이런 문제를 해결하기 위해서 나만의 '서버'가 필요합니다. 여기서 서버란 '24시간 돌아가는 컴퓨터'라고 이해하시면 됩니다.

 

나만의 서버를 만드는 방법은 여러가지가 있겠지만, 제가 아는 방법은 아래의 2가지입니다.

 

1) 라즈베리 파이와 같은 미니 pc를 와이파이에 연결시켜, 코드를 실행

2) 아마존 AWS, 네이버 클라우드 플랫폼, 구글 클라우드 플랫폼 같은 서비스를 이용해, 코드를 실행

 

1번 방법은 추후에 공부해 볼 계획이며, 이번 시간에는 네이버 클라우드 플랫폼을 이용해 나만의 서버를 만들어보겠습니다.

 

 

네이버 클라우드 플랫폼

 

네이버 클라우드 플랫폼을 선택한 특별한 이유 없습니다. 그냥 네이버가 친근하고 한국어가 많을 것 같은 느낌?

차근차근 따라하시면서 함께 나만의 서버를 만들어 봅시다!

 

1. 네이버 클라우드 접속

 

https://www.ncloud.com/

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

 

2. 회원 가입  및  결제수단 입력

 

네이버 아이디로 하는게 아니라서 웬만하면 가입 하셔야 합니다. 쉬우니깐 추가적인 설명은 생략하겠습니다.

 

서비스를 이용하려면 결제를 하지 않으시더라도 결제 수단을 등록하셔야합니다.

마이페이지 - 결제수단 관리로 들어가셔서 결제에 사용할 카드 정보 입력 해주세요.

 

3. 서버 이용 신청하기

 

서비스 - Server로 들어가셔서  이용 신청하기 버튼(하늘색 버튼)을 클릭해줍니다.

 

 

참고로 저희가 사용할 Micro Server는 1년간 무료로 사용하실 수 있습니다.

단, 1년 뒤에는 자동결제 된다고 하니 주의해주세요. (월 13,000원 정도)

 

새로운 창이 생성되면 '서버 생성' 버튼 클릭을 클릭해줍니다.

 

아래와 같이 설정해주시면 됩니다. 본인이 사용하고 계신 OS에 상관 없이 Ubuntu를 선택해주셔야 Micro Server를 만드실 수 있어요.

 

위에서 다음 버튼을 누르면 아래와 같이 이용 요금 안내창이 뜨는데 읽어보시고 확인 눌러주세요.

 

다음으로는 서버를 설정해줄 차례입니다. 옵션들은 거의 다 원래 설정되어 있는대로 두시고, 서버 이름만 마음대로 지어줍니다.

 

다음 버튼 누르시면 인증키 설정 단계로 넘어갑니다. 새로운 인증키 생성에서 인증키 이름을 마음대로 설정해주세요. 

 

이름 정하셨으면 , 인증키 생성 및 저장 버튼을 누르시면 아래와 같이 pem 파일이 다운로드 됩니다.

이 안에는 인증키의 암호 정보가 들어있는데, 나중에 사용되니깐 잘 찾을 수 있는 곳에 보관해주세요.

 

다음을 누르시면 네트워크 접근 설정 단계로 넘어가는데 그냥 바로 다음 누르시고 넘어가시면 됩니다.

 

마지막에 최종 확인 단계에서 아래에 위치한 서버 생성 버튼을 눌러주시면 서버가 만들어집니다.

 

아래 창이 뜨는데 그냥 확인 눌러주시면 되겠습니다.

 


 

다음 시간에는 오늘 만든 서버에 파이썬 코드를 올리는 것을 공부해 보겠습니다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

<관련 글>

 

2021.05.20 - [파이썬 프로젝트] - 일론 머스크 트위터 실시간 크롤링을 통한 비트코인 매매 수익률 검증 (feat. Tesla has Diamond Hands)

2021.05.20 - [파이썬 프로젝트] - 일론 머스크 트위터 실시간 크롤링을 통한 도지코인 매매 수익률 검증 (feat. How much is that Doge in the window?)

 


 

오늘은 최근 코인 열풍의 가장 중심에 있는 테슬라의 CEO인 일론 머스크의 트위터를 실시간 크롤링해보았습니다.

 

이 프로젝트는 일론 머스크의 말 한마디에 비트코인과 도지코인의 가격이 급등락하는 비이성적인 상황을 이용해서 코인 투자를 해보면 어떨까라는 생각에서 시작하였습니다.

 

이 프로젝트의 목적은 다음과 같습니다.

 

"일론 머스크 트위터를 실시간으로 감시하여, 새로운 트윗에 올라 왔을 때 텔레그램 봇을 이용해서 나에게 알려준다"

 

근 시일 내로 네이버 클라우드 플랫폼을 이용해서, 오늘 만든 코드를 계속 실행시켜줄 나만의 서버를 만들고,  텔래그램 채널을 만들어서 다른 사람들도 이용할 수 있는 서비스로 만들 계획입니다.

 


 

<2021년 5월 16일 글 수정>

 

이 글을 작성한 다음날 우연히 제가 생각하던 서비스를 이미 텔래그램 채널로 구현해놓은 것을 발견하여 공유하고자 합니다.

 

먼저 텔레그램 앱을 휴대폰에 설치하신 후, 아래와 같이 elon musk twitter 채널을 검색해 줍니다.

 

 

위의 채널을 클릭하고 들어가서 화면 화단의 알림켜기를 눌러주시면 실시간으로 일론 머스크 관련 트위터를 받아 보실 수 있습니다.

참고로, Elon Musk 개인 트위터 뿐만 아니라 SpaceX의 트위터도 실시간으로 알려주는 것으로 파악됩니다.

 

 


 

<혼자 진행했던 파이썬 프로젝트 코드>

 

오늘은 일단 컴퓨터에서 파이썬 코드가 돌아갈 때, 제 개인 텔레그램 봇을 이용해 메시지를 보내는 것 까지 해보았습니다.

 

전공자가 아니라서 코드가 매우 지저분 할 수 있다는 점 양해바랍니다.

 

#step1.라이브러리 불러오기

#웹 크롤링을 위한 패키지
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

#사용자에게 메시지 전송을 위한 패키지
import telegram

#주기적으로 프로그램을 작동시키기 위한 패키지
from apscheduler.schedulers.blocking import BlockingScheduler

#step2.텔레그램 봇 불러오기

#토큰을 변수에 저장
bot_token = '자신의 텔레그램 봇 토큰 입력'

#telegram 패키지의 Bot 함수를 사용하여 내가 만든 bot 사용
bot = telegram.Bot(token = bot_token)

#bot과의 채팅 정보 및 메세지 업데이트
#예전(불과 어제)의 정보를 못 불러오는 것으로 파악됨. 프로그램 시작 전에 bot에게 아무 메시지나 보내주어야함

#가장 최근에 온 메세지의 정보 중, chat id만 가져옴 (이 chat id는 사용자(나)의 계정 id임)
chat_id = bot.getUpdates()[-1].message.chat.id

#위에서 얻은 chat id로 bot이 메세지를 보냄.
bot.sendMessage(chat_id = chat_id, text="Elon Musk의 트위터 실시간 크롤링이 시작 되었습니다") 


#step3.주기적으로 명령을 실행할 스케쥴러 생성
sched = BlockingScheduler()

#step4.기존에 보냈던 메시지를 담아둘 리스트 만들기
old_contents = []

#step5.트위터 메시지 크롤링 함수 만들기 (매개변수는 이전에 수집해둔 메시지가 담긴 리스트)
def get_content(old_contents=[]):

	#크롬드라이버로 일론 머스크 트위터 접속
    url = 'https://twitter.com/elonmusk'
    driver = webdriver.Chrome('크롬 드라이버의 디렉토리(경로) 입력')
    driver.get(url)
    time.sleep(3)

    contents = []

    for i in range(10):
        
        try:
            twitter = driver.find_element_by_xpath(f'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/div[1]/div/div[2]/div/div/div[2]/section/div/div/div[{i}]/div/div/article/div/div/div/div[2]/div[2]/div[2]/div[1]/div/span')
            contents.append(twitter.text)

        except:
            pass
   
    time.sleep(3)

    new_contents=[]

    for content in contents:
        if content not in old_contents:
            new_contents.append(content)
    
    return new_contents

#step6.텔레그램 메시지 전송 함수 만들기
def send_contents():
    global old_contents
    new_contents = get_content(old_contents)

    if new_contents:
        for content in new_contents:
            bot.sendMessage(chat_id=chat_id, text=content)
    else:
        # pass
        bot.sendMessage(chat_id=chat_id, text='새로운 트윗 없음')
        # else일 때 아무것도 안보내고 싶으면 그냥 pass로 바꾸면 됨. 실제 사용 때는 pass로 할 것

    old_contents += new_contents.copy()
    # old_contents = list(set(old_contents))

#step7.최초 시작, 스케쥴러 세팅 및 작동
send_contents()

# hours는 시, minutes는 분, seconds는 초
sched.add_job(send_contents, 'interval', seconds=10)

sched.start()

 

<새로 배운 점>

 

1. 정적 크롤링 방식으로는 twitter에서 막아둔 것인지 크롤링이 되지 않음  --> 실제 사용자가 클릭하 듯 동적 크롤링 방식 이용

 

2. css selector로 선택하기 어려운(아직 내가 잘 몰라서) 부분을 xpath의 규칙을 이용해 선택해서 크롤링 함

 

사용한 코드

for i in range(10):
        
        try:
            twitter = driver.find_element_by_xpath(f'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/div[1]/div/div[2]/div/div/div[2]/section/div/div/div[{i}]/div/div/article/div/div/div/div[2]/div[2]/div[2]/div[1]/div/span')
            contents.append(twitter.text)

        except:
            pass

 

일론 머스크 트위터의 4, 5, 6번째 메시지의 xpath

 

# //*[@id="react-root"]/div/div/div[2]/main/div/div/div/div[1]/div/div[2]/div/div/div[2]/section/div/div/div[4]/div/div/article/div/div/div/div[2]/div[2]/div[2]/div[1]/div/span

 

# //*[@id="react-root"]/div/div/div[2]/main/div/div/div/div[1]/div/div[2]/div/div/div[2]/section/div/div/div[5]/div/div/article/div/div/div/div[2]/div[2]/div[2]/div[1]/div/span

 

# //*[@id="react-root"]/div/div/div[2]/main/div/div/div/div[1]/div/div[2]/div/div/div[2]/section/div/div/div[6]/div/div/article/div/div/div/div[2]/div[2]/div[2]/div[1]/div/span

 

 

<해결 못 한 점>

 

send_contents 함수에서 실행되는 get_contents가 실행될 때 마다 크롬 창이 떠서 불편함

 

#크롬 드라이버 실행 시 (창 뜨지 않는 옵션 추가)

 

options = webdriver.ChromeOptions()

options.add_argument("headless")

options.add_argument("--disable-gpu")

options.add_argument("lang=ko_KR")



driver = webdriver.Chrome('크롬 드라이버 경로', chrome_options=options)

 

 

 

반응형
반응형

나에게는 안좋은 습관이 있다.

 

그건 바로 마음을 맨날 먹기만 하는 것이다.

이걸 해보자. 그 다음엔 저걸 해보자.

한마디로 마음 과식!

 

나는 마음에 대한 식탐, 즉 욕심이 많은 편인 듯 하다.

욕심을 채우려다 보니, 열심히 살아야한다는 강박같은 것도 있다.

 

누군가는 나보고 참 열심히 산다고 한다.

하지만 나는 그 말에 동의하지 못한다.

여전히 내 실행력이 불만스럽기 때문이다.

 

마음 먹는게 하도 많다보니 그걸 다 해내지 못해서,

맨날 걱정이 찌고, 그 걱정들이 내 정신을 무겁게 만든다는 생각이 들었다.

 

문제를 인식했으니 해야할 것은 명확하다.

 

마음을 당분간 먹지 않고, 이미 먹은 마음을 실행해 옮기는 것!

이름하여 걱정 다이어트를 시작해보려 한다.

 

출처. https://www.clien.net/

 

 

 

 

 

 

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

 

 

<파이썬 GUI 프로그래밍 관련 지난 글>

 

출처. WIKIPEDIA

 

2021.05.07 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] PyQt5 기초_1강.PyQt의 개념과 창 만들기 (창 이름, 사이즈, 변경 및 아이콘 삽입)

2021.05.08 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] PyQt5 기초_2강.위젯의 종류, 시그널과 슬롯, 이벤트 루프

 

 

이번 시간에는 GUI 화면을 그래픽 기반의 드래그 앤 드롭 방식으로 쉽게 구성할 수 있도록 도와주는 도구인 Qt Designer에 대해서 알아보겠습니다.

 


 

Qt Designer 설치 및 실행

 

우선 코딩 유치원에서 추천하는 Anaconda로 파이썬을 설치하셨다면, Qt Designer는 이미 설치되어 있습니다.

만약 파이썬 공식 홈페이지를 통해 Python을 설치하셨다면, cmd창에서 pip install pyqt를 입력하시면 설치가 될 것입니다.

 

Anaconda가 설치되어 있다는 가정하에 Qt Designer의 실행방법은 아래와 같습니다.

 

Window

Window 시작 메뉴에서 Anaconda Prompt를 검색하여 실행시커나, VScode를 사용하고 계신다면 터미널창에 designer라는 명령어를 입력하면 Qt Designer가 실행됩니다.

 

Mac

Finder를 실행한 후, 응용 프로그램(Application) 탭을 클릭하거나 launchpad에서 Anaconda Navigator를 찾아서 우클릭하고 Show Original을 누릅니다. Anaconda Navigator 내부로 들어갔다면, bin폴더에 있는 Designer라는 파일을 실행하면 Qt Designer가 실행됩니다.

 

매번 이렇게 실행시키기는 좀 귀찮겠죠? Qt Designer를 Application 폴더로 복사/붙여넣기 하시면 launchpad에서 Qt Designer를 실행시킬 수 있습니다.

 

 

Qt Designer의 화면구성

 

만약 Qt Designer가 제대로 실행되었다면, 가장 처음 보이는 화면은 아래와 같습니다. (Window OS 기준)

 

 

 

화면 중앙에 위치한 창에서 Dialog without Buttons를 누른 후 Create를 눌러주겠습니다.

 

 

Dialog Window

 

그러면 아래와 같이 'Dialog - untitled' 라는 이름의 창이 뜨는데 우리는 여기에 우리만의 GUI 프로그램을 디자인 해줄 수 있습니다.

그림에 비유하자면 마치 도화지와 같다고 생각하시면 되겠습니다.

 

 

Widget Box (위젯 상자)

 

도화지가 준비되었으니, 도화지를 예쁘게 꾸밀 물감이 필요하겠죠? Widget Box는 그런 물감을 모아놓은 팔레트라고 생각하시면 됩니다.

바로 화면의 좌측에 위치하는 위젯(프로그램에서 기능을 하는 버튼 등의 객체)이 그 역할을 합니다.

 

이곳에서 원하는 위젯을 Dialog Window로 드래그하여 GUI 프로그램이라는 그림을 그려줄 수 있습니다.

 

 

Property Editor (속성 편집기)

 

우리는 도화지와 물감만 있다고 원하는데로 그림을 그릴 수가 없습니다. 의도한 그림을 구현하기 위해서는 붓이 필요하겠죠?

Property Editor는 위젯의 이름(objectName), 위치와 크기(geometry) 등의 특성을 조정해줄 수 있는 창입니다.

 

 

 

Qt Designer로 내 맘대로 GUI 디자인 해보기

 

위에서 배운 도화지, 물감, 붓 들을 이용해 나만의 그림(GUI)을 그려 보겠습니다. 저는 이것저것 막 드래그해서 아래와 같이 구성해봤습니다.

똑같이 따라하실 필요는 전혀 없습니다! 단순히 버튼 하나만 넣으셔도 됩니다.

 

 

이렇게 만들고 저장해주면 생성되는 ui 파일을 코드에서 가져다 사용하면 됩니다. 정말 쉽죠?

 

어떻게 코드에서 사용하는지 알아보기 전에, 하나만 알고 넘어가시면 좋을 것 같아요.

바로 objectName입니다. 여기서 제가 추가한 QpushButton 위젯 객체의 이름은 pushButton입니다.

 

나중에 이 버튼 객체를 지난 시간에 배웠던 슬롯(함수)와 연결시켜 어떤 기능을 하기 위해서는 이름을 알고 있어야 합니다.

앞으로 GUI를 디자인 하실 때, 각 위젯의 objectName에 직관적인 이름을 지어주고 사용하시면 됩니다.

 

 

 

참고로 저장 전에 미리보기를 할 수 있습니다. 미리보기 단축키는 Ctrl(Command) + R입니다.

 

 

Qt Designer 파일(.UI) 저장

 

Qt Designer의 UI는 저장 버튼 혹은 단축키(Ctrl + S / Command + S)로 저장을 할 수 있습니다. 저장된 UI파일은 데이터 저장 규칙인 XML 형식을 가지며, Python 코드에서 이 XML 파일을 Import한 후 위젯들에 기능을 할당해주면 실제로 기능을 가지고 작동하는 GUI프로그램이 되는 것입니다.

 

UI 파일을 저장할 때 주의할 점은 Python코드에서 import하기 쉽도록 Python 코드와 같은 디렉토리에 위치시키는 것이 좋습니다. UI파일의 이름은 원하는 이름으로 아무렇게나 지정해도 됩니다.

 

 

 

UI 파일과 Python 코드의 연결

 

UI파일과 Python코드를 연결 방법은 2가지로 나뉩니다.

 

1) UI파일을 Python 코드에서 import하는 방법

2) UI 파일을 코드로 변환해서 Python 코드에 포함시키는 법

 

코딩유치원에서는 쉬운 방법인 UI파일을 Python 코드에서 import하는 방법에 대해서만 다루도록 하겠습니다.

혹시, 두 번째 방법이 궁금하신 분들은 아래의 링크를 참고해주세요.

 

ybworld.tistory.com/10?category=929856

 

 

UI파일을 Python 코드에서 import하는 방법

 

UI파일과 동일한 위치에 Python파일을 하나 만든 후, 아래의 코드를 그대로 복사/붙여넣기 합니다. 이때 중간에 있는 "UI파일이름.ui"는 자신이 가지고 있는 UI의 이름으로 수정해주셔야 합니다.

 

import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic   # ui 파일을 사용하기 위한 모듈 import

#UI파일 연결 코드
UI_class = uic.loadUiType("UI파일이름.ui")[0]


class MyWindow(QMainWindow, UI_class) :
    def __init__(self) :
        super().__init__()
        self.setupUi(self)

app = QApplication(sys.argv) 

Window = MyWindow() 

Window.show()

app.exec_()

 

위의 코드를 실행시켰다면 성공적으로 Qt Designer를 이용하여 제작한 GUI가 표시되는 것을 볼 수 있습니다.

다음 시간에는 지금까지 배워왔던 것을 갖고 간단한 기능을 하는 GUI 프로그램을 만들어보겠습니다.

반응형
반응형

오늘은 주말에 읽은 에리히 프롬이 1941년에 출판한 '자유로부터의 도피'에 대한 독후감을 써보려 한다.

 

 

이 책은 사회심리학 분야의 고전으로 예전에 한 번 펼쳤다가 생각보다 높은 난이도에 접어두었던 책이었다.

적지 않은 책을 읽어왔지만 손꼽히게 힘들었다.. 약간만 집중을 안해도 문장이 이해 안가는 그런 느낌이랄까.

 

자유로부터의 도피는 중세 사회의 붕괴와 그로 인해 얻게 된 자유가 가져온 인간의 불안이라는 현상을 분석한 책이다.

 

이 책의 내용을 최대한 쉽게 요약하면 다음과 같다.

 

중세시대에는 아주 특수한 경우를 제외하고는 태어난 곳을 떠나지 못하고, 농민, 장인, 기사 등의 역할이 태어나면서 정해져서 바꿀 수 없었다.

모든 것이 태어나면서 정해진 사회, 이러한 사회 체제는 자연적 질서로 여겨졌고, 그 체제의 확실한 일부가 되는 것은 안전감과 소속감을 주었다.

 

 

근대인은 여러 혁명들을 통해 중세시대의 신분제, 종교의 굴레에서 벗어나 경험해보지 못한 자유를 얻게 되었다.

자유는 근대인에게 독립성과 노력을 통해 삶을 바꿀 수 있는 가능성을 가져다주었다.

하지만 한편으로는 완전히 독립된 존재로서 외부의 거대한 세계와 마주하게 되면서 개인을 무력하고 고립된 존재로 만들었다.

 

인간에게는 식욕, 갈증, 수면욕과 같이 충족시키지 않으면 생존이 불가능한 생리적 욕구만큼 중요한 욕구가 있다.

이 욕구는 인간을 사회적 동물이라고 부르게 하는 이유이며, 그것은 바로 '외부 세계와 관계를 맺고자 하는 욕구, 즉 고독을 피하려는 욕구다.

혼자 고립되어 있다는 느낌은 정신적 분열을 초래할 정도로 소속감은 매우 중요하다.

 

 

갑자기 주어진 자유의 무게가 버거운 개인들은 스스로 기계의 작은 톱니가 되어 자유로운 인간이 아닌 자동인형이 되고 싶은 유혹에 사로잡힌다. 그래서 수 많은 개인들은 어딘가에 종속되어 자발적으로 권위에 복종하며, 안전감과 소속감을 얻는 방식을 선택해왔다. 이 책에서는 여러가지 예들 중 한가지로 독일의 '파시즘'을 예로 든다.

 

책에서는 '적극적인 자유'를 얻기 위한 방법으로 다음과 같은 방법을 제시한다.

 

- 사랑과 일 모두에서 능동적이고 자발적으로 살며, 자신의 감정적, 감각적, 지적 능력을 진정으로 표현하는 것

- 개인의 가치관을 외부 요구에 의한 것이 아닌 자신의 판단으로 세우는 것, 그것을 추구하며 자아실현 하는 것

- 성공만 바라보고 현재를 희생하는 것이 아닌, 지금 이 순간을 생생하게 경험하고 느끼며 소중히 여기는 것

 

이를 통해 바깥 세계와 자연스럽게 관계를 맺을 수 있으며, 그리하여 자신의 개체적 자아의 독립성과 본래의 모습을 포기하지 않고도 인간과 자연 및 그 자신과 다시 일체가 될 수 있다고 말한다.

 

여기까지가 책의 내용이고, 나의 생각을 써보고자 한다.

 

개인들은 시대가 바뀌어도 여러 방식과 모습으로, 자신의 자유를 어디엔가 반납하고 안정감을 취해왔고 현재는 직장인이라는 형태로 존재한다고 생각이 들었다. 물론 회사를 다닌다는 것 자체가 나쁘다고는 생각하지 않는다. 큰 일을 하기 위해서는 혼자서는 한계가 있으며, 가장 효율적인 조직인 기업에서 시스템을 체험하고 배우는 것은 도움이 된다. 또한 당장의 생계를 해결한다는 점에서도 의미가 있다.

 

하지만 지금 내가 하는 일이 의미 없다고 느껴지고, 시간을 팔아서 돈을 받고 있다는 느낌이 든다면.. 그럼에도 현재의 월급과 안정감, 소속감을 버릴 수 없거나 내 능력에 자신이 없어서 회사에 꼭 붙어있어야겠다는 생각이 든다면 그것이 바로 이 책에서 언급한 자유를 포기하는 행위가 아닌가 싶다.

 

자유는 개인에게, 아니 나에게 여전히 무거운 존재라고 생각한다. 과거 학창시절 방학에 학교를 가지 않을 때는 넘쳐나는 시간을 어찌할 바를 몰라 허투루 쓴적이 많고, 현재도 주말에 많은 시간을 밀도있게 쓰지 못하는 나 자신을 발견하곤 한다. 또한 개인의 능력과 노력에 따라 엄청난 빈부의 차이를 만드는 자본주의 시대에서 내 능력에 대한 끝없는 의심은 나를 불안하게 만든다.

 

솔직히 나는 아직 '적극적인 자유'를 얻지 못하고 있다. 여전히 직장인으로 회사의 보호와 안정적인 월급을 받으며, 평균에 비해 좋은 환경에서 일한다는 위안을 얻고 있다. 여전히 사회가 보편적으로 원하는 성공의 모습을 추구하며, 현재를 있는 그대로 즐기지 못하고 미래를 걱정하며 살아가는 중이다.

 

이 책을 읽는다고 당장 내 삶이 드라마틱하게 바뀌지는 않을 것을 잘 안다. 하지만 이 책을 통해, 나를 비롯한 현대인들이 느끼는 불안감이 어디에서 비롯된 것인지 알 수 있었고, 어떻게 해야 불안감을 해결할 수 있는지 어렴풋이 알게 되었다. 여기에 적을 수는 없지만 내가 생각한 방법들을 오늘부터 내 삶에 적용해보고자 한다.

 

물론 내가 결론 내린 그 방법들이 먼 훗날 되돌아봤을 때 정답이 아닐수도 있다.

그러면 어떠한가? 지금의 내가 선택했고 옳다고 생각하는 것. 그것을 용기있게 실행하는 것이 적극적인 자유고 진정한 행복이 아닐까 싶다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

<GUI 프로그래밍 관련 이전 글>

 

출처. WIKIPEDIA

2021.05.07 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] PyQt5 기초_1강.PyQt의 개념과 창 만들기 (창 이름, 사이즈, 변경 및 아이콘 삽입)

2021.05.08 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] PyQt5 기초_2강.위젯의 종류, 시그널과 슬롯, 이벤트 루프

2021.05.10 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] PyQt5 기초_3강.Qt Designer로 내마음대로 GUI 구성하기

 

지난 시간에는 PyQt가 무엇인지, 대충 어떻게 생겼고 기본적인 창을 만들고 조금조금 바꿔보는 것을 배워봤습니다.

 

그런데 창 안에는 아무것도 존재하지 않았죠? 오늘은 그 안을 어떤 위젯으로 채울 수 있는지 간단하게 알아보고, 위젯을 조작했을 때 어떤 방식으로 함수와 연결되는지에 대해서 알아보겠습니다.

 


 

위젯의 종류

 

위젯이란 지난 시간 배운 Window라는 Container에 담을 수 있는 내용물을 뜻합니다.

 

PyQt에는 아래와 같은 위젯들이 존재하며, 각각 다른 모양과 기능을 가지고 있습니다. (여기 있는 것 외에도 위젯들이 있을 수 있습니다)

 

위젯 종류 세부 위젯 종류
버튼 푸쉬버튼(QPushButton)

라디오버튼(QRadioButton)

체크박스(QCheckBox)
출력 한줄 문자열(QLabel)

여러줄 문자열(QTextBrowser)

사진(QPixmap)

작업진행도(QProgressBar)
입력 한줄 문자열 입력(QLineEdit)

여러줄 문자열 입력(QTextEdit, QPlainTextEdit)

여러 개 선택지 중 하나 선택(QComboBox)

상하 버튼으로 숫자 조절(QSpinBox, QDoubleSpinBox)

슬라이드와 다이얼(QSlider, Qdial)

날짜/시간 (QDateTimeEdit, QDateEdit, QTimeEdit), 

 

참고로, 우리는 위젯 구성을 다음시간에 배울 Qt Designer라는 프로그램으로 할 것입니다. 

아래 이미지는 Qt Desinger의 위젯 상자입니다. 여기서 원하는 위젯을 골라서 '드래그 앤 드롭' 하여 사용할 거예요.

 

 

 

시그널과 슬롯

 

아직 위젯을 만드는 법은 배우지 않았지만 위젯을 추가했다고 가정해봅시다. 현재의 위젯은 마치 그림의 떡과 같이 아무 쓸모가 없습니다.

그래서 우리는 이 위젯이 어떤 기능을 할 수 있도록 추가적인 코드를 작성해주어야 합니다.

 

위에서 살펴본 위젯들 중, 가장 기초적인 버튼 위젯을 예로 설명해보겠습니다.

 

사용자가 버튼을 클릭하는 행위를 입력(Input),

위젯에 어떤 입력이 들어왔을 때 발생하도록 정의된 이벤트를 시그널(Signal),

시그널이 발생했을 때 수행할 함수를 '이벤트 핸들러' 혹은 슬롯(Slot)이라고 합니다.

 

쉽게 비유하자면 제가 친구의 옆구리를 찌른 것이 '입력'이고, 친구가 받은 옆구리의 통증이 시그널, 친구의 반응이 '슬롯'이죠.

 

시그널은 위젯마다 다르며, 하나의 위젯에 여러개의 시그널이 존재할 수 있습니다.

이 부분을 하나하나 다루기에는 너무 양이 방대하여 링크로 대신하도록 하겠습니다.

 

[위키독스] 초보자를 위한 Python GUI 프로그래밍 - PyQt5  (위젯과 레이아웃 링크)

wikidocs.net/35483

 

 

슬롯은 우리가 직접 함수로 정의해주면 됩니다. 아래의 코드를 보시죠.

 

import sys
from PyQt5.QtWidgets import *

class MyWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()
        
    def initUI(self):    
        btn = QPushButton("버튼", self)
        btn.clicked.connect(self.surprise)

    def surprise(self):
        print("으엌! 깜짝이야!!")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    app.exec_()

 

이 코드에서 먼저 입력과 시그널, 슬롯은 무엇일까요?

 

입력은 '사용자의 물리적인 마우스 클릭과 마우스를 통해 변화된 전자적 입력'입니다.

 

시그널은 btn.clicked.connect( )에서 .cliked 입니다.

이 코드는 btn이란 이름의 QPushButton의 인스턴스가 클릭되었을 때, ( )안의 메소드(슬롯)와 연결해주는 역할을 하죠.

 

슬롯은 def surprise(self): 로 정의하였습니다. 이 슬롯은 위에서의 .connect( )로 시그널과 연결되는 것입니다.

 

 

이벤트 루프

 

혹시 지난 시간에 배웠던 코드 중에 닫기 버튼 누를 때 까지 계속 GUI 프로그램을 실행시키는 코드를 기억하시나요?

 

app.exec_( ) 를 프로그램의 마지막에 입력하시면 루프를 돌며, '닫기' 이벤트가 발생하기 전까지 GUI 창을 계속 띄워놓는 코드입니다.

그래서 이벤트 루프라고 부르며, 이벤트라는 것은 사용자가 마우스클 클릭하거나 키보드를 입력하는 것과 같은 동작을 의미합니다.

 

참고로, exec_( ) 앞에 붙는 app은 QApplication 클래스의 인스턴스이며, 이름은 app 말고도 원하는대로 지어주시면 됩니다.

 

exec_( ) 메서드를 호출하면 이벤트 루프가 생성되고 실행됩니다. 이를 보다 명확히 알아보기 위해 다음과 같이 print( ) 함수를 추가해서 커맨드 창을 관찰해보시면 좋을 것 같습니다.

 

import sys
from PyQt5.QtWidgets import *

class MyWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()
        
    def initUI(self):    
        btn = QPushButton("버튼", self)
        btn.clicked.connect(self.surprise)

    def surprise(self):
        print("으엌! 깜짝이야!!")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    app.exec_()
    
#해당 코드 실행 시 부터 이벤트 루프 발생 (즉, 이 코드 아래로는 이벤트 발생 전까지 안내려감)
app.exec_()

print("루프 밖")

 


 

이번 시간에는  위젯의 종류와 입력/시그널/슬롯 간의 관계에 대해서 알아보았습니다.

 

다음 시간에는 Qt Designer를 이용해 위젯을 실제로 구성해보고, 슬롯을 정의해서 연결시켜보면서 실제 프로그램을 만들기 위한 공부를 해보겠습니다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

PyQt를 사용하기 위해서는 클래스(class)에 대한 이해가 선행되어야 합니다.

 

2021.05.02 - [파이썬 기초/중급 문법] - [파이썬 중급 문법] 클래스(class) 총정리 1편_객체,속성,메소드,인스턴스

2021.05.03 - [파이썬 기초/중급 문법] - [파이썬 중급 문법] 클래스(class) 총정리 2편_ 초기화, 상속, 메소드 오버라이딩, 클래스 변수, 인스턴스 변수

 

 

<파이썬 GUI 프로그래밍 관련 지난 글>

 

2021.05.07 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] PyQt5 기초_1강.PyQt의 개념과 창 만들기 (창 이름, 사이즈, 변경 및 아이콘 삽입)

2021.05.08 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] PyQt5 기초_2강.위젯의 종류, 시그널과 슬롯, 이벤트 루프

2021.05.10 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] PyQt5 기초_3강.Qt Designer로 내마음대로 GUI 구성하기

 


1. PyQt란?

출처. WIKIPEDIA

 

 

PyQt는 Python + Qt를 합쳐서 지은 이름으로, C++ 기반의 GUI Framework인 Qt를 Python에서 사용할 수 있게 만든 패키지입니다.

 

Python에는 기본적으로 내장되어있는 Tkinter라는 GUI 모듈이 있지만, 오로지 코딩으로 우리가 만들 GUI를 구현해야하는 불편하다는 단점과 무엇보다 시각적으로 예쁘지 않다는 치명적인 단점이 있습니다. 그냥 고민없이 PyQt를 사용하시면 되겠습니다.

 

추후 배울 Qt Designer라는 프로그램을 이용하면, 드래그 앤 드롭 방식으로 너무나도 쉽게 GUI를 구성할 수 있습니다.

우리가 할 일은 GUI의 위젯(버튼, 슬라이드 등)을 조작했을 때, 우리가 코딩해놓은 함수가 작동하도록 연결만 해주기만 하면 되는 것입니다.

 

궁극적으로는 내가 만든 파이썬 프로그램을 파이썬을 모르는 사람도 쉽게 조작할 수 있는 말그대로 어플리케이션을 만들 수 있습니다.

 

2. PyQt 기초

 

가장 처음 말씀드렸듯이 PyQt를 사용하려면 클래스(class)의 개념을 조금 알고 계셔야합니다.

추천드린 지난 글을 보고 오셨다면 더 이해가 쉽겠지만 안보셨더라도 이해하실 수 있도록 최대한 쉽게 설명드려 보겠습니다.

 

참고로 클래스는 도면이고, 객체는 도면으로 만든 어떤 실체, 메소드는 클래스 안에 정의된 함수(도면의 내용)라고 생각하시면 됩니다.

 

PyQt5를 사용하여 아주아주 간단한 GUI 프로그램을 만들어보았습니다.

 

참고로 Anaconda를 설치하셨다면 pyqt 패키지는 이미 설치되어 있으니, 따로 설치하지 않으셔도 PyQt5 패키지가 import 됩니다.

 

<전체 코드>

import sys
from PyQt5.QtWidgets import *

app = QApplication(sys.argv)

window = QWidget()
window.show()

app.exec_()

 

<코드 설명>

 

1) 관련 패키지 import

import sys

from PyQt5.QtWidgets import *

 

가장 먼저 파이썬 내장 라이브러리에 존재하는 sys모듈을 import합니다.

sys 모듈은 파이썬 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모듈입니다. (점프 투 파이썬 sys 모듈 설명 참고)

 

PyQt5 패키지의 QtWidgets 모듈에서 전체를 가져오는 코드입니다. import *의 *는 모듈을 전부 가져온다는 의미입니다.

 

 

2) PyQt 필수 객체 생성 - QApplication(sys.argv)

app = QApplication(sys.argv)

 

QApplication( ) 클래스로 app이란 이름의 객체를 생성하는 코드입니다.

QApplication는 QtWidgets 모듈 안에 존재하는 여러 메소드(함수) 중의 하나이며, PyQt를 사용하면 무조건 써야하는 클래스입니다.

 

이때 현재 소스코드 파일에 대한 경로를 담고 있는 리스트(sys.argv)를 클래스의 생성자(초기화 메서드, __init__)로 전달해주어야 합니다.

궁금하신분은 print(sys.argv)로 안에 무엇이 들었는지 확인해보세요.

 

참고로, argv는 가변적인 개수의 문자열(arguments vector)을 의미한다고 합니다. 

 

 

3) 기능없는 창(window) 만들어보기

window = Qwidget( )

window.show( )

 

Qwidget( )은 실제로 화면에 보여지는 윈도우를 생성하는 클래스입니다.

이를 이용해 window라는 이름으로 객체를 생성한 후에 show 메소드로 창을 띄워줍니다.

 

여기서 Qwidget( )는 그냥 창의 껍데기만 만드는 것이라고만 이해하고 넘어가도록 합시다.

 

 

4) 닫기 버튼 누를 때 까지 계속 실행하는 코드

app.exec_()

 

위의 소제목과 같이 닫기 버튼을 누를 때 까지, 루프를 돌며 GUI 창을 계속 띄워놓는 코드입니다.이 부분은 다음 강의에서 자세히 설명드릴테니, 이정도로 이해하고 넘어가겠습니다.

 

 

3. 나만의 윈도우 만들기

 

아래와 같이 아이콘과 창 이름을 넣어주고, 원하는 위치에 원하는 크기로 창을 띄우는 실습을 통해서 PyQt에 대해서 알아보도록 하겠습니다.

 

 

1) 윈도우 생성

 

PyQt에서 모든 위젯의 가장 기초가 되는 위젯을 윈도우라고 부릅니다. GUI를 만드는 것을 그림 그리는 것이라 생각하면 윈도우를 생성하는 것은 도화지를 준비하는 것입니다. 

 

<도화지 코드>

import sys
from PyQt5.QtWidgets import *

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()


app = QApplication(sys.argv)

window = MyWindow()   
# 위의 기본 코드와 다른 점
# QMainWindow 클래스를 상속받은 MyWindow 클래스를 선언
# 그 후 부모클래스를 의미하는 super()메소드와 그 클래스의 속성을 불러오는 __init__ 초기화 메소드 사용
# QMainWindow의 속성이 무엇인지는 모르겠음

window.show()

app.exec_()

 

아까 처음 본 코드와의 차이점은 class MyWindow 부분과 window = MyWindow( ) 부분 입니다.

 

나만의 윈도우 클래스를 만들어서 사용하기 위해 PyQt가 제공하는 QMainWindow를 상속 받아서 MyWindow라는 클래스를 정의해주어야 합니다.

 

한마디로 MyWindow라는 클래스의 역할은 객체를 생성했을 때, 부모 클래스인 QMainWindow의 def __init__의 속성과 메소드를 불러오거나 실행시켜주는 역할이라고 생각하면 됩니다.

 

 

2) 윈도우 타이틀 변경

 

원하는 창의 이름을 넣어 주고 싶을 땐 아래와 같이 setWindowTitle( ) 메소드를 사용합니다.

def __init__(self) 메소드 안에 self.setWindowTitle("원하는 창 이름")을 넣으주면 됩니다.

 

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
		
        # 도화지 코드의 이 위치에 아래 코드 한 줄을 추가할 것
        self.setWindowTitle("코딩유치원 GUI")

 

3) 윈도우 크기 변경

 

QMainWindow 클래스에는 윈도우의 출력 위치 및 크기를 변경하는 메서드인 setGeometry( )가 정의되어 있습니다.

 

아래의 코드는 setGeometry( ) 메서드를 사용해서 창의 좌측상단 꼭지점의 좌표가 300, 300이며 창의 크기가 400x400이 되도록 윈도우를 셋팅하는 코드입니다.

 

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
		
        # 도화지 코드의 이 위치에 아래 코드 한 줄을 추가할 것
        self.setGeometry(300, 300, 400, 400) # 차례대로 창위치 x,y, 창크기 x,y

 

4) 윈도우에 예쁜 아이콘 넣기

 

구글에서 icon-icons 사이트를 검색하거나 아래의 링크에서 아이콘 이미지 다운로드합니다. 테스트 해보니, 이미지 사이즈는 상관 없습니다.

 

icon-icons.com/ko/

 

무료 아이콘 SVG, PNG, ICO 또는 ICNS

 

icon-icons.com

 

다운로드한 아이콘 파일을 파이썬 코드와 동일 디렉터리로 이동시킵니다.

 

다음으로는 코드로 돌아와서, QIcon( ) 클래스를 사용하기 위하여 from PyQt5.QtGui import * 를 추가해 줍니다.

 

윈도우에서 아이콘의 설정은 setWindowIcon() 메서드를 사용하며, QIcon 클래스의 인스턴스를 인자로 받습니다.

 

QIcon 클래스의 인스턴스를 생성할 때는 인자로 아이콘 파일의 경로를 문자열로 넘겨주면 됩니다.

현재 예에서는 소스코드와 아이콘 파일이 같은 디렉터리에 있기 때문에 파일 이름만 적어주면 됩니다.

 

# 아이콘 삽입 클래스(QIcon) 사용을 위한 PyQt5 패키지의 QtGui 모듈 import
from PyQt5.QtGui import *


class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        
        # 해당 위치에 아래 코드 추가
        self.setWindowIcon(QIcon("pie-chart.png")) 

 


오늘은 아주 PyQt의 아주 기초적인 창만들기에 대해서 배워보았습니다.

 

다음 시간에는 위젯과 이벤트에 대한 내용을 공부해보겠습니다.

반응형
반응형

오늘 연애의 참견이란 프로그램을 보는데 재밌는 사연이 있었다.

 

자기 스스로 선택을 못하는 선택장애가 있는 29세의 남자친구와 만나고 있는 28세 여성분이 보낸 사연이었다.

 

아픈데 병원을 갈지 말지, 출장을 가는데 경로 2개 중 어느 경로가 좋을지, 회사를 다니다가 경찰공무원을 준비하고 싶어졌는데 다니면서 할지 그만두고 준비할지 등등..

 

여기서 더 문제인 것은 여자친구의 조언으로 선택을 해놓고 결과가 안좋으면 여자친구 탓을 한다는 것이었다.

 

이 사연을 보면서 바로 드는 생각은 '남자가 참 어린애 같다'라는 것이었다.

마치 어린애들이 뭔가 잘 안되면 '이게 다 엄마때문이야!'라고 하는 느낌?

 

나이만 먹는다고 어른이 되는 것은 아니다

 

 

 

 

기원전 1세기, 로마의 철학자 세네카는 이런 말을 남겼다.

 

"출항과 동시에 사나운 폭풍에 밀려다니다가 사방에서 불어오는 바람에 같은 자리를 빙빙 표류했다고 해서, 그 선원을 긴 항해를 마친 사람이라고 말할 수는 없을 것이다. 그는 긴 항해를 한 것이 아니라 그저 오랜 시간을 수면 위에 떠 있었을 뿐이다."

"그렇기에 노년의 무성한 백발과 깊은 주름을 보고 그가 오랜 인생을 살았다고 단정할 수는 없는 일이다.
그 백발의 노인은 오랜 인생을 산 것이 아니라 다만 오래 생존한 것일지도 모른다."

 

세네카가 말하고 싶었던 것은 외력에 의해서 표류하는 인생이 아닌, 역경을 뚫고 목표를 갖고 항해하며 성장하는 삶을 살라는 것이 아닐까?

 

 

어른이 된다는 것

 

 

 

 

나이가 어린이와 어른의 차이를 나누는 것이 아니라면 무엇으로 결정되는 것일까?

 

내가 생각하는 어른은 내 선택, 내뱉은 말 그리고 행동에 책임을 지는 사람이다.

 

이것이 절대 만만한 일이 아니라는 것을 나이가 들어가면서 더 많이 느낀다.

 

결혼을 하고 아이가 생기고, 가장으로서 내 가족의 생계를 책임진다는 것,

직장에서 점점 아랫사람들이 많아지고, 내 선택에 의해 부하직원들의 생계가 좌지우지 된다는 것.

 

그 상황에서 어떤 선택을 하고 그것에 책임진다는 것은 크나큰 용기가 필요한 일이다.

나의 선택 하나하나에 많은 것들이 영향을 받기 때문에 내 선택은 신중해질 수 밖에 없다.

 

평범한 사람이라면 자연스럽게 내가 컨트롤 할 수 있는 익숙한 것들만 고집하게 되고 도전적인 일은 지양하게 된다.

선택을 회피하게 되고, 관성에 의해 내가 살아왔던 대로 그냥 현상을 유지하게 되는 것이다.

 

 

회피할수록 내 발목을 붙잡는 것들

 

살아가다보면 중요하지만 하기 싫고 피하고 싶은 일들이 있다.

 

어렸을 때 소심했던 나에겐 사람들 앞에 나서서 발표하는 일이 었던 것 같다. 그 외에도 영어 공부가 싫었다.

 

내가 살면서 깨달은 것은 위에서 언급한 것들을 회피하면 결국엔 내 발목을 붙잡는다는 것이다.

 

그래서 대학생 때의 나는 피할 수 없으면 즐겨라라는 말을 받아들이고, 조별 과제에서 발표할 일이 있으면 나서서 발표를 하고,

영어를 잘하기 위해서 외국인 교환학생들의 도우미를 하기도 하며 불편한 것에 익숙해 지려고 노력했던 것 같다.

 

무엇인가를 선택하는 것도 마찬가지라 생각한다.

 

한살이라도 젊을 때, 내 선택에 의해 잃을 것들이 적을 때, 더 과감한 도전을 하고 많은 시행착오를 겪어야 한다.

 

만약 젊을 때부터 안정된 것만 찾고, 내 선택에 대한 결과가 두려워 선택을 회피한다면, 정작 중요한 결정이 필요한 순간엔 아무 선택도 못하게 되지 않을까?

 

부디 미래의 나는 선택을 회피하거나 현실에 안주하는 사람이 아닌 매순간의 선택에 책임을 지고 항상 성장해나가는 어른이기를 원한다.

 

 

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

 

 

깃(Git)이란?

 

깃(git)은 프로그램의 개발 시, 소스 코드의 버전을 체계적으로 관리하기 위해 만들어진 분산 버전 관리 시스템입니다.

저는 제조 회사를 다니고 있는데, 관리는 이력 관리가 기본이라는 것을 많이 느꼈습니다. 인간의 기억력은 한계가 있으니까요!

그런 관점에서 코드의 수정이 더욱 빈번하게 일어나는 프로그램 개발자 사이에서 Git은 매우 유용하고 필수적인 도구가 아닌가 싶습니다.

 

깃은 네트워크를 통한 중앙 서버에 소스 코드를 저장하는 것이 아니라, 자신의 컴퓨터에 로컬 저장소를 만들어 저장하는 것이 특징입니다.

로컬 저장소에 저장하는 것의 장점은 인터넷이 없는 환경에서도 마음껏 코딩하고, 깃을 이용해 이력 관리를 한 후, 인터넷이 연결된 환경에서 깃허브(GitHUb)와 같은 웹 호스팅 서비스에 등록하여 사람들과 협업할 수 있습니다.

 

깃 만큼 많이 쓰이는 버전 관리 시스템에는 SVN(Subversion)이라는 것이 있습니다. SVN은 중앙 집중식 소스코드 관리이지만, 깃은 분산 소스코드 관리 방식을 사용합니다. 그렇기 때문에 중앙의 저장소에 문제가 생기면 SVN은 큰 문제가 되겠지만 깃은 분산된 로컬 저장소를 활용한 중앙 저장소 복구가 가능하다는 장점이 있습니다.

 

앞서 언급한 인터넷 환경에 구애받지 않는 점, 유사시 중앙 저장소 복구가 가능하다는 점으로 인해 최근에는 SVN을 사용하던 많은 기업들도 깃(Git)으로 많이 전환하고 있는 추세입니다. 

 

 

 

깃허브(GitHub)란?

 

앞서 설명드린 깃(Git)으로 관리하는 프로젝트를 호스팅해주는 웹 서비스이며,  깃 저장소 서버를 대신 유지 및 관리해주는 서비스입니다. 

다른 유저들과 함께 온라인으로 하나의 프로그램을 제작하는 것도 가능하여, 많은 오픈소스 프로그램들이 github을 통해서 전세계 유저들에 의해 제작되고 있습니다. 참고로 오픈소스 프로젝트는 무료이며, private 프로젝트는 유료입니다.

 

깃허브에 저장하는 것은 매번, 매버전을 모두 저장하고 업로드하는 방식이 아닌 각 버전들의 차이 혹은 변경이력을 저장하는 것입니다.

이를 통해서 훨씬 적은 용량으로 많은 버전 이력들을 저장할 수 있는 것입니다.

 

GitHub 사용을 위한 기본지식

 

깃허브 개념도

저장소(repository)


저장소(repository)는 파일이나 디렉토리를 저장하는 장소입니다. 기본적으로 PC에 존재하는 로컬 저장소에서 작업을 진행하고 그 결과를 GitHub의 원격 저장소에 저장할 수 있습니다.

 

1. 메인 저장소(Main repository)

 

메인 저장소는 오픈소스 프로젝트의 github상의 메인 repository를 의미하며 upstream이라고도 부릅니다. 이 저장소는 세계적인 프로그래머가 만든 큰 프로젝트의 저장소이므로 나에게는 쓰기 권한이 없습니다. 실력이 된다면 메인 저장소의 주인에게 나의 변경사항을 반영해달라고 요청할 수 있습니다. 만약 채택된다면 거대한 프로젝트의 컨트리뷰터(Contributor)가 되는 명예를 얻게 된다고 하네요.

 

2. 원격 저장소(remote repository)

 

내 로컬 저장소의 버전을 업로드하거나 메인 저장소의 

github상에서 나의 계정상에 존재하는 전용 repository로 메인 저장소로 부터 fork(코드를 가져오는 것)한 저장소입니다. 일반적으로 이를 origin이라고 부릅니다.

 

3. 로컬 저장소(Local git repository)

 

검퓨터에 생성한 로컬 저장소를 말합니다. 깃 저장소를 만들게 되면 해당 디렉토리에 .git/ 폴더가 생성됩니다.

흔히 개발자들이 말하는 '1일 1 커밋'의 커밋은 작업 공간에서 로컬 저장소로 업로드하며, 기록을 남기는 것을 말합니다.

 

4. 작업 공간(workspace)

 

내 컴퓨터 상에서 실제 내가 소스를 개발하고 수정하는 workspace를 의미합니다. 쉽게 말해서 우리가 코딩을 위해 만든 폴더라고 생각하시면 됩니다.

 

 

브랜치(branch)

소프트웨어는 출시된 이후에도 지속적인 유지 보수를 통해 기능을 추가하거나 버그를 수정하게 됩니다. 브랜치란 독립적으로 개발이나 유지/보수 작업을 진행하기 위한 개념입니다. 필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있으며, 추후에 병합(merge)하여 새로운 하나의 브랜치로 모을 수 있습니다.

 

자세한 내용은 아래 링크를 참고하시면 좋겠습니다. 글 쓰는 마지막에 발견한 곳인데 깃과 깃허브에 대해서 너무 잘 정리되어있네요!

 

https://backlog.com/git-tutorial/kr/stepup/stepup1_1.html

 

누구나 쉽게 이해할 수 있는 Git 입문~버전 관리를 완벽하게 이용해보자~ | Backlog

누구나 쉽게 알 수 있는 Git에 입문하신 것을 환영합니다. Git을 사용해 버전 관리를 할 수 있도록 함께 공부해봅시다!

backlog.com

커밋(commit)

파일을 추가하거나 변경사항을 저장소에 기록하기 위해 커밋 메시지를 남기는 작업을 말합니다.변경한 사람, 시간, 변경 내용 등을 기록해 과거 변경 이력과 내용을 손쉽게 파악할 수 있습니다. 좋은 커밋 메시지를 작성하는 Tip을 정리한 글을 아래에 링크해놓았으니 참고해주세요.

 

https://meetup.toast.com/posts/106

 

좋은 git 커밋 메시지를 작성하기 위한 7가지 약속 : NHN Cloud Meetup

git커밋

meetup.toast.com

 

클론(Clone)

클론을 사용하면 원격 저장소의 코드를 내 컴퓨터에 받아올 수 있고 로컬 저장소(.git)도 자동으로 생기게 됩니다. 이어서 설명할 Pull과 Clone은 비슷하지만 다른 점이 있습니다. Clone은 로컬에 아무것도 없는 상태에서 원격저장소의 데이터를 가져오는 것을 의미하지만, Pull은 로컬에 이미 코드가 있고, 원격저장소의 수정 상태를 반영하기 위해 하는 것 입니다.

 

풀(Pull)

원격 저장소 변경 사항을 받아오는 것을 말합니다. 공동작업의 경우, 다른 사람이 원격 저장소에 업데이트한 파일이 있을 때 원격저장소와 내 로컬저장소의 상태를 동일하게 만들기 위해 pull을 이용합니다. Clone과 Pull 모두 원격저장소에서 로컬저장소로 가져오는 것이므로 헷갈리기 쉬우니 차이를 잘 이해하시고 넘어가시면 좋겠습니다.

 

푸쉬(push)

로컬 저장소에 저장되어 있던 커밋을 원격 저장소(GitHub)로 업로드하는 것을 말합니다.

 


참고자료

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 파이썬 프로그래밍의 초보에서 벗어나기 위한 첫번째 단계로, 클래스(class)에 대해 알아보겠습니다.

(이 글은 TCP 스쿨의 파이썬 강의를 참고하여 공부한 후 정리한 글입니다.)

 

이 글은 지난 글과 이어지는 글이므로, 지난 글을 읽고 읽으시면 이해에 도움이 됩니다.

 

https://coding-kindergarten.tistory.com/56

 

[파이썬 중급 문법] 클래스(class) 총정리 1편_객체,속성,메소드,인스턴스

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. 코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도

coding-kindergarten.tistory.com

 

 


 

1. 초기화 메소드 ( __init__ )

 

지난 시간 class에 대해서 설명하며 예로 들었던 코드를 다시 보겠습니다. 사실 쉬운 이해를 위해서 아래와 같이 코딩했지만 당연히 실제로는 계좌번호나 계좌잔액에 정해진 값을 넣어 두진 않겠죠? 클래스를 1회용으로 만들지는 않을테니까요!

 

class ATM:                    # 클래스 선언

    계좌번호 = "123456789"      # 속성 선언
    계좌잔액 = "30000"


    def withdraw_all(self):   # 메소드 선언

        print(self.계좌번호 + "에서" + self.계좌잔액 + "을 인출하겠습니다.")
        

Coding_ATM = ATM()          # 인스턴스 생성

print(Coding_ATM.계좌번호)    # 인스턴스의 속성 가져오기
Coding_ATM.withdraw_all()   # 인스턴스의 메소드 호출

 

그래서 우리는 계좌번호와 계좌잔액을 입력받는 메소드를 가장 처음에 만들어줍니다. 이것도 코드로 보시죠.

이렇게 하면 인스턴스를 생성하고 setInfo 메소드를 이용해서 입력값을 받아서 모든 고객용으로 사용가능할 것입니다.

 

class ATM:                   

    def setInfo(self, 계좌번호, 계좌잔액):
    	
        self.계좌번호 = 계좌번호
        self.계좌잔액 = 계좌잔액

    def withdraw_all(self):

        print(self.계좌번호 + "에서" + self.계좌잔액 + "을 인출하겠습니다.")



Coding_ATM = ATM()   # 인스턴스 생성

Coding_ATM.setInfo('123456789', '30000')
Coding_ATM.withdraw_all()

 

하지만 이런 방식은 비효율적입니다. 만약 setInfo 메소드를 가장 먼저 호출해주지 않으면, withdraw_all 메소드에서 사용해야할 인수가 입력되지 않았으므로 오류가 발생하기 때문이죠. 거기다가 코드도 길어지는 단점이 있죠.

 

그래서 지금 배울 초기화 메소드(initialize method)를 사용해줍니다. 앞으로 클래스를 만들 땐 꼭 초기화 메소드를 사용한다고 생각하시면 되겠습니다. 파이썬에서 초기화 메소드의 이름은 __init__으로 고정되어 있습니다.

 

class ATM:                   

    def __init__(self, 계좌번호, 계좌잔액):
    	
        self.계좌번호 = 계좌번호
        self.계좌잔액 = 계좌잔액

    def withdraw_all(self):

        print(self.계좌번호 + "에서" + self.계좌잔액 + "을 인출하겠습니다.")



Coding_ATM = ATM('123456789', '30000')   # 인스턴스 생성 시, 인수를 입력해주어야함

Coding_ATM.withdraw_all()

 

 

2. 클래스 변수 / 인스턴스 변수

 

변수가 선언된 위치에 따라 변수의 유효 범위가 달라지며, 이에 따라 다음과 같이 구분할 수 있습니다.

 

1) 클래스 변수(class variable)

   : 해당 클래스에서 생성된 모든 인스턴스가 값을 공유하는 변수

 

2) 인스턴스 변수(instance variable)

   : __init__() 메소드 내에서 선언된 변수로 인스턴스가 생성될 때마다 새로운 값이 할당되는 변수

 

class ATM:                      # 클래스 선언

    계좌번호 = "123456789"        # 이 방식이 클래스 변수
    계좌잔액 = "30000"
    
    
    def __init__(self, 계좌번호, 계좌잔액):
    	
        self.계좌번호 = 계좌번호    # 이 방식이 인스턴스 변수
        self.계좌잔액 = 계좌잔액    

 

예를 들어, 게임회사의 프로그래머가 게임 캐릭터를 만들 때 계속 사용할 클래스를 만드는 상황을 가정해봅시다.

게임 캐릭터가 공통적으로 가지는 특성은 클래스 변수로 설정해주고, 캐릭터마다 개성을 부여해줄 부분은 인스턴스 변수로 설정해주는 것을 생각해 볼 수 있겠습니다.

 

 

3. 상속

 

여기서의 상속(inheritance)은 여러분들이 아는 그 상속이 맞습니다. 부모가 자식한테 재산을 물려주는 것 말입니다.

여기서 다른 것은 사람이 아니라 클래스인 점이죠. 이 상속의 개념을 이용하면 이미 존재하는 클래스의 속성과 메소드를 모두 그대로 사용할 수 있습니다. 거기다가 기능을 추가할 수도 있답니다.

 

용어를 잠깐 설명드리면, 이미 존재하던 클래스를 부모 클래스(parent class) 또는 기초 클래스(base class)라고 부르며,

상속을 통해 새롭게 생성되는 클래스를 자식 클래스(child class) 또는 파생 클래스(derived class)라고 부릅니다.

 

상속의 사용 예를 들어보겠습니다. 서로 개과와 고양이과로 생김새는 다르지만 새끼를 낳는 ‘포유류’라는 공통적인 특징을 갖는 것입니다.

만약 게임 안에서 개와 고양이를 만들 때, 포유류 클래스를 만들어서 다리는 4개, 새끼를 나음, 눈 2개 등의 특징을 부여하고, 그 클래스를 상속받아서 각각의 개 클래스, 고양이 클래스를 세부적으로 만들어주는 것이죠.

 

클래스 상속은 아래와 같이 간단하게 가능합니다. 이렇게 상속을 통해 만들어진 자식 클래스를 이용해 만든 인스턴스는, 부모 클래스 안의 속성과 매소드를 모두 활용 가능합니다. 상속 그리 어렵지 않죠?

 

class 자식클래스명(부모클래스명):

 

4. 메소드 오버라이딩

 

위에서 배운 상속이 어떤 도면을 복사 붙여넣기 해서 내용을 추가한 것이라면, 메소드 오버라이딩은 상속한 후에 기존 내용을 수정한 것입니다. 즉, 상속한 다음에 메소드를 같은 이름으로 재정의 해주는 것입니다.

 

# 부모 클래스 (일반 새)
class Bird:

    def __init__(self):
        self.flying = True  

    def birdsong(self):
        print("짹짹")    


# 자식 클래스 1 (참새)  --> 상속
class Sparrow(Bird):


# 자식 클래스 2 (닭) --> 상속 후 메소드 오버라이딩
class Chicken(Bird):

    def birdsong(self):
        print("꼬끼오")   


# 객체화
my_sparrow = Sparrow()
my_chicken = Chicken()


# 그냥 상속과 메소드 오버라이딩의 비교
my_sparrow.birdsong()
my_chicken.birdsong()


<결과>

짹짹
꼬끼오

 

 

자세히 보시면 birdsong 메소드를 실행시켰을 때 차이가 생깁니다.

 

단순히 Bird 클래스를 상속받은 Sparrow 클래스는 birdsong 메소드를 실행시켰을 때 "짹짹"을 출력하고,

 

Bird 클래스의 속성을 상속받은 후 birdsong 메소드를 재정의(메소드 오버라이딩) 해준 Chicken 클래스는 "꼬끼오"를 출력하죠?

 


혹시 설명이 잘 이해가 가지 않거나 질문사항 있으시면 댓글 달아주세요!

 

감사합니다.

 

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

오늘은 파이썬 프로그래밍의 초보에서 벗어나기 위한 첫번째 단계로, 클래스(class)의 개념에 대해 알아보겠습니다.

 

새로운 개념을 이해할 때에는 원래 알고 있는 개념에서 덧붙이거나 비유를 통해서 이해하는 것이 효율적이라고 생각합니다.

비유를 통해 최대한 쉽게 설명해볼테니 차근차근 따라와주세요.

 


 

1. 클래스의 개념

 

클래스는 기초문법 강의에서 배운 함수의 개념과 유사하면서도 다릅니다.

 

출처. 프로그래머가 필요한 수학 (brunch)

 

함수란 아래의 그림의 빵 만드는 기계처럼 '밀가루(입력)을 받아서 의도된 프로세스를 통해 빵(출력)을 내보내는 무엇'라고 이해한다면,

클래스 빵 만드는 기계(함수) 입력과 출력(변수)의 정보를 담은 설계도입니다.

 

위의 설명만 이해하셔도 클래스의 절반은 파악하신 것이니 꼭 이해하고 넘어가셨으면 좋겠습니다.

 

 

우리는 이 설계도가 있다면 얼마든지 빵 만드는 기계를 만들 수 있는 것이죠.

또한 이 설계도를 내용을 추가하거나 변경하여 새로운 기능의 빵 만드는 기계를 만들 수 있습니다.

 

위의 내용은 다음 시간에 상속(inheritance)메소드 오버라이딩(method overriding)의 개념을 공부하며 더 자세히 다루어 보겠습니다.

 

 

2. 클래스 기초

 

설계도를 활용 하려면 도면해독법에 대한 지식이 필요하듯이 클래스를 활용하기 위한 기본 개념들이 필요합니다.

 

1) 객체

프로그래밍이 처음이시거나 C언어를 공부하셨던 분들은 객체(object)란 용어가 생소하실텐데요.

객체란 그냥 실체가 있는 무엇이라는 뜻을 있어보이게 표현한 말입니다. 현재 사용하고 계신 컴퓨터나 휴대폰, 앉아있는 의자, 혹은 나 자신 까지도 모두 객체라고 생각할 수 있습니다.

 

이 객체란 개념은 설계도만 존재하고 실체는 존재하지 않는 상태인 클래스와 엮어서 설명되곤 합니다.

여러 책에서 붕어빵 틀(클래스)과 붕어빵(객체)으로 설명합니다만 개인적으로 정확한 비유는 아니라고 생각합니다.

어떻게 보면 붕어빵 틀도 실체일테니까요.

 

2) 속성과 메소드

앞서 클래스를 빵 만드는 기계(함수)와 입력과 출력(변수)의 정보를 담은 설계도라고 설명했습니다.

지금 배울 속성(attribute)과 메소드(method)는 각각 설계도에 표시되어 있는 변수와 함수라고 이해하시면 됩니다.

 

클래스의 변수 = 속성 (attribute)

클래스의 함수 = 메소드 (method)

 

예를 들어, 현금자동인출기(ATM)를 클래스로 작성한다면,

속성으로는 계좌번호, 잔액, 인출금액, 메소드로는 입금하기, 출금하기, 이체하기 등을 만들 수 있을 것입니다.

 

3) 클래스 선언

class의 선언은 'class 클래스명:'으로 선언해줍니다.

 

만약 아래와 같이 클래스를 선언해주면 '클래스명'이라는 이름의 아무 내용도 담기지 않은 설계도가 생성된다고 생각하시면 됩니다.

마치 CAD(전자도면)을 새로 만들고 이름만 정해서 저장해준 느낌입니다.

 

class 클래스명:
	pass

 

다음으로는 클래스 안에 내용을 채워보겠습니다. 이해를 위한 코드이므로 실제로는 작동되지 않습니다.

 

class ATM:                    # 클래스 선언

    계좌번호 = "123456789"      # 속성 선언
    계좌잔액 = "30000"


    def withdraw_all(self):   # 메소드 선언

        print(self.계좌번호 + "에서" + self.계좌잔액 + "을 인출하겠습니다.")

 

우리가 돈을 뽑는 ATM 클래스를 만들어보았습니다.

 

속성으로는 계좌번호와 계좌잔액을 가지며, 메소드로는 계좌잔액을 모두 인출하는 withdraw_all 메소드를 가지는 클래스입니다.

 

여기서 self라는 생소한 개념이 보입니다. 클래스를 사용하려면 이 self에 대한 이해가 필수적입니다.

 

self란?

메소드 선언 시 사용된 self는 객체가 자기 자신을 참조하는데 사용하는 매개변수입니다.

self를 사용하면, 메소드에서 클래스에 정의된 모든 속성 및 다른 메소드에 접근할 수 있습니다.

 

파이썬에서는 메소드를 선언할 때 첫 번째 매개변수로 반드시 self를 명시하도록 하고 있으며, 메소드를 호출할 때는 self 매개변수에 아무런 인수를 전달하지 않아도 됩니다.

 

 

4) 인스턴스 생성

인스턴스란 클래스를 기반으로 생성된 객체를 가리킵니다. 그냥 객체라고 해도 되겠지만 특별히 어떤 클래스의 객체라는 것을 말해주는 느낌이랄까요. 마치 영희(객체)라는 사람이 있는데, 굳이 미영이의 딸(OO 클래스의 인스턴스)이라고 부르는 느낌이라고 생각하시면 되겠습니다. 완벽한 예는 아닌듯하지만 느낌만 가져가시면 좋겠습니다.

 

class ATM:                  # 클래스 선언

    계좌번호 = "123456789"    # 속성 선언
    계좌잔액 = "30000"


    def withdraw_all(self): # 메소드 선언

        print(self.계좌번호 + "에서" + self.계좌잔액 + "을 인출하겠습니다.")
        

Coding_ATM = ATM()          # 인스턴스 생성

print(Coding_ATM.계좌번호)    # 인스턴스의 속성 가져오기
Coding_ATM.withdraw_all()   # 인스턴스의 메소드 호출

 

위의 코드에서 방금 만들어준 ATM 클래스를 가지고 Coding_ATM이라는 객체를 생성해주었습니다.

클래스명에 소괄호( )를 붙여서 해당 클래스의 인스턴스를 생성할 수 있습니다.

 

여기서, 'Coding_ATM은 ATM의 인스턴스다'라고 말할 수 있습니다.

 

Coding_ATM.계좌번호나 Coding_ATM.withdraw_all( )과 같이 생성된 인스턴스에 닷(.) 연산자를 사용하면 해당 클래스의 속성이나 메소드를 호출할 수 있습니다.

 


오늘은 클래스의 가장 기본에 대해서 다루어보았습니다.

 

다음 시간에는 클래스에 대한 조금더 깊은 내용을 다루어보겠습니다.

 

 

반응형
반응형

오늘은 '문제'라는 주제에 대하여 생각을 정리해보려 한다.

 

문제의 정의

 

세상을 살아가다 보면 수 많은 문제에 맞딱드리게 된다.

성적의 문제, 인간관계의 문제, 취업의 문제, 돈 문제 등등..

 

도대체 문제가 왜이리 많은지 생각하기 전에 문제라는 것이 정확히 어떤 의미인지 생각해보자.

 

문제는 원하는 상태와 현재의 상태, 두 상태의 차이를 말한다.

 

예를 들어 보자.

내가 현재 서울에 있고, 일이 있어 내일까지 부산으로 가야하는 상황이다.

현재의 상태는 '서울에 있는 나', 원하는 상태는 '내일 부산에 있는 나'다.

문제는 이 차이, 즉 하루라는 시간 안에 좁혀야하는 서울과 부산 사이의 거리인 것이다.

 

 

사실 문제를 정확히 정의한다는 것은 쉬운 일이 아니다.

목표 설정은 둘째 치고, 나의 위치와 목표의 위치를 파악해야하는데 그것은 쉽게 얻을 수 있는게 아니기 때문이다.

 

진지한 나에 대한 고민과 세상에 대한 공부가 필요한데, 나의 경우엔 책의 도움을 많이 받는 편이다.

책을 통한 간접경험은 아직 가보지 못한 길에 대한 지도를 흐릿하게나마 얻을 수 있는 행위가 아닐까?

 

주어진 문제만 풀어온 사람들

 

앞서 언급 했듯이 인생은 문제의 연속이다. 

 

고등학생 때는 좋은 대학을 가기위해 성적을 잘 받아야하는 문제를 해결하려 애쓴다.

대학생 때는 좋은 학점과 화려한 스펙을 쌓아서 좋은 회사에 들어가려 애쓰고,

어렵게 취업하고 결혼을 생각하니 애인을 구하는 것도, 가진 돈에 비해 집값이 너무 비싼 것도 문제다.

 

그런데 가만히 생각해보면, 방금 언급한 아주 보편적인 문제들은 타인이 나에게 제시해준 문제다.

 

대다수는 왜 좋은 대학을 가야하는지, 좋은 대기업에 들어가야하는지, 결혼은 왜 해야하는지에 대해 생각하지 않는다.

그냥 부모님과 우리가 살아가는 사회가 그런 것을 좋은 것이고 당연한 목표라고 제시하니깐 그냥 그 문제를 해결하기 위해 온 힘을 다한다.

 

옛날에 재밌게 봤던 스카이캐슬이란 드라마에는 강준상 교수라는 캐릭터가 나온다.

 

학력고사 전국 1, 의사, 병원장. 누가봐도 성공했다고 생각되는 삶이다.

 

하지만 강준상은 어떤 사건을 계기로 뒤늦게 지금껏 이뤄온 모든 것이 자신에게 의미가 없다는걸 깨닫는다.

그는 어머니의 욕망을 자신의 욕망이라고 착각하고 살아온 50년의 삶을 되돌아보며 이렇게 말한다.

 

“강준상이 없다고 강준상이. 내가 누군지 모르겠다고.”

 

 

올바른 목표 설정의 중요성

 

 

너무나 당연한 말이지만 내 인생의 주인은 나다. 부모님도, 애인도, 직장상사도 아니다.

반드시 주인인 내가 인생에서 어떤 것을 가치있는 목표로 잡을 것인지 결정해야 한다.

한마디로 가치관을 세워야 한다.

 

고민 끝에 결정한 것이 세상이 정해놓은 가치이더라도 절대로 나쁜 것이 아니다.

좋고 나쁜 것은 오로지 나의 기준, 나의 가치관에 달린 것이니깐.

 

하지만 기준을 정할 때 반드시 하면 안되는 것이 있다. 바로 남의 것과 비교해서 목표를 잡는 일이다.

여기서 말하는 남은 불특정 다수인 경우가 대부분이다. 예를 들면 SNS에 자랑하는 누군가의 집, 차, 재산 등등.

 

이런 목표가 무서운 점은 목표가 계속 재조정되는, 절대 이룰 수 없는 신기루이기 때문이다.

내가 아무리 노력하고 성공을 이루어도, 나보다 뛰어난 사람은 항상 존재한다.

그러므로 타인과의 끝 없는 비교는 나를 지치고 불행하게 만들뿐이다.

 


올바른 목표를 정했다면 우리에게 남은 것은 실행뿐이다.

다른 글에서 언급했듯이 조급함을 이겨내야한다. 꾸준함의 힘을 믿고 목표를 달성하기 위해 노력하자.

목표가 너무 높아서 못 이룰 것 같다면, 목표를 잘게 쪼개어 작은 문제부터 차근차근 해결해보자.

 

자연은 아날로그인데 반해 인간은 한 번에 0에서 1로 되고 싶은 디지털과 같은 욕심을 가졌다고 생각한다.

아마도 평생의 숙제는 이 간극을 매우는 일이 아닐까 생각한다.

 

반응형

+ Recent posts