반응형

 

안녕하세요. 이번에는 파이썬 라이브러리 중 자동화에 쓰이는 pyautogui에 대해 알아보겠습니다. 사용법도 매우 간단하기 때문에, 파이썬을 잘 모르는 분들이나, 초보자분들도 쉽게 따라하실 수 있습니다. 자세한 내용을 알고싶으시다면 아래 사이트를 참고하시길 바랍니다.

 

 

https://pypi.org/project/PyAutoGUI/

 

PyAutoGUI

PyAutoGUI lets Python control the mouse and keyboard, and other GUI automation tasks. For Windows, macOS, and Linux, on Python 3 and 2.

pypi.org

 

pyautogui 설치

파이썬 라이브러리이다보니 매우 간단하게 설치하실 수 있습니다. Python과 Pip이 깔려있다는 전제하에 command창에 다음 명령어를 입력하시면 됩니다.

>pip install pyautogui

 

설치가 완료되면, import를 시켜 코딩을 시작해보도록 하겠습니다.

import pyautogui

 

pyautogui 주요 기능

1. screenshot() 

화면을 캡쳐하는데 이용되는 함수입니다.

#캡쳐 후 저장
screenshot = pyautogui.screenshot()
screenshot.save('C:\my_screenshot.png')

#캡쳐 저장 동시
screenshot2 = pyautogui.screenshot('C:\my_screenshot2.png')

해당 기능은, UI를 자동화하여 돌려놓았을때, 주기적으로 캡쳐를 해두면 간혹 자동화 동작이 잘 되지 않았을 때 원인을 파악하는 용도로 쓰면 좋은 것 같습니다.

 

2. locateOnScreen()

화면을 인식하여 미리 저장해둔 이미지가 화면상에 존재하는지 파악하는 함수입니다.

#click_button.png가 현재 화면에 있는지
clickBtn = pyautogui.locateOnScreen('click_button.png')

clickBtn은 만약 현재 화면에 해당 버튼이 존재한다면 해당 location을 return 합니다

return 값 :  (left, top, width, height) 

 

 

3. 마우스 컨트롤

자동화를 하기 위해서는 마우스와 키보드를 주로 사용하게 될텐데, 우선 마우스를 어떻게 컨트롤하는지 알아보겠습니다.

#1.마우스 이동
pyautogui.moveTo(100, 200) #x 100, y 200 위치로 이동
pyautogui.moveTo(100, 200, 5) # 해당 위치로 5초동안 이동

#2.마우스 클릭
pyautogui.click()
pyautogui.click(button='right') #우클릭
pyautogui.doubleClick() #더블 클릭
pyautogui.click(clicks=5, interval=1) #1초 간격으로 5번 클릭

#3.마우스 드래그
pyautogui.moveTo(100, 200)
pyautogui.dragTo(300, 500) #(100, 200)에서 (300, 500)까지 드래그

앞에서 살펴본 locateOnScreen() 함수를 사용하여 원하는 이미지의 위치를 찾아내고 해당 위치로 마우스를 moveTo 하고, 클릭하면 원하는 부분을 클릭하는 코드가 완성됩니다.

 

4. 키보드 컨트롤

키보드는 어떻게 컨트롤하는지 알아보겠습니다.

(1). hotkey()

#hotkey : 키보드 하나씩 입력
pyautogui.hotkey('win') #윈도우 키를 누릅니다.
pyautogui.hotkey('ctrl', 'c') #여러개를 인자로 넣어 동시에 누르게 할 수 있습니다 

''' hotkey list
['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(',
')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`',
'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace',
'browserback', 'browserfavorites', 'browserforward', 'browserhome',
'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear',
'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete',
'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20',
'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja',
'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail',
'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6',
'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn',
'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn',
'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator',
'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab',
'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen',
'command', 'option', 'optionleft', 'optionright']
'''

hotkey를 사용하여 복사(ctrl , c), 붙여넣기(ctrl, v), 윈도우 실행(win, r) 등 단축기로 사용하던 것들을 실행할 수 있습니다.

 

(2). write()

pyautogui.write("낙서코딩 블로그입니다") #괄호 안의 문자 입력
pyautogui.write("낙서코딩", interval = 1) #한글자씩 1초 간격으로 입력

 

다른 함수들도 많지만, 사실상 위의 두 함수만 사용해도 무방합니다. 

 

마무리

이번 포스팅에서는 아주 기본적인 내용들만 알려드렸지만, 해당 기능들만 사용해도 웬만한 것은 다 자동화 할 수 있습니다. 하지만 여러 컴퓨터에서 자동화 프로그램을 돌리고 싶다면, 고려해야할 부분이 늘어납니다. 예를 들어 locatOnScreen() 함수를 사용하는데, 버튼 이미지가 컴퓨터마다 해상도가 달라 인식을 못할 수도 있고, 어느 위치로 마우스를 moveTo() 하려는데 해상도 차이로 각각의 위치가 다를 수도 있습니다. 이러한 부분들은 위치가 아닌 해당 버튼을 객체로 인식하여 이동하는 방법이 있는데 다음 포스팅에서 소개해드리도록하겠습니다.

 

 

반응형
반응형

안녕하세요. 이번 포스팅에서는 개발자 협업 및 버전 관리 툴인 깃 허브에 대해 소개하겠습니다. 협업을 해보신분들이라면 깃을 사용해보셨을텐데, 깃을 사용하는 이유는 무엇인지, 어떤 장점이 있는지, 회사 현업에서는 어떻게 쓰는지 등에 대해 함께 알아가보도록 하겠습니다.

 

https://github.com/

 

GitHub: Let’s build from here

GitHub is where over 100 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and fea...

github.com

 

