안녕하세요 피터입니다.

 

많은 분들이 C 언어를 배우고 나서 C++ 를 배우기 시작 할 때 어려움을 겪곤 합니다. 

제 주변에도 그런 분들이 있어서 어떤 점 때문에 어려운지 물어봤더니 어디서부터 어떻게 시작해야 될 지 모르겠다는 답변이 가장 많았습니다. 

 

어쩌면 당연한 일인지도 모르겠습니다. 

비교적 간단한 문법 체계를 갖고 있는 C 언어와 달리 C++ 은 굉장히 다양한 패러다임이 녹아있으며 방대한 스케일을 자랑하는 언어이기 때문입니다. 

 

(물론 그렇다고 해서 C 언어가 가볍고 만만한 프로그래밍 언어라는 말은 아닙니다. 오히려 그 반대로 처음엔 쉬워보이지만 알면 알수록 어려워지는 언어입니다. C 언어는 역사가 긴 만큼 괴수 분들이 많이 서식하고 계십니다 :D)

 

그래서 우선은 C 언어와 C++ 두 언어가 어떤 부분이 다른지 간단하게 살펴보고 넘어가겠습니다.

 

Feature

C

C++

Paradigm

Procedural Language

Multi-Paradigm Language

Approach

Top down

Bottom up

Namespace

X

O

Inheritance 

X

O

Overloading

X

O

Polymorphism

X

O

Template

X

O

& reference

X

O

struct constructor

X

O

Memory allocation

malloc(), calloc(), realloc()

new

Memory deallocation

free()

delete

 

여러 차이점들이 있지만 눈여겨 볼 만한 부분은 C++ 의 Multi-paradigm 이라는 부분입니다. 

 

절차지향 프로그래밍(Procedure-Oriented Programming)을 지원하는 C 언어와 달리 C++ 은 C 언어의 절차지향 프로그래밍을 그대로 승계한 동시에 객체지향 프로그래밍(Object-Oriented Programming)일반화 프로그래밍(Generic Programming)을 모두 지원하는 언어입니다. 

 

C 언어의 문법을 그대로 계승했기 때문에 얼핏 보면 큰 차이가 없어 보여 쉽게 접근했는데,

코딩을 하면 할 수록 내가 알던 그 언어와 비슷하면서도 뭔가 잘못되고 있다는 느낌을 받게 되죠. 

(내거인듯 내거아닌 내거같은 너...)

 

그렇게 느낄 수 밖에 없는 것이 객체지향 프로그래밍에 대한 개념을 모르는 상태에서는 C++에서 새롭게 등장하는 객체지향 문법들을 온전히 이해 할 수 없기 때문입니다. 

 

게다가 처음보는 템플릿(template) 문법은 외계어에 가깝게 느껴집니다.

 

C++은 이처럼 여러 가지 패러다임을 지원하는 언어이니 만큼 제대로 사용하기 위해서 배워야 할 개념들이 많습니다.

그래서 배우면 배울 수록 겸손해지는 언어이기도 하죠. 

(괜히 개발자들 사이에서 본인이 C++ 고수라고 하는 사람은 상종도 하지 말라는 말이 있는 게 아닙니다...)

 

 

그렇다면 C++을 어떻게 배우는 것이 좋을까요?

우선은 기존의 Top-down 방식으로 사고를 했던 것에서 벗어나 Bottom-up 방식의 객체지향 개념을 먼저 익히는 것이 좋습니다. 

 

[객체지향] Object-Oriented Programming 핵심 개념의 이해

배경 데이터 흐름(Flow)에 기반한 절차지향적 프로그래밍 방법은 복잡한 로직을 갖는 큰 규모의 소프트웨어 개발에는 적합하지 않습니다. 하드웨어 성능이 폭발적으로 성장하면서 요구되어지는

gracefulprograming.tistory.com

 

객체지향 개념을 이해하고 나서 문법적인 면에서는 클래스(class)접근 제한자(access modifier), new, delete 등의 문법을 숙지하셔야 합니다. 

 

기존 C언어에서 malloc(), free() 대신 new, delete 를 사용하면 생성자(constructor)/소멸자(destructor)가 호출되는데 이러한 개념도 익혀두셔야 합니다. 

 

간단한 프로그램을 객체지향적으로 설계하고 구현하는 것을 반복적으로 하다 보면 이제 Bottom-up 방식으로 사고 하는 것이 어느정도 익숙해지게 됩니다. 

 

 

이제 슬슬 템플릿(template)을 배워보도록 합니다.

템플릿은 일반화 프로그래밍(generic programming) 패러다임으로 데이터 처리하는 로직을 데이터 타입에 비종속적으로 구현할 수 있게 해줍니다. 

(컴파일 타임에 주어진 타입 별로 클래스들이 분화됩니다)

 

템플릿 문법을 직접 사용해보는 것도 좋지만 STL(Strandard Template Library)을 잘 다루는 것이 매우 중요하기 때문에 STL의 컨테이너(container)들을 활용하는 연습을 많이 하는 것이 좋습니다.  

 

vector, list, map 등의 주요 컨테이너들을 능숙하게 다룰 수 있게 되면 특별한 경우를 제외하면 대부분의 로직을 구현할 수 있습니다. 

 

 

 

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

-Peter의 우아한 프로그래밍

 

 

 

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

개요

 

안녕하세요 피터입니다.    

오늘은 Bash 쉘 스크립트에서 사용되는 변수(variable)에 대해서 설명드리겠습니다. 

변수는 모든 프로그래밍 언어와 스크립트 언어에서 핵심적인 기능을 합니다. 데이터를 조작하기 위한 연산이나 문자열을 파싱(parsing)하는데 있어서 없어서는 안될 꼭 필요한 존재입니다.

 

변수는 단지 데이터를 담고 있는 메모리상의 위치를 나타내는데 어떤 변수에 어떤 데이터가 담겨있는지 쉽게 알 수 있게 이름을 붙여놓은 것입니다. 

 

 

변수 할당(assignment)

 

데이터를 담는 공간인 변수를 사용하려면 먼저 변수를 할당(assignment) 해야 합니다.

 

변수는 할당 연산자 = 를 사용해서 할당합니다.

 

a=100
b="hello"

 

주의 해야 할 것은 할당 연산자 앞뒤로 공백이 없어야 한다는 것입니다.  

(또한 테스트 연산자도 = 심볼을 쓰기 때문에 헷갈리지 말아야 합니다. 상황에 따라 해석이 달라지니 주의해주세요. 이 부분은 나중에 테스트 연산자 설명드릴 때 다시 말씀드리겠습니다.)

 

Bash 는 다른 프로그래밍 언어들과는 달리, 변수를 "타입"으로 구분하지 않습니다.

Bash 변수는 본질적으로 문자열이지만 Bash 가 문맥에 따라서 정수 연산이나 변수를 비교해 줍니다. 이 동작을 결정짓는 요소는 그 변수값이 숫자로만 되어 있는냐 아니냐 입니다.

 

 

let 명령어로 할당 할 수도 있습니다.

let은 bash 의 내장 명령어 중에 하나로 간단한 산술식을 수행 할 수 있습니다.

 

let a=1000+4
let "a = 1000 + 4"   # 위와 같음

 

가독성을 위해서는 " " 를 이용해서 쿼우팅(quoting) 하고 연산자 사이에 빈칸(space)을 넣어주는게 좋습니다. 

 

 

변수를 할당 할 때는 위의 숫자 100이나 문자열 "hello"와 같은 리터럴 상수(literal constant) 뿐만 아니라 명령어의 결과를 할당 할 수도 있습니다. 

 

바로 명령어 치환(command substitution)을 사용하는 방법인데요.  역따옴표(` `) - 백틱(backticks)으로 명령어를 감싸면 해당 명령어의 결과로 치환되어 그 결과를 변수에 바로 할당 할 수가 있습니다. 

 

ret=`ls -l`

 

명령어 치환에 대해서는 다룰 내용이 좀 더 많기 때문에 나중에 포스팅을 추가로 하겠습니다. 

 

 

 

변수 치환(substitution)

 

변수는 데이터를 담고 있는 그릇 역할을 하므로, 할당하였으면 이제 변수에 담겨있는 데이터를 사용 할 수 있어야 합니다. 

변수에는 어떤 계산을 하기 위해 임시로 저장한 중간값이나 특정 명령어의 결과값 등이 저장되어 있는데 이 값들을 확인하거나 적절히 활용하기 위해서는 치환(substitution)을 통해 변수의 데이터를 참조해야 합니다.

 

치환은 ${variable} 구문을 이용하여 사용하는데 $variable 로 줄여 쓸 수 있습니다. 

 

참조되는 값을 큰따옴표(" ")로 묶어도 변수 치환이 일어나는 것을 막지 못합니다.

이를 부분적 쿼우팅(partial quoting)이나 약한 쿼우팅(weak quoting)이라고 합니다. 

 

작은따옴표를 쓰게 되면 변수 이름이 그냥 문자 그대로 해석되어 아무런 일도 일어나지 않습니다.

이를 완전한 쿼우팅(full quoting)이나 강한 쿼우팅(strong quoting)이라고 합니다.

 

#!/bin/bash

a=1004
echo "$a"  # $a 변수 치환이 일어남 
echo '$a'  # $a를 문자 그대로 해석 