개발 관리 도구는 어떤 것이 있을까?

 

  • Git: 가장 널리 사용되는 분산 버전 관리 시스템으로, 개발자들이 소스 코드 변경 사항을 추적하고 협업하는 데 사용됩니다. Git은 빠르고 유연하며 오픈 소스이며, GitHub, GitLab, Bitbucket 등의 호스팅 서비스와 통합하여 사용할 수 있습니다.

  • GitHub: GitHub는 Git을 기반으로 하는 코드 호스팅 및 협업 플랫폼으로, 버전 관리, 협업 기능, 이슈 추적, 코드 검토 등을 제공합니다. 개인 프로젝트부터 대규모 팀 프로젝트까지 다양한 규모의 개발 작업에 사용됩니다.

  • GitLab: Git 기반의 웹 기반 DevOps 플랫폼으로, 코드 호스팅, CI/CD, 이슈 관리, 웹 IDE 등의 기능을 제공합니다. GitHub와 유사한 기능을 갖추고 있지만, 온프레미스 설치 옵션도 제공하므로 기업 내에서 자체 호스팅이 가능합니다.

  • Bitbucket: Atlassian이 제공하는 Git 및 Mercurial 기반의 코드 호스팅 및 협업 플랫폼입니다. Jira, Confluence 등 Atlassian의 다른 제품들과의 통합이 강점이며, 소규모 팀부터 대규모 조직까지 다양한 규모의 프로젝트를 지원합니다.

  • Subversion (SVN): 중앙 집중식 버전 관리 시스템으로, 이전에 널리 사용되었으며 여전히 많은 프로젝트에서 사용 중입니다. Git과는 다른 작업 흐름을 갖고 있으며, 분산 버전 관리 시스템보다는 중앙 집중식으로 작업하는 경우에 사용될 수 있습니다.

깃허브란?

GitHub는 소프트웨어 개발자들을 위한 버전 관리 및 협업 플랫폼으로, 전 세계적으로 가장 인기 있는 개발자 커뮤니티 중 하나입니다. 여러 개발자들이 협업하고 소스 코드를 공유하며 프로젝트를 관리하는 데 사용됩니다.

 

  • 버전 관리: Git을 기반으로 하며, 프로젝트의 모든 변경 사항을 추적하고 관리할 수 있습니다. 이를 통해 이전 버전으로의 롤백, 변경 내역의 비교 등을 수행할 수 있습니다.

  • 코드 호스팅: 개발자는 자신의 코드를 온라인 저장소에 업로드하고 관리할 수 있습니다. 이를 통해 다른 사람들과 코드를 공유하고 협업할 수 있습니다.

  • 협업 기능:  여러 개발자가 동시에 작업하고, 변경 사항을 검토하고, 피드백을 주고받을 수 있는 기능을 제공합니다. Pull Request를 통해 변경 사항을 제안하고, 코드 리뷰를 진행하여 효율적인 협업을 할 수 있습니다.

  • 이슈 추적: GitHub는 버그, 기능 요청, 작업 항목 등을 추적하기 위한 이슈 트래킹 시스템을 제공합니다. 이를 통해 프로젝트의 문제를 추적하고 해결할 수 있습니다.

  • 다양한 통합:  다양한 개발 도구와 서비스와의 통합을 지원합니다. 예를 들어, 지속적인 통합/배포(CI/CD) 서비스와의 연동, 이슈 관리 도구와의 통합 등이 가능합니다.

GitHub는 오픈 소스 프로젝트뿐만 아니라 상용 소프트웨어 개발에도 널리 사용되며, 개발자들 사이에서 코드 공유, 협업, 지식 공유를 위한 중요한 플랫폼으로 인정받고 있습니다.

 

깃허브를 왜 써야할까?

  • 버전 관리: GitHub는 Git을 기반으로 하여 소스 코드의 버전을 관리합니다. 버전 관리는 개발 프로젝트에서 매우 중요한 요소입니다. GitHub를 사용하면 변경 사항을 추적하고 이전 버전으로 롤백할 수 있으며, 여러 개발자가 동시에 작업할 때도 충돌을 방지하고 변경 사항을 효과적으로 통합할 수 있습니다.

  • 협업과 소통: 다수의 개발자가 함께 작업하고 소통할 수 있는 효율적인 플랫폼을 제공합니다. Pull Request 기능을 통해 개발자들은 변경 사항을 제안하고 코드 리뷰를 진행할 수 있습니다. 이를 통해 팀원들 간의 피드백을 주고받고 개선된 코드를 통합할 수 있습니다.

  • 오픈 소스 프로젝트: 수많은 오픈 소스 프로젝트의 중심지입니다. 많은 개발자들이 자신의 오픈 소스 프로젝트를 GitHub에 호스팅하고 공유합니다. 이를 통해 다른 개발자들은 프로젝트에 기여하거나 사용할 수 있으며, 오픈 소스 생태계의 발전에 기여할 수 있습니다.

  • 이슈 관리: GitHub의 이슈 트래킹 시스템은 버그 보고서, 기능 요청, 작업 항목 등을 관리하기에 매우 편리합니다. 팀원들은 이슈를 생성하고 할당하며, 문제를 추적하고 해결할 수 있습니다. 이를 통해 프로젝트의 투명성과 효율성을 향상시킬 수 있습니다.

  • 다양한 통합: 다양한 개발 도구 및 서비스와 통합될 수 있습니다. CI/CD 도구와의 연동을 통해 자동화된 빌드, 테스트, 배포 파이프라인을 구축할 수 있습니다. 또한, 이슈 관리 도구, 프로젝트 관리 도구, 커뮤니케이션 도구 등과의 통합을 통해 개발 프로세스를 효율적으로 관리할 수 있습니다.

 