실행 결과
100
$a

 

 

변수를 할당하지 않고 참조하게 되면 문제가 생깁니다.

변수에 어떤 값을 처음 할당 하는 것을 초기화(initialize)라고 하는데, 초기화가 안 된 변수는 "null" 값을 가집니다.

이는 값이 할당 안 된 것이지 0 이라는 값을 갖는다는 이야기가 아닙니다. 

 

변수를 참조하기 전에 반드시 할당을 먼저 해주시기 바랍니다. 

 

 

 

 

-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 남겨주시면 감사하겠습니다.

 

 

 

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

 

개요

 

안녕하세요 피터입니다.

오늘은 C# 프로젝트 log4net 라이브러리를 통해 로그 시스템(log system)을 적용하는 방법을 알려드리겠습니다.

 

프로젝트를 진행하다 보면 로그 시스템이 절실할 때가 있습니다. 

특정 상황에서 에러가 발생하는데 어떤 절차에 의해 실행하면 에러가 발생하는지 추적이 어려울 때가 바로 그런 경우입니다. 

또한 개발을 진행할 때에는 세부적이고 자세한 로그를 기록하는 것이 도움이 되지만 실제로 사용자가 프로그램을 쓸 때에는 중요한 내용만 기록하는 것이 더 도움이 됩니다. 

이런 이유로 상황에 따라 어떤 수준의 로그를 기록할지 손쉽게 설정할 수 있는 로그 시스템이 필요합니다.

C# 프로젝트에서는 log4net 라이브러리를 통해 이러한 기능을 쉽게 구현 할 수 있습니다.

 

로그시스템 적용

log4net 라이브러리 설치

Visual studio 에서는 nuget을 통해 손쉽게 라이브러리를 설치 할 수 있습니다.

먼저 로그시스템을 적용하고자 하는 프로젝트를 열고 nuget에서 log4net을 검색합니다.

nuget 에서 log4net (Apach Software Foundation)을 검색하여 적용하고자 하는 프로젝트에 설치합니다.

 

 


log4net 환경설정 파일 추가

 

로그 시스템을 프로젝트에 원하는대로 적용하기 위해서는 환경설정 파일이 필요합니다.

 

[프로젝트] - [추가] - [새 항목] 클릭

 

"구성" 을 키워드로 검색하여 "응용 프로그램 구성 파일" (확장자가 config)을 선택합니다. 

 

파일명을 log4net.config 로 변경한 다음 추가를 클릭합니다.

(파일명은 원하는대로 변경이 가능합니다. 설정파일을 읽어오는 부분도 동일하게 변경해주시면 됩니다.)

 

예제) log4net.config 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <log4net>
    <root>
      <level value="ALL"/>
      <appender-ref ref="console"/>
      <appender-ref ref="file"/>
      <appender-ref ref="fatal_file"/>
    </root>
    <appender name="console" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %level %logger - %message%newline" />
      </layout>
    </appender>
    <appender name="file" type="log4net.Appender.RollingFileAppender">
      <file value="log\app.log" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="100MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
    <appender name="fatal_file" type="log4net.Appender.RollingFileAppender">
      <file value="log\fatal.log" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="100MB" />
      <staticLogFileName value="true" />
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="FATAL" />
        <param name="LevelMax" value="FATAL" />
      </filter>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
  </log4net>
</configuration>

 

log4net의 설정에서는 appender가 핵심적인 역할을 수행합니다. 

appender의 종류에 따라 화면에 출력하거나 파일에 기록할 수 있으며, 이메일로도 로그를 전송할 수 있습니다.

위에서 사용한 appender는 아래 2가지 입니다.

 

log4net.Appender.ConsoleAppender (화면에 출력하는 appender)

log4net.Appender.RollingFileAppender (파일에 기록하는 appender)

 

RollingFileAppender에 대한 위 설정은 설치파일경로\log\app.log 파일로 로그를 기록하며, 100MB 초과 시 5개까지 파일을 분기하는 설정입니다. 

 

<root>
  <level value="ALL"/>
  <appender-ref ref="console"/>
  <appender-ref ref="file"/>
  <appender-ref ref="fatal_file"/>
</root>

 

appender 들을 설정했으면 root 태그에 appender-ref 를 추가해줍니다. 

log4net 라이브러리에서 발생한 로그들을 appender-ref 목록에 있는 appender 들에게 전달해주는데 만일 level을 지정하면 지정된 레벨 이상의 로그만 appender 로 전달할 수 있습니다.

레벨에 설정 가능한 값

  • ALL
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL

 

appender 별로 로그 레벨을 지정하고자 할 때는 아래와 같이 appender 내부에 filter를 사용하면 됩니다. 

<filter type="log4net.Filter.LevelRangeFilter">
    <param name="LevelMin" value="FATAL" />
    <param name="LevelMax" value="FATAL" />
</filter>

 

 

환경설정을 다 작성하였으면 log4net.config 파일 속성의 고급에서 아래 내용을 변경해줍니다.

아래 속성을 지정해주지 않으면 빌드 시 환경설정 파일이 출력디렉토리에 복사되지 않기 때문에 실행했을 때 환경설정을 읽어오지 못하게 되니 반드시 적용해주세요.

빌드작업 - 내용

출력 디렉터리에 복사 - 항상 복사 ("새버전이면 복사"로 해도 무방합니다)

 


 

환경설정 파일 로드

AssemblyInfo.cs

 

프로젝트에서 환경설정 파일을 읽어올 수 있도록 AssemblyInfo.cs 파일 하단에 코드를 추가해줍니다.

위에서 파일 이름을 변경했다면 변경한 파일 이름으로 작성해주셔야 합니다.

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

Watch = true 라는 옵션을 주면 프로그램 실행 중에 config 파일을 수정해도 바로 반영됩니다.

이 옵션은 상당히 유용한 옵션으로 프로그램을 재실행하지 않고도 로그 시스템의 설정을 바꿀 수 있기 때문에 사용을 권장드립니다.


로그 인터페이스 생성 및 로그 기록 

App.xaml.cs

using log4net;

    public partial class App : Application
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(App));

        protected override void OnStartup(StartupEventArgs e)
        {
            log.Info("=============  Started application  =============");
            base.OnStartup(e); 
        }
    }

App.xaml.cs 에 log4net 라이브러리를 추가하고 프로그램이 시작 할 때 로그를 기록해봤습니다.

LogManager의 GetLogger 메소드를 통해 ILog 인터페이스를 얻어올 수 있습니다. 

GetLogger에 파라미터로 넘겨주는 이름이 나중에 로그에 기록될 때 식별자로 기록됩니다.

 

이렇게 얻은 ILog 인터페이스를 통해 로그를 기록 할 수 있습니다. 

 

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 
public MainWindow()
{
    InitializeComponent();
}
 
private void Button_Click(object sender, RoutedEventArgs e)
{
    log.Debug("Debug");
    log.Info("Info");
    log.Warn("Warn");
    log.Error("Error");
    log.Fatal("Fatal");
}

ILog 인터페이스는 위와같이 레벨별 메소드들을 제공합니다.

 

작은 팁을 드리면 Error 로그는 아래와 같이 Exception 객체를 파라미터로 넘겨서 출력할 수 있습니다.

try
{
    ;
}
catch (Exception ex)
{
    log.Error($"An exception occurred from {MethodBase.GetCurrentMethod().Name}", ex);
}

비즈니스 로직이 들어가는 코드를 위와 같이 작성해두면 나중에 에러가 발생했을 때 추적이 쉬워집니다. 

 


로그 기록 확인

위에서 설정한 대로 실행파일이 위치한 디렉토리 하위에 log 라는 디렉토리와 로그파일이 생성된 것을 확인 할 수 있습니다.

로그 파일을 열어보면 레벨별로 잘 기록된 것을 볼 수 있습니다.

 

 

 

-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

 

 

'프로그래밍 > C#' 카테고리의 다른 글