깃허브 툴은 뭐가 있을까?

  • GitHub Desktop: GitHub Desktop은 사용자 친화적인 데스크톱 애플리케이션으로, Git을 쉽게 사용할 수 있도록 도와줍니다. GUI를 통해 코드 변경 사항을 커밋하고, 브랜치를 생성하고, 변경 내역을 푸시하고, 코드를 동기화하는 등의 작업을 수행할 수 있습니다.

 

  • SourceTree: SourceTree는 Atlassian에서 개발한 무료 Git 및 Mercurial 클라이언트입니다. 사용자 친화적인 인터페이스를 제공하여 Git과 Mercurial을 쉽게 사용할 수 있도록 도와줍니다. 변경 사항의 추적, 브랜치 관리, 변경 내역의 비교 및 병합 등의 작업을 수행할 수 있습니다.

 

  • GitKraken: GitKraken은 사용자 친화적인 그래픽 인터페이스를 갖춘 강력한 Git 클라이언트입니다. GitKraken은 코드 변경 사항을 시각적으로 관리하고, 브랜치, 커밋, 병합 등의 작업을 쉽게 수행할 수 있습니다. GitHub, GitLab, Bitbucket 등과의 통합도 지원합니다.

  • Tower: Tower는 macOS와 Windows를 위한 고급 Git 클라이언트입니다. 직관적인 인터페이스와 다양한 기능을 제공하여 Git 저장소의 관리와 협업을 용이하게 지원합니다. 코드 변경 사항의 추적, 브랜치 관리, 히스토리 조회 등을 편리하게 수행할 수 있습니다.


  • SmartGit: SmartGit은 사용자 친화적인 Git 및 Mercurial 클라이언트 도구입니다. 단일 사용자와 팀의 협업을 지원하며, 다양한 Git 작업을 수행할 수 있습니다. 브랜치 관리, 커밋, 푸시, 병합 등의 작업을 편리하게 수행할 수 있습니다.

  • GitExtensions: GitExtensions는 Windows 운영 체제에서 작동하는 Git 클라이언트입니다. 직관적인 그래픽 인터페이스를 제공하며, Git 작업을 편리하게 수행할 수 있는 기능을 제공합니다. 변경 사항의 추적, 브랜치 관리, 태그 관리 등의 작업을 지원합니다.

여러개를 써본 결과 이중 Github 데스크탑, source tree가 가장 쉽고 직관적이라고 생각합니다. 요새는 Vscode, Visual Studio 같은 개발 플랫폼에서 바로 깃에 연동이 되기도 하지만, 확실히 툴을 사용하는게 편하긴 합니다. 하지만 툴에서 지원해주지 않는 명령어들도 많기 때문에 어느정도 문법을 익혀 직접 관련 명령어들을 수행하는 능력이 필요하기도 합니다.

 

깃허브 기본 문법

1. 저장소 초기화:
- 새로운 Git 저장소를 생성하려면 해당 디렉토리로 이동한 후 아래 명령어를 사용합니다.

git init

2. 변경 사항 추적:
- Git은 변경된 파일을 추적하기 위해 'add' 명령어를 사용합니다.
모든 변경 사항을 추적하려면 아래 명령어를 사용합니다.

git add .

특정 파일만 추적하려면 파일 경로를 지정합니다.

git add file.txt

3. 커밋:
- 추적된 변경 사항을 커밋하여 버전을 생성합니다.

git commit -m "Commit message"

 

4. 원격 저장소와 연결:
- 원격 저장소와 연결하여 변경 사항을 공유하려면 'remote' 명령어를 사용합니다.
원격 저장소 추가:

git commit -m "Commit message"

원격 저장소 확인:

git remote -v

5. 변경 사항 푸시:
- 커밋한 변경 사항을 원격 저장소로 푸시합니다.

git push origin <branch-name>

 

6. 변경 사항 가져오기:
- 원격 저장소에서 변경 사항을 가져와 로컬 저장소에 병합합니다.

git pull origin <branch-name>

7. 브랜치 관리:

새로운 브랜치 생성:

git branch <branch-name>

브랜치 전환:

git checkout <branch-name>

8. 변경 이력 확인:
- Git의 이력을 확인하기 위해 'log' 명령어를 사용합니다.

git log

 

이러한 Git 명령어를 사용하여 코드의 버전 관리, 협업, 변경 사항 추적 등을 수행할 수 있습니다. Git의 기능은 다양하므로 더 많은 명령어와 옵션에 대한 정보는 Git의 공식 문서나 Git 도움말을 참고하시면 됩니다.

 

https://git-scm.com/book/ko/v2

 

Git - Book

 

git-scm.com

 

 

반응형
반응형

안녕하세요. 이번 포스팅에서는 함수지향 언어, 절차지향 언어, 객체지향 언어의 차이점 및 예시 코드에 대해 알아보겠습니다. 절차 지향 언어의 단점을 보완해 객체 지향언어가 발전했고, 객체 지향언어의 단점을 보완하고자 함수지향 언어가 발전해 나가고 있습니다. 

 

절차지향 vs 객체지향 vs 함수지향

 

절차지향

  • 언어절차지향 언어는 컴퓨터 프로그램을 일련의 절차 또는 순서에 따라 실행하는 방식입니다.
  • 프로그램을 작성할 때 데이터와 프로세스(함수 또는 서브루틴)를 분리하여 생각합니다.
  • C, Pascal, Fortran 등이 있습니다.

코드 예시

위의 예시는 C 언어를 사용한 절차지향 프로그래밍입니다. 프로그램은 순차적인 절차에 따라 실행되며, 함수를 통해 작업을 수행합니다. 메인 함수에서 사용자로부터 이름을 입력 받고, 그 이름을 greet 함수로 전달하여 인사를 출력하는 간단한 프로그램입니다.

 

객체지향 언어

  • 객체지향 언어는 현실 세계의 객체를 모델링하여 프로그램을 작성하는 방식입니다.
  • 객체는 데이터와 그 데이터를 처리하는 메서드(함수)의 조합으로 이루어져 있습니다.
  • 상속, 캡슐화, 다형성 등의 개념을 활용하여 유연하고 재사용 가능한 코드를 작성할 수 있습니다.
  • Java, C++, Python 등이 있습니다.

코드 예시

위의 예시는 Java를 사용한 객체지향 프로그래밍입니다. Person 클래스를 정의하고, 인스턴스 변수로 이름(name)을 가지며, greet 메서드를 통해 인사를 출력합니다. 메인 메서드에서 Person 클래스의 인스턴스를 생성하고 greet 메서드를 호출하여 결과를 출력하는 예시입니다.

 

함수지향 언어

  • 함수형 언어는 함수를 일급 객체로 취급하고, 상태 변경을 피하고 불변성을 지향하는 프로그래밍 패러다임입니다.
  • 함수형 언어에서는 함수의 조합으로 복잡한 작업을 수행하며, 상태 변경 대신에 데이터를 변환하는 방식으로 프로그램을 작성합니다.
  • 재귀, 고차 함수, 순수 함수 등의 개념을 중요시하며, 병렬 처리와 높은 수준의 추상화를 지원합니다.
  • Python, Kotlin, Haskell, Lisp, Scala 등이 있습니다.

코드 예시

위의 예시는 JavaScript를 사용한 함수지향 프로그래밍입니다. greet 함수는 인자로 받은 이름을 템플릿 리터럴을 사용하여 인사를 출력합니다. main 함수에서는 사용자로부터 이름을 입력받고 greet 함수를 호출하여 결과를 출력하는 예시입니다.

 

 

 각각의 예시에서 절차지향은 함수 호출의 연속으로 프로그램이 진행되는 것을 볼 수 있습니다. 객체지향은 클래스와 인스턴스 개념을 사용하여 데이터와 해당 데이터를 처리하는 메서드를 하나의 단위로 묶는 것을 볼 수 있습니다. 함수지향은 함수를 중심으로 프로그래밍이 진행되고, 데이터 변이보다는 데이터 변환을 강조하는 것을 볼 수 있습니다.

절차지향 언어의 단점 : 객체 지향 언어의 탄생

  • 전역 변수의 남발: 전역 변수를 많이 사용하면 코드의 가독성과 유지보수가 어려워질 수 있습니다. 또한 다른 부분에서 전역 변수를 수정할 경우 예상치 못한 동작이 발생할 수 있습니다.
  • 코드 재사용의 어려움: 절차지향 언어는 코드를 절차적으로 작성하기 때문에 코드 재사용이 객체지향 언어에 비해 어려울 수 있습니다.
  • 유연성의 부족: 절차지향 언어는 데이터와 프로세스를 분리하기 때문에 유연성이 부족할 수 있습니다. 새로운 데이터 타입이 추가되는 경우에도 프로세스를 일일이 수정해야 합니다.

이러한 단점들 때문에 객체지향 언어가 탄생했습니다.

 

 

함수지향 vs 객체지향

함수지향 언어는 보통 객체지향언어의 특성을 그대로 가져가되, 함수지향적인 기능을 추가한 것입니다. 객체보다 더 작은 단위인 함수로 쪼개어 더 많은 이점이 탄생했습니다.

 

  • 불변성과 부작용 감소: 함수형 프로그래밍은 상태 변경을 피하고 불변성을 지향하기 때문에 부작용이 감소합니다. 이는 코드의 예측 가능성과 디버깅의 용이성을 높여줍니다.

  • 순수 함수와 테스트 용이성: 함수형 프로그래밍은 순수 함수를 중요시하며, 입력에 대해 동일한 출력을 보장합니다. 이로 인해 테스트가 쉬워지고 코드의 신뢰성이 향상됩니다.

  • 모듈화와 재사용성: 함수형 프로그래밍은 함수를 모듈화하는 것을 중요시하기 때문에 코드의 재사용성이 높아집니다. 재사용 가능한 작은 함수들의 조합으로 복잡한 작업을 수행할 수 있습니다.

  • 병렬 처리 용이성: 함수형 프로그래밍은 상태 변경을 제한하고 순수 함수를 사용하기 때문에 다수의 함수를 동시에 실행하여 병렬 처리를 쉽게 할 수 있습니다.

  • 코드의 간결성과 표현력: 함수형 프로그래밍은 높은 수준의 추상화를 통해 코드를 간결하게 표현할 수 있습니다. 이로 인해 코드의 가독성과 유지보수성이 향상됩니다.

함수지향 프로그래밍은 특히 병렬 처리, 대규모 분산 시스템, 데이터 처리 및 과학적 계산과 같은 분야에서 강점을 발휘할 수 있습니다. 그러나 객체지향 프로그래밍은 코드의 가독성, 재사용성, 유지보수성과 같은 측면에서 효과적일 수 있으며, 소프트웨어의 설계와 모델링에 적합한 경우도 있습니다.

 

코드 예시

 둘의 차이점을 원의 면적을 구하는 코드를 예시로 살펴보겠습니다.

 

1. JAVA (객체 지향) : 물론 지금 자바는 함수형 언어적 특징도 추가되었지만, 객체지향적으로 코드를 짠 것입니다.

2. Javascript (함수 지향)

 

둘의 차이를 보면, 확실히 함수 지향 언어의 코드가 훨씬 더 간결한 것을 볼 수 있습니다. map 함수나, lambda같은 함수 지향적 언어의 기능들을 잘 사용하면 객체지향보다 훨씬 더 짧게 코드를 구현할 수 있습니다.

 

 

 

 

반응형
반응형

안드로이드 어플리케이션 개발은 코틀린과 자바를 사용하는데, 둘의 차이는 무엇이고 각각 어떤 장단점이 있는지 알아보겠습니다. 저는 시작은 자바로 했다가, 코틀린으로 넘어갔었는데 확실히 최신 언어라 그런지 코딩하기가 훨씬 직관적이고 편했습니다. 하지만 아직 많은 기업들이 자바를 쓰고 있고, 자바가 다양한 분야에서 쓰이다보니 좋은 점도 있었습니다. 카카오 같은 경우에는 자바로 짜여진 코드를 거의 다 코틀린으로 바꾸고 있다고 들었었는데 이런 부분을 보면 코틀린의 가능성도 무시할 수 없을 것 같습니다.

 