[C#] 프로젝트에 log4net 적용하기  (7) 2019.11.01
블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

 

개요

 

안녕하세요 피터입니다.

오늘은 vim에서 대문자 또는 소문자로 일괄적으로 변경하는 방법에 대해서 알려드리겠습니다. 

전체적으로 대문자 또는 소문자로 변경하는 것도 가능하지만 대문자인 것은 소문자로 소문자인 것은 대문자로 반전(inverse)하는 것도 가능합니다. 

 

vim 에서 대소문자를 변경하는 방법은 크게 두 가지가 있습니다. 

첫 번째는 일반 모드에서 명령어를 입력해서 변경하는 방법이고, 

두 번째는 비주얼 모드에서 영역을 지정하고 변경하는 방법입니다.

 

일반 모드

일반 모드에서 대소문자를 변경하는 명령어는 아래와 같습니다.

Command Description Examples
gU<motion>

<motion> 에 해당하는 범위의 문자를

대문자로 변경

gUU : 현재 라인 전체 대문자로 변경

gUw : 현재 커서부터 단어의 끝까지 대문자로 변경

gUaw : 현재 단어 전체 대문자로 변경

gUG : 현재 라인부터 문서의 끝까지 대문자로 변경

gu<motion>

<motion> 에 해당하는 범위의 문자를

소문자로 변경

guu : 현재 라인 전체 소문자로 변경

guw : 현재 커서부터 단어의 끝까지 소문자로 변경

guaw : 현재 단어 전체 소문자로 변경

guG : 현재 라인부터 문서의 끝까지 소문자로 변경

g~<motion>

<motion> 에 해당하는 범위의 문자를

반전시킴

g~~ : 현재 라인 전체 대소문자 반전

g~w : 현재 커서부터 단어의 끝까지 대소문자 반전

g~aw : 현재 단어 전체 대소문자 반전

g~G : 현재 라인부터 문서의 끝까지 대소문자 반전

기본적으로 gU, gu 명령어는 현재 커서 위치를 시작으로 <motion> 에 지정된 범위까지 영향을 받게 됩니다.

 

아래 gU 명령어 사용 예제를 참고해주세요. (gu, g~ 명령어도 동일한 원리로 동작합니다)

gUU 실행 결과

 

gUw 실행 결과

 

gUaw 실행 결과

 

gUG 실행 결과

 

비주얼 모드

비주얼 모드에서 영역을 지정한 다음에 U 키(shift + u)를 누르면 영역 내의 문자들이 대문자로 변경됩니다.

마찬가지로 영역 지정 후 u 키를 누르면 소문자로, ~ 키를 누르면 대소문자 반전이 됩니다.

비주얼 모드에서 영역 지정 후 shift + u 실행 결과

 

 

 

-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 남겨주시면 감사하겠습니다.

 

 

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

 

개요

 

안녕하세요 피터입니다.

오늘은 아나콘다(Anaconda)를 설치하는 방법을 알려드리겠습니다. 

아나콘다를 이용하면 파이썬에서 다양한 가상환경을 손쉽게 구축할 수 있기 때문에 파이썬으로 개발 및 테스트를 진행하는데 있어서 효율을 극대화 할 수 있습니다.

 

 

 

아나콘다는 여러가지 수학 및 과학 패키지(Package)들을 기본적으로 포함하고 있는 파이썬 배포판입니다.

때문에 머신러닝(Machine learning)이나 데이터 분석(Data analysis)를 하고자 한다면 여러 가지 귀찮은 일들을 줄일 수 있게 해줍니다. 

파이썬은 많은 개발자들이 공동으로 개발하는 오픈소스 프로젝트도 많이 진행되며 라이브러리들이 매우 빈번하게 업데이트가 됩니다. 각각의 라이브러리들은 저마다 다양한 의존성(Dependency)을 가지며 규모가 큰 오픈소스 같은 경우 이러한 의존성이 복잡하게 얽혀있습니다. 

때로는 라이브러리가 업데이트 될 때 구조가 크게 바뀌거나 인터페이스가 변경되는 경우도 있습니다. 이런 경우에 이전 버전에서는 잘 동작하던 코드가 특정 버전에서 갑자기 오류가 발생할 수 있습니다. 

이런 이유로 인해 특정 버전을 유지하며 개발을 진행해야 하는 프로젝트가 언제든지 생길 수 있기 때문에 아나콘다로 가상 환경을 미리 구성하는 것을 권장합니다.

 

다운로드 및 설치

 

아나콘다 설치파일은 아래 URL에서 다운로드 받을 수 있습니다.

https://www.anaconda.com/distribution/#download-section

파이썬 버전 및 운영체제 환경에 맞게 다운로드

 

다운로드 하기 전에 현재 운영체제 환경을 모른다면 아래와 같이 [제어판] - [시스템 및 보안] - [시스템] 에 들어가서 32bit 인지 64bit 인지 확인할 수 있습니다.

운영체제 환경 확인하기

 

MacLinux 운영체제도 지원합니다만 이번 시간에는 Windows 환경에서 설치를 진행해보겠습니다. 

 

설치파일 다운로드가 완료되면 설치파일을 실행합니다.



Next 를 눌러 설치를 시작합니다.

 



경로는 변경이 가능하나 어느 디렉토리로에 설치되는지 꼭 기억해두시기 바랍니다. 

 

설치에는 꽤 시간이 많이 소요되는 편입니다.

느긋하게 커피한잔 하면서 기다려줍니다.

설치가 완료되면 Next를 클릭해줍니다.

 


Microsoft Visual Studio Code 설치 화면이 뜨는데 특별한 이유가 없다면 설치하는 것을 권장드립니다.

Visual Studio Code는 텍스트 에디터지만 플러그인 등을 통해 IDE로 충분히 활용 가능한 매우 강력한 도구이기 때문에 파이썬 코드를 디버깅 하는데 매우 유용합니다. 

 

이제 설치가 완료되었습니다.

 

아나콘다 실행

아나콘다를 실행하기 위해 윈도우 키를 누른 뒤 Anaconda 라고 입력하면 아래와 같이 Anaconda NavigatorAnaconda Prompt 가 나옵니다. 

Anaconda Prompt는 텍스트 기반의 CLI 로 아나콘다를 사용할 수 있는데 윈도우 환경에서는 Anaconda Navigator가 좀 더 편하게 사용할 수 있습니다.

Anaconda Navigator 실행

 

Anaconda Navigator 실행 화면

 

Anaconda Navigator를 실행화면 위와 같은 화면이 나옵니다. 

기본적으로 주피터 노트북(Jupiter Notebook) 등의 유용한 프로그램들이 설치되어 바로 사용할 수 있습니다. 

 

가상환경 생성

가상환경 생성

Anaconda Navigator 화면에서 좌측의 Environments 탭을 클릭하면 가상 환경 목록을 볼 수 있습니다.

처음 설치하면 base(root) 환경만 존재합니다. 

하단의 Create 버튼을 클릭하면 위와 같이 가상환경 생성창이 뜨게 되는데 여기에서 가상 환경의 이름과 파이썬 버전을 지정해 줄 수 있습니다.

 

가상 환경에서 실행

이렇게 생성한 가상환경에서 위와 같이 실행 버튼을 클릭하면 실행 메뉴가 나오는데 Open Terminal 을 클릭하면 현재 가상환경 위에서 동작하는 터미널을 실행할 수 있습니다. 

이 터미널에서 pip 등으로 라이브러리를 설치할 수 있는데 가상환경 별로 독립적으로 설치되기 때문에 다른 환경에 영향을 주지 않으면서 다양한 환경을 구성할 수 있습니다.

 

홈에서 현재 가상환경 변경

 

위와 같이 Home 탭으로 돌아가서 가상환경을 변경할 수도 있습니다.

 

 

-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 남겨주시면 감사하겠습니다.

 

'프로그래밍 > Python' 카테고리의 다른 글

[Python] 아나콘다(Anaconda) 설치하기  (3) 2019.10.31
블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

  • guest 2020.03.18 15:43  댓글주소  수정/삭제  댓글쓰기

    아나콘다를 설치했는데 네비게이터랑 프롬포트가 없어요
    어떻게 해야하나요 ? 혹시나해서 재설치도 해봤는데 똑같네요

  • kim chang gie 2021.03.17 16:02  댓글주소  수정/삭제  댓글쓰기

    안녕하세요
    수ㅡ호천사가 되어 주세요 jupyternootebook설치하고
    C:\myPyCode\data 여기까지 생성했는 데 엑셀파일을 갖다 붙여야 겠는 데
    데이터 폴더의 하위폴드 에 엑셀파일 을 복사해서 붙이면 안되나요?
    된다면 방법좀 알려 주세요
    후사하겠읍니다

  • kim chang gie 2021.03.30 16:33  댓글주소  수정/삭제  댓글쓰기

    판다로 임포트하여 엑셀파일을 가져오기하는 데 안되내요
    판다말고 다른 펙키지가 있나요

 

개요

 

안녕하세요 피터입니다.

오늘은 Bash 쉘에서 프로그램을 종료(exit) 하는 방법과 종료 상태(exit status)를 얻는 방법에 대해 설명드리겠습니다.

종료 상태는 리턴값(return value, return status)이라고 부르기도 하는데 이전에 수행했던 명령어나 프로그램이 종료 될 때 넘겨주는 값을 의미하기도 해서 그렇습니다.

 

종료 상태 또는 반환값이 중요한 이유는 쉘 스크립트를 작성하는데 있어서 특정 명령어의 성공 여부에 따라 분기해야 하는 경우 이전 명령어가 정상적으로 수행되었는지 아는 것이 필수적이기 때문입니다.

 

쉘 스크립트 내에서 exit 명령어가 실행되면 스크립트가 종료되며 부모 프로세스에 종료 상태를 전달할 수 있는데 이 값은 프로그램 내에서 임의로 지정할 수도 있습니다. 

 

이렇게 전달되는 하위 프로세스의 종료 상태는 스크립트를 자동화하는데 있어서 매우 중요한 기준을 제공합니다. 

(일반적으로 명령어의 종료 상태가 0이면 성공(success)로 판단하며 오류가 있는 경우 오류 코드를 반환하게 됩니다)

 

 

종료 (exit)

 

exit 명령어는 매개변수로 주어진 값을 리턴합니다. 

#!/bin/bash

echo "hello"

exit 100

 

예를들면 위와 같이 exit 100 이라고 작성하면 스크립트를 종료하면서 100 이라는 값을 리턴하는 것이죠.

이 때 종료 상태로 사용할 수 있는 값의 범위는 0 부터 255 까지입니다. 

일반적으로 unix 관행을 잘 따르는 경우 0은 성공, 1 ~ 255 는 오류 코드(error code)로 인식되고 있습니다. 

 

만일 exit 를 매개변수 없이 사용하게 되면 exit 가 실행되기 이전에 가장 마지막으로 수행됐던 명령어의 종료 상태를 반환하게 됩니다.

 

 

종료 상태 (exit status)

 

$? 는 가장 최근 명령어의 종료 상태를 나타냅니다. 

위 스크립트가 100을 반환한다고 했는데 정말 그런지 실행 후 종료 상태를 출력해보겠습니다.

 

[root@peterdev sh]# cat test.sh
#!/bin/bash

echo "hello"

exit 100
[root@peterdev sh]# sh test.sh
hello
[root@peterdev sh]# echo $?
100

 

위와 같이 echo $? 명령어에서 100이 출력되는 것을 확인할 수 있습니다.

 

만일 잘못된 명령어를 입력하여 오류가 발생한 경우는 아래와 같이 오류코드가 반환되는 것을 확인할 수 있습니다.

[root@peterdev sh]# eeee
-bash: eeee: command not found
[root@peterdev sh]# echo $?
127

 

아래 스크립트에서는 echo "hello" 가 정상적으로 수행되었기 때문에 0이 반환된 것을 확인할 수 있습니다.

[root@peterdev sh]# echo "hello"
hello
[root@peterdev sh]# echo $?
0

 

 

-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 남겨주시면 감사하겠습니다.

 

 

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

 

안녕하세요 피터입니다.

오늘은 vim에서 특정 문자열을 검색하거나 원하는 문자열로 변경하는 방법을 소개해드리겠습니다.

 

개요

vim은 다른 텍스트 에디터들이 기본적으로 제공하는 "찾기 및 바꾸기"와 같이 현재 열려 있는 문서 내에서 특정 문자열을 검색하거나 원하는 문자열로 바꿀 수 있습니다. 

vim이 강력한 이유는 바로 찾기 및 바꾸기 기능에서 정규 표현식(Regular Expression)을 활용할 수 있기 때문입니다. 

 

 

문자열 검색하기

vim에서 특정 문자열을 검색하기 위해서는 일반모드에서 슬래시( / ) 키를 이용하여 검색 대화창을 띄워야 합니다.
 
/ 키를 눌러 검색 입력 활성화 후 score 검색어 입력

화면 하단에 / 문자가 표시되며 커서가 활성화 되면 원하는 검색어를 입력할 수 있습니다. 

간단하게 score 라는 검색어를 입력해보겠습니다. 

 

 

위와 같이 문서 전체에서 score 라는 문자열을 모두 찾아 음영으로 표시해줍니다. 

이 때 커서 위치는 현재 커서에서 가장 가까운 검색 결과로 자동으로 이동됩니다. 

이 상태에서 n 키를 누르면 다음 검색 결과로 커서가 이동되며, N (shift + n) 키를 누르게 되면 이전 검색 결과로 커서가 이동됩니다. 

 

마지막 검색 결과에서 n 키를 누르면 맨 처음 검색 결과로 이동

 

검색 결과의 마지막에 도달한 경우 n 키를 한번 더 누르면 맨 처음 결과로 되돌아갑니다.  

 

정규표현식으로 검색하기

앞서 말씀드린대로 vim에서의 검색 기능은 정규표현식을 지원하기 때문에 매우 강력합니다. 

아래는 정규표현식을 써서 " " 로 감싸여 있는 문자열만 검색하는 예제입니다.

 

정규표현식으로 검색

 

위에서 입력된 정규표현식 ".*" 를 간단하게 설명드리겠습니다.

먼저 특수기호 . (마침표)* (별표: 애스터리스크)는 특별한 의미를 지니는 문자입니다. 

.  기호모든 문자 1개와 매칭이 됩니다. 즉, 어떤 문자가 와도 상관이 없다는 의미입니다. 

*  기호바로 앞 문자0개 이상 반복된다는 의미입니다. 0개부터 무한대로 반복되죠.

전체를 다 해석해보면 " 로 시작하고 " 로 끝나며 " " 사이에 어떤 문자가 몇 글자가 오던 전부 매칭이 되는 것이죠.

즉, " " 로 감싸여진 모든 문자열과 매칭됩니다. 

 

문자열 바꾸기

vim에서 문자열을 바꾸기 위해서는 명령행 모드에서 치환 명령어를 입력해야 합니다. 

문자열을 바꾸는 명령어는 substitute 라는 단어에서 따온 s 이며 아래와 같은 형식으로 구성되어 있습니다.  

(시작줄),(끝줄)s/찾을패턴/바꿀문자열/옵션

위와 같이 s 명령어 바로 앞에는 범위를 지정할 수 있는데, 문서 전체에서 바꾸기를 원하는 경우 % 라는 특수 기호를 사용합니다. 

 

아래 예제에서는 : 키를 눌러 명령행 모드로 진입한 뒤 %s/score/num/g 라고 치환 명령어를 입력하여 문자열을 바꿔봤습니다. 

score 를 num 으로 변경하는 예제. 변경이 적용된 라인 수를 알 수 있다

 

위 예제에서는 / (슬래시) 를 구분자(delimeter)로 사용하였지만, 바꾸고자 하는 패턴이나 문자열에 슬래시가 있는 경우 구분자를 @ 또는 | 등으로 변경해서 사용할 수 있습니다.

%s@score@num@g

%s!score!num!g

%s?score?num?g

%s#score#num#g

한 가지 주의하셔야 할 부분은 구분자를 위와 같이 통일시켜야 한다는 것입니다.

일부만 바꿔 쓰는 것은 허용되지 않습니다.

 

명령어의 가장 뒤에 옵션 부분에는 아래와 같은 옵션을 지정할 수 있습니다.

g: 매칭되는 문자열을 물어보지 않고 변경

i: 대소문자를 구분하지 않고 변경 (ignore cases)

c: 매칭되는 문자열마다 바꿀 것인지 사용자에게 물어보고 변경

 

옵션은 두가지 이상 한번에 지정할 수 있지만 g 옵션보다 c 옵션이 더 우선됩니다.

 

찾을 패턴에는 정규 표현식을 사용할 수 있기 때문에 활용도가 매우 높습니다. 

패턴을 사용하여 변경하는 경우 패턴이 의도한대로 동작하는지 검색을 통해 확인한 뒤에 바꾸기를 하는 것이 좋습니다. 

 

-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 남겨주시면 감사하겠습니다.

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

안녕하세요 피터입니다.

오늘은 C언어로 2진수를 출력하는 예제를 소개해드리겠습니다.


개요

일상 생활에서 우리가 다루는 숫자는 10진법을 사용합니다.

하지만 컴퓨터의 세계는 0과 1로 이루어져있죠.


경우에 따라서는 10진수로 되어 있는 숫자를 2진수로 변환애서 출력해볼 필요가 있습니다. (일반적인 경우에는 16진수로 출력하겠지만요!)


이번에 소개드릴 예제는 양수 또는 음수의 10진수를 입력받아서 2진수로 출력하는 예제입니다.


당연한 얘기겠지만 C언어의 비트 연산자를 사용합니다.

연산자에 대한 내용은 아래 글을 참조해주세요.

[C언어 강좌-7] 연산자 (Operator)


예제 소스

#include 
int main()
{
	int input = 0;
	int mask;

	while (true)
	{
		printf("Input Number(Decimal: if you input zero then exit): ");
		scanf_s("%d", &input);

		if (input == 0)
		{
			break;
		}

		for (int i = 31; i >= 0; i--)
		{
			mask = 1 << i;
			printf("%d", input & mask ? 1 : 0);


			if (i % 8 == 0)
				printf(" ");
		}
		printf("\n");
	}

    return 0;
}

사용자의 입력을 scanf 함수를 이용해서 input 변수에 담습니다.


for 구문에서는 mask 변수를 이용하여 맨 왼쪽 비트(bit)부터 순차적으로 한글자씩 출력합니다.

현재 자리수만 1이고 나머지가 0인 mask과 input 값과 & 연산(and 연산)을 하면 현재 자리수의 값이 0인지 1인지 알 수가 있습니다.

이때 8 비트 단위로 한칸 띄어쓰기를 해줘서 가독성을 높입니다.


실행 결과

Input Number(Decimal: if you input zero then exit): 100
00000000 00000000 00000000 01100100
Input Number(Decimal: if you input zero then exit): 255
00000000 00000000 00000000 11111111
Input Number(Decimal: if you input zero then exit): -200
11111111 11111111 11111111 00111000
Input Number(Decimal: if you input zero then exit): 65535
00000000 00000000 11111111 11111111
Input Number(Decimal: if you input zero then exit):

컴퓨터는 음수를 표현할 때 2의 보수 형태로 표현합니다.
2의 보수란 값의 모든 비트를 반전(0은 1으로, 1은 0으로) 시킨 후 1을 더한 값입니다.

그렇기 때문에 값이 음수인지 양수인지 알기 위해서 맨 앞자리 비트실제 값으로 사용하지 않고 부호 비트(sign bit)로 사용됩니다.

만일 맨 앞자리 비트를 부호 비트가 아닌 값으로 사용하고 싶을 때에는 unsigned 로 선언하면 됩니다.

아래처럼요.

unsigned int a;




-Peter의 우아한 프로그래밍

여러분의 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요