자바  코틀린 차이

  • 문법: 자바는 객체 지향 프로그래밍 언어로, 괄호와 세미콜론 등을 사용하여 문법적으로 상대적으로 더 많은 구문을 요구합니다. 반면에 코틀린은 보다 간결하고 표현적인 문법을 가지며, 코드의 가독성을 높이는데 기여합니다.

  • 널 안정성: 코틀린은 널 안정성(null safety)을 내장하고 있어, 널 포인터 예외를 방지하기 위한 기능을 제공합니다. 이는 개발자가 널 포인터 예외를 더 쉽게 처리하고, 런타임 오류를 방지하는 데 도움을 줍니다. 자바에서는 널 포인터 예외 처리를 명시적으로 수행해야 합니다.

 

  • 함수형 프로그래밍: 코틀린은 함수형 프로그래밍의 개념을 지원하며, 람다 식과 고차 함수를 사용할 수 있습니다. 이는 코드의 간결성과 가독성을 높이고, 함수형 프로그래밍 패러다임을 적용하기에 용이합니다. 자바에서는 함수형 프로그래밍을 제한적으로 지원합니다.

 

  • 상호 운용성: 코틀린은 자바와의 상호 운용성이 뛰어나며, 기존 자바 코드와의 호환성이 우수합니다. 이는 기존 자바 기반의 안드로이드 프로젝트에서 점진적으로 코틀린으로 마이그레이션할 수 있음을 의미합니다.

 

  • 컴파일 속도와 성능: 일반적으로 코틀린은 자바보다 빠른 컴파일 속도를 가지며, 더 효율적인 성능을 제공하는 경우도 있습니다. 또한, 코틀린은 람다 식과 인라인 함수 등의 기능을 활용하여 성능 향상을 도모할 수 있습니다.

 

자바와 코틀린 전망

자바(Java)
 자바는 오랜 기간 동안 널리 사용되었고, 여전히 많은 기업과 조직에서 안정적이고 신뢰할 수 있는 언어로 여겨집니다. 많은 기업들이 자바를 사용하여 대규모 애플리케이션 및 기업 시스템을 개발하고 운영하고 있습니다. 또한, 자바는 안드로이드 앱 개발에도 주로 사용되고 있습니다. 그러나 최근에는 코틀린의 등장으로 인해 앱 개발에서 자바의 점유율이 감소하고 있습니다.

코틀린(Kotlin)
코틀린은 2011년에 JetBrains에서 발표한 언어로, 안드로이드 앱 개발을 위한 공식 언어로 채택되었습니다. 코틀린은 자바와의 상호 운용성이 뛰어나며, 자바와 비교하여 문법이 간결하고 표현적입니다. 널 안정성, 함수형 프로그래밍 지원 등의 기능을 갖추고 있어 개발자들에게 많은 호응을 얻고 있습니다. 또한, 코틀린은 자바의 대체 언어로서 증가하는 추세이며, 많은 개발자들이 코틀린을 선호하는 경향이 있습니다.

 

앞으로 자바는 기업 시스템 및 대규모 애플리케이션 개발에서 계속해서 중요한 역할을 할 것으로 예상됩니다. 반면에 코틀린은 안드로이드 앱 개발을 중심으로 더욱 성장할 것으로 예상되며, 최근에는 서버 측 개발이나 웹 개발 등 다양한 분야에서도 코틀린을 사용하는 추세입니다.

현재는 자바를 많이 쓰지만, 앱 개발에서는 코틀린이 더 전망이 좋은 것 같습니다. 저는 17년도쯤에 코틀린 공부를 시작했었는데 당시에는 구글에 쳐도 자료가 잘 없었고, 한국어 자료는 더더욱 없어서 골치 아팠었습니다. 근데 최근에 보니 코틀린이 많이 발전해서 자료도 많고, 공부하기 훨씬 수월한 것 같습니다. 만약 앱 개발자의 꿈을 시작하시는 분이라면 코틀린으로 공부를 시작해보시고, 자바를 쓰시는 분도 한번 바꿔보면 좋을 것 같습니다. 저도 자바에서 코틀린으로 넘어가는데 큰 어려움은 없었고 오히려 바꾸고 나니 엄청 편해졌었습니다.

 

 

반응형
반응형

파이썬은 간단하고, 가독성이 좋은 프로그래밍언어 입니다. 대화형 컴파일러를 사용하기 때문에 한줄한줄 테스트하면서 코딩할 수 있어 편하고, 코드가 직관적이여서 잘 몰라도 한번에 보고 대충 어떤 기능을 하는지 알 수 있습니다. Python은 다양한 목적으로 사용되며, 웹 개발, 데이터 분석, 인공 지능, 자동화 등 다양한 분야에서 널리 사용됩니다.

 

Python은 객체 지향 프로그래밍과 함수형 프로그래밍의 요소를 모두 지원하며, 동적 타이핑 언어로 변수의 자료형을 명시적으로 선언하지 않아도 됩니다. 이는 개발자가 유연하게 코드를 작성하고 수정하고 실행하는 데 도움을 줍니다.

Python은 다양한 운영 체제에서 실행될 수 있으며, 오픈 소스 특성을 갖고 있어 무료로 사용할 수 있습니다. 또한, 활발한 개발자 커뮤니티와 방대한 문서 및 자습서가 있어 학습 및 문제 해결에 도움이 되는 장점도 있습니다.

요약하자면, Python은 쉽고 간결한 문법, 다양한 용도로 활용 가능한 풍부한 라이브러리, 다양한 개발자 커뮤니티의 지원을 통해 인기 있는 프로그래밍 언어입니다.

 

https://www.python.org/

 

Welcome to Python.org

The official home of the Python Programming Language

www.python.org

 

파이썬 장점


1 . 가독성과 간결성: Python은 읽기 쉽고 간결한 문법을 가지고 있어 코드를 이해하기 쉽습니다. 이는 개발자들이 빠르게 코드를 작성하고 유지보수하는 데 도움이 됩니다.

2. 다양한 라이브러리: Python은  다양한 라이브러리와 모듈을 제공합니다. 데이터 분석, 웹 개발, 인공 지능, 자동화 등 다양한 분야에서 유용하게 사용될 수 있습니다. 대표적인 라이브러리로는 NumPy, Pandas, Matplotlib, TensorFlow, Django 등이 있습니다.

3. 크로스 플랫폼 지원: Python은 다양한 운영 체제에서 실행될 수 있습니다. Windows, macOS, Linux를 비롯한 다양한 플랫폼에서 동일한 코드를 실행할 수 있어 개발자들에게 유연성을 제공합니다.

4. 빠른 개발 속도: Python은 간단하고 짧은 문법을 가지고 있어 개발 속도를 높일 수 있습니다. 또한, 다양한 라이브러리와 모듈을 활용하여 개발 시간을 단축할 수 있습니다.

5. 커뮤니티 지원: Python은 활발한 개발자 커뮤니티를 갖고 있어서 많은 지식과 지원을 얻을 수 있습니다. Python 개발자들은 서로의 경험을 공유하고 질문에 대답하며, 오픈 소스 프로젝트에 기여함으로써 커뮤니티를 발전시키고 있습니다.

6. 다른 언어와의 통합성: Python은 다른 프로그래밍 언어와의 통합이 비교적 용이합니다. C, C++, Java 등 다른 언어로 작성된 코드를 Python과 결합하여 사용할 수 있으며, 대부분의 언어와 상호 운용성을 지원합니다.


파이썬 단점


1. 실행 속도: Python은 인터프리터 언어로 동작하며, 다른 언어에 비해 상대적으로 실행 속도가 느릴 수 있습니다. 특히, 반복문과 같은 연산이 많은 작업에서는 C나 C++과 같은 컴파일러 언어보다 느릴 수 있습니다. 이러한 이유로 Python은 CPU 작업에는 적합하지 않을 수 있습니다.

2. GIL (Global Interpreter Lock): Python은 GIL이라는 잠금 메커니즘을 갖고 있습니다. GIL은 한 번에 하나의 스레드만 파이썬 바이트 코드를 실행할 수 있게 제한합니다. 이로 인해 멀티스레드 환경에서 CPU 집약적인 작업에 제약이 생길 수 있습니다. 하지만 I/O 작업(네트워크 요청, 파일 입출력 등)에서는 GIL이 큰 영향을 미치지 않습니다.

3. 메모리 사용량: Python은 동적 타입 언어이기 때문에 객체의 자료형을 런타임에 결정하고 메모리를 할당합니다. 이로 인해 메모리 사용량이 크게 증가할 수 있습니다. 특히 대규모 데이터 처리나 인공지능 학습을 하는 경우에는 메모리 사용에 주의해야 합니다.

4. 모바일 및 브라우저 지원: Python은 주로 서버 사이드 및 데이터 분석 등의 영역에서 많이 사용됩니다. 하지만 모바일 앱 개발이나 웹 브라우저에서 직접적으로 실행되는 클라이언트 측 애플리케이션을 개발하는 데는 제한이 있습니다. 모바일 개발은 대부분 Java (Android) 또는 Swift/Objective-C (iOS)과 같은 다른 언어를 사용하는 것이 일반적입니다. 최근에는 코틀린이 급 부상하고 있습니다.

5. 러닝 커브: Python은 초보자가 배우기 쉽지만, 고급 기능을 다루거나 성능 최적화를 위한 고급 기법을 사용하는 것은 러닝 커브가 있을 수 있습니다. 이러한 고급 기법을 사용하려면 추가적인 학습과 경험이 필요합니다.


파이썬 개발 툴



PyCharm: JetBrains에서 개발한 통합 개발 환경(IDE)로, Python뿐만 아니라 다양한 언어와 프레임워크를 지원합니다. 코드 작성, 디버깅, 테스팅 등 다양한 개발 기능을 제공하며, 프로젝트 관리와 협업에도 유용합니다.

https://www.jetbrains.com/ko-kr/pycharm/

Visual Studio Code: 마이크로소프트에서 개발한 경량 코드 편집기로, Python을 비롯한 다양한 언어를 지원합니다. 확장성이 뛰어나고 다양한 플러그인과 테마를 제공하여 개발자들이 자신에게 맞는 환경을 구축할 수 있습니다.
https://code.visualstudio.com/

 

Jupyter Notebook/JupyterLab: 데이터 과학 및 데이터 분석 작업에 많이 사용되는 도구입니다. 코드와 실행 결과, 그래프, 설명 등을 하나의 문서로 통합하여 작업할 수 있습니다. Jupyter Notebook은 브라우저에서 사용되며, JupyterLab은 더욱 확장 가능한 통합 개발 환경을 제공합니다.

https://jupyter.org/

Spyder: 딥러닝과 데이터 분석을 위해 설계된 개발 환경입니다. IPython 콘솔과 통합되어 있어 인터랙티브한 개발과 실험을 할 수 있습니다. 코드 탐색기, 변수 탐색기, 그래프 도구 등을 포함하고 있어 데이터 분석 작업에 유용합니다.

*Spyder은 파이참 다운로드 시 같이 다운받을 수 있습니다. 

Sublime Text: 가벼운 텍스트 편집기로, Python을 비롯한 다양한 언어를 지원합니다. 플러그인 시스템을 통해 다양한 기능과 확장성을 제공하며, 커스터마이징이 용이합니다.

Atom: 오픈 소스 텍스트 편집기로, 다양한 테마와 플러그인을 제공하여 개발 환경을 맞춤 설정할 수 있습니다.

 

 

Project Jupyter

The Jupyter Notebook is a web-based interactive computing platform. The notebook combines live code, equations, narrative text, visualizations, interactive dashboards and other media.

jupyter.org

 

Visual Studio Code - Code Editing. Redefined

Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.  Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.

code.visualstudio.com

 

PyCharm: JetBrains가 만든 전문 개발자용 Python IDE

 

www.jetbrains.com

 

 

PyCharm 다운로드: JetBrains가 만든 전문 개발자용 Python IDE

 

www.jetbrains.com


저는 인공지능을 할 때는 Jupyter나 Spyder를 주로 사용했고, Python으로 자동화 programming을 할 때는 VSCode를 주로 사용했습니다. Pycharm이나 Spyder는 무거운 프로그램을 돌릴 때 좋은 것 같고, VSCode는 가벼운 프로그램에 적합한 것 같습니다.

 

마무리

파이썬은 확실히 처음 프로그래밍할 때 그렇게 어렵게 느껴지지 않고, 정말 다양한 라이브러리들이 잘 나와 있어 프로그래머에게 가장 편안한 언어인 것 같습니다. 코딩테스트를 준비 할 때도, C++이나 Java에 비해 훨씬 짧고 쉽게 구현 할 수 있습니다. 아직 대한민국 기업들에서는 파이썬을 그렇게 선호하는 것 같진 않지만, 최근에 속도 측면에서도 많이 개선이 되었고, 전세계적으로 점점 파이썬으로 넘어오는 추세라 파이썬 언어를 한번 공부해보시는 것도 좋을 것 같습니다. 

반응형
반응형

문제 설명

지도개발팀에서 근무하는 제이지는 지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물들을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다.이 프로그램의 테스팅 업무를 담당하고 있는 어피치는 서비스를 오픈하기 전 각 로직에 대한 성능 측정을 수행하였는데, 제이지가 작성한 부분 중 데이터베이스에서 게시물을 가져오는 부분의 실행시간이 너무 오래 걸린다는 것을 알게 되었다.어피치는 제이지에게 해당 로직을 개선하라고 닦달하기 시작하였고, 제이지는 DB 캐시를 적용하여 성능 개선을 시도하고 있지만 캐시 크기를 얼마로 해야 효율적인지 몰라 난감한 상황이다.

어피치에게 시달리는 제이지를 도와, DB 캐시를 적용할 때 캐시 크기에 따른 실행시간 측정 프로그램을 작성하시오.

블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록".같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임이다.

 

 

만약 판이 위와 같이 주어질 경우, 라이언이 2×2로 배치된 7개 블록과 콘이 2×2로 배치된 4개 블록이 지워진다. 같은 블록은 여러 2×2에 포함될 수 있으며, 지워지는 조건에 만족하는 2×2 모양이 여러 개 있다면 한꺼번에 지워진다.

 

블록이 지워진 후에 위에 있는 블록이 아래로 떨어져 빈 공간을 채우게 된다.

 

만약 빈 공간을 채운 후에 다시 2×2 형태로 같은 모양의 블록이 모이면 다시 지워지고 떨어지고를 반복하게 된다.

위 초기 배치를 문자로 표시하면 아래와 같다.

입력 형식

  • 입력으로 판의 높이 m, 폭 n과 판의 배치 정보 board가 들어온다.
  • 2 ≦ n, m ≦ 30
  • board는 길이 n인 문자열 m개의 배열로 주어진다. 블록을 나타내는 문자는 대문자 A에서 Z가 사용된다.

출력 형식

입력으로 주어진 판 보를 가지고 몇 개의 블록이 지워질지 출력하라.

코드

def recur(board, ans):
    remove = []
    cnt = 0
    y_dir = [0,1,0,1]
    x_dir = [0,0,1,1]
    for y in range(len(board)-1): #지워야 할 부분 찾기
        for x in range(len(board[0])-1):
            flag = 0
            if board[y][x] == "": continue
            for i in range(1,4):
                if board[y][x] == board[y+y_dir[i]][x+x_dir[i]]:
                    continue
                else:
                    flag = 1
                    break
            if flag == 0:
                remove.append((y,x))
                
    for r in remove: # 지우기
        y, x = r
        for i in range(4):
            if board[y+y_dir[i]][x+x_dir[i]] != "":
                board[y+y_dir[i]][x+x_dir[i]] = ""
                cnt += 1
            
    for x in range(len(board[0])): # 밑으로 채우기
        tmp = []
        for y in reversed(range(len(board))):
            if board[y][x] != "":
                tmp.append(board[y][x])
        i = 0
        for y in reversed(range(len(board))):
            if i < len(tmp):
                board[y][x] = tmp[i]
            else:
                board[y][x] = ""
            i += 1
    if cnt == 0:
        return ans
    else:
        return recur(board, cnt+ans)
            
    
    
def solution(m, n, board):
    answer = 0
    board =list(map(list, board))
    answer = recur(board, 0)
    return answer

후기

보드를 처음에 완전 탐색하여 제거 가능한 블록을 찾고, 다시 완전 탐색하여 제거하고, 다시 완전 탐색하여 밑으로 당겨주었는데 처음에 한번에 모든 것을 다 하려 했더니 안되는 조건들이 있었다. 문제가 어려워 보였지만 이러한 조건만 잘 탐색하면 쉽게 풀 수 있다.

알고리즘

  • 재귀
  • 완전 탐색
반응형
반응형

문제 설명

지도개발팀에서 근무하는 제이지는 지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물들을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다.이 프로그램의 테스팅 업무를 담당하고 있는 어피치는 서비스를 오픈하기 전 각 로직에 대한 성능 측정을 수행하였는데, 제이지가 작성한 부분 중 데이터베이스에서 게시물을 가져오는 부분의 실행시간이 너무 오래 걸린다는 것을 알게 되었다.어피치는 제이지에게 해당 로직을 개선하라고 닦달하기 시작하였고, 제이지는 DB 캐시를 적용하여 성능 개선을 시도하고 있지만 캐시 크기를 얼마로 해야 효율적인지 몰라 난감한 상황이다.

어피치에게 시달리는 제이지를 도와, DB 캐시를 적용할 때 캐시 크기에 따른 실행시간 측정 프로그램을 작성하시오.

입력 형식

  • 캐시 크기(cacheSize)와 도시이름 배열(cities)을 입력받는다.
  • cacheSize는 정수이며, 범위는 0 ≦ cacheSize ≦ 30 이다.
  • cities는 도시 이름으로 이뤄진 문자열 배열로, 최대 도시 수는 100,000개이다.
  • 각 도시 이름은 공백, 숫자, 특수문자 등이 없는 영문자로 구성되며, 대소문자 구분을 하지 않는다. 도시 이름은 최대 20자로 이루어져 있다.

출력 형식

  • 입력된 도시이름 배열을 순서대로 처리할 때, "총 실행시간"을 출력한다.

조건

  • 캐시 교체 알고리즘은 LRU(Least Recently Used)를 사용한다.
  • cache hit일 경우 실행시간은 1이다.
  • cache miss일 경우 실행시간은 5이다.

코드

def solution(cacheSize, cities):
    answer = 0
    q = [] #cache
    if cacheSize == 0:
        return 5 * len(cities)
    for i in range(len(cities)):
        tmp = ''
        for c in cities[i]: #소문자로 변환
            if ord(c) < 97:
                tmp += chr(ord(c)+32)
            else:
                tmp += c
                
        cities[i] = tmp       
        if len(q) < cacheSize: #캐시에 빈자리가 있을 때
            if cities[i] not in q: #miss
                answer += 5
                q.append(cities[i])
            else: # hit
                answer += 1
                tmp = q.pop(q.index(cities[i]))
                q.append(tmp)
        else:
            if cities[i] in q: #hit
                answer += 1
                tmp = q.pop(q.index(cities[i]))
                q.append(tmp)
            else: 
                answer += 5
                q.pop(0)
                q.append(cities[i])
    return answer

후기

LRU 알고리즘에 대한 이해가 없으면 풀 수 없는 문제이고 난이도는 쉬운 편이다. 대문자 소문자 구분이 없는 경우와 캐쉬 크기가 0일 경우만 생각하면 된다.

알고리즘

반응형

'코딩 낙서' 카테고리의 다른 글

파이썬(Python)을 왜 쓰는가?  (0) 2023.07.02
카카오기출 - 프렌즈4블록  (0) 2023.06.26
카카오기출 - 추석 트래픽 -Lv3  (1) 2023.06.26
카카오기출 - 셔틀 버스  (0) 2023.06.26
카카오기출 - 비밀 지도  (0) 2023.06.26
반응형

문제 설명

이번 추석에도 시스템 장애가 없는 명절을 보내고 싶은 어피치는 서버를 증설해야 할지 고민이다. 장애 대비용 서버 증설 여부를 결정하기 위해 작년 추석 기간인 9월 15일 로그 데이터를 분석한 후 초당 최대 처리량을 계산해보기로 했다. 초당 최대 처리량은 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초(=1,000밀리초)간 처리하는 요청의 최대 개수를 의미한다.

입력 형식

  • solution 함수에 전달되는 lines 배열은 N(1 ≦ N ≦ 2,000)개의 로그 문자열로 되어 있으며, 각 로그 문자열마다 요청에 대한 응답완료시간 S와 처리시간 T가 공백으로 구분되어 있다.
  • 응답완료시간 S는 작년 추석인 2016년 9월 15일만 포함하여 고정 길이 2016-09-15 hh:mm:ss.sss 형식으로 되어 있다.
  • 처리시간 T는 0.1s, 0.312s, 2s 와 같이 최대 소수점 셋째 자리까지 기록하며 뒤에는 초 단위를 의미하는 s로 끝난다.
  • 예를 들어, 로그 문자열 2016-09-15 03:10:33.020 0.011s은 "2016년 9월 15일 오전 3시 10분 33.010초"부터 "2016년 9월 15일 오전 3시 10분 33.020초"까지 "0.011초" 동안 처리된 요청을 의미한다. (처리시간은 시작시간과 끝시간을 포함)
  • 서버에는 타임아웃이 3초로 적용되어 있기 때문에 처리시간은 0.001 ≦ T ≦ 3.000이다.
  • lines 배열은 응답완료시간 S를 기준으로 오름차순 정렬되어 있다.

출력 형식

  • solution 함수에서는 로그 데이터 lines 배열에 대해 초당 최대 처리량을 리턴한다.

코드

def solution(lines):
    answer = 0
    start_list = [] #시작 시간 
    end_list = []  # 종료 시간
    for line in lines: # 시작시간과 종료시간을 리스트에 넣어주기
        date, time, pro = line.split()
        pro = int(float(pro[:-1]) * 1000)
        h, m, sec = time.split(":")
        h = int(h) * 3600
        m = int(m) * 60
        s, ms = list(map(int,sec.split(".")))
        end_time = (h + m + s)*1000 + ms
        start_time = end_time - pro + 1
        start_list.append(start_time)
        end_list.append(end_time)
        
    for i in range(len(start_list)): 
        s1 = start_list[i]
        e1 = end_list[i]
        count = 1
        for j in range(i+1,len(start_list)):
            if i == j: continue
            s2 = start_list[j]
            e2 = end_list[j]
            if e1 > s2 -1000 :#현재의 종료지점이 다음의 시작시간 -1초 보다 크면 count 
                count += 1
        answer = max(count, answer)
    return answer

후기

문제 자체는 어렵지 않았으나 현재의 종료 지점이 다음의 시작 시간 -1초 보다 크면 센다는 조건을 떠올리기 쉽지 않았다.

분류

  • 그리디
반응형

'코딩 낙서' 카테고리의 다른 글

카카오기출 - 프렌즈4블록  (0) 2023.06.26
카카오기출 - 캐쉬  (0) 2023.06.26
카카오기출 - 셔틀 버스  (0) 2023.06.26
카카오기출 - 비밀 지도  (0) 2023.06.26
카카오기출 - 다트 게임  (0) 2023.06.26

+ Recent posts