생활코딩 git 05 - git 병합(merge) / 충돌(merge conflict)

|

생활코딩-git 수업을 듣고 중요 내용을 정리합니다.

병합

B 브랜치를 A 브랜치로 병합(merge)할 때 (B => A)

$ git checkout A
$ git merge B

병합(merge) 확인

❯ git log --branches --graph --decorate --oneline
*   d66cc18 (HEAD -> master) Merge branch 'exp'
|\
| * 7ba6cb1 (exp) 6
| * 019d8ce 5
| * d239731 4
| * 410316d 3
* | 2e6dadd 7
|/
* db667dd 2
* 932645b 1

B 브랜치를 삭제할 때

$ git branch -d B
Deleted branch B (was d66cc18).

충돌

  • merge 과정에서 파일의 이름이 같으면 충돌이 발생한다.
  • 파일이 다르면 무조건 자동으로 합쳐준다.
  • 파일이 같아도 수정한 부분이 다르다면 자동으로 합쳐준다. (버전관리를 사용하는 정말 중요한 이유중의 하나)

충돌이 생기면 아래와 같은 메시지가 뜬다.


❯ git merge exp
Auto-merging common.txt
CONFLICT (content): Merge conflict in common.txt
Automatic merge failed; fix conflicts and then commit the result.

git status를 하면 충돌이 일어난 파일을 찾을 수 있다.

❯ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

	both modified:   common.txt

no changes added to commit (use "git add" and/or "git commit -a")

충돌이 발생한 파일을 수정한다.

  • 개발자가 직접 둘 중에 어느 수정 사항을 반영할 것인지 판단하여 수정

merge conflict 발생 후 common.txt 파일 상태

  • 이 정보를 참고로해서 두개의 코드를 병합한 후에 특수기호들을 제거한다.
  • 수정 후 add, commit 진행하면 정상적으로 merge commit이 진행된다.
❯ vim common.txt
  1 function b
  2 <<<<<<< HEAD        # 현재 checkout 한 브랜치의 상태
  3 fucntion a(master)  
  4 =======             # 구분자 ====================
  5 fucntion a(exp)      
  6 >>>>>>> exp         # 병합하려는 대상인 exp 브랜치의 상태
  7
  8 function c

강의노트 07. [객체지향] 클래스 / 인스턴스 변수, 클래스 / 인스턴스 / 스태틱 메소드

|

패스트캠퍼스 컴퓨터공학 입문 수업을 듣고 중요한 내용을 정리했습니다. 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.

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

예시

class Point:
    a = 10 # 클래스 변수
    def __init__(self, _x, _y):
        self.x = _x # 인스턴스 변수
        self.y = _y

    @classmethod
    def class_method(cls):
        print("클래스 메소드 호출!", cls.a)

    def instance_func(self): # 인스턴스 메소드
        print("인스턴스 메소드 호출!")

    def __str__(self):
        return "({}, {})".format(self.x, self.y)


  • 인스턴스 메소드는 인스턴스가 있어야 실행이 가능하다.
Point.instance_func() # TypeError 발생
  • 클래스 메소드는 클래스 자체로 실행 가능하다.
Point.class_method() # 클래스 메소드 호출! 10
  • __dict__ 를 통해서 객체의 심볼테이블(변수를 저장해 놓는 공간)를 확인 가능하다.
p1 = Point(1, 2)
p1.__dict__  # 인스턴스의 심볼 테이블 확인
# {'x': 1, 'y': 2}

Point.__dict__  # 클래스의 심볼 테이블 확인
# 'a': 10,
# 'class_method': <classmethod at 0x10d5a2ba8>,
# 'instance_func': <function __main__.Point.instance_func>})
  • 인스턴스가 클래스 변수에 접근하여 수정할 수 없다.
Point.a # 10
p1.a # 10
p1.a = 5 # 인스턴스 멤버 생성
Point.a # 10 클래스 멤버 a는 수정되지 않는다.
p1.__dict__  # {'a': 5, 'x': 1, 'y': 2} 새로 정의한 인스턴스 멤버 a 추가

클래스 변수

  • 모든 인스턴스 객체가 공유한다.
  • 인스턴스가 클래스 변수에 접근하여 수정할 수 없다.
class Person:
    #클래스 변수, 클래스 멤버 : 모든 객체가 공유한다
    planet = 'Earth'

    def __init__(self, name, age, money):
    	#객체변수, 인스턴스 멤버 초기화
        self.name = name
        self.age = age
        self.money = money

클래스 메소드 / 인스턴스 메소드 / (참고) static 메소드

이 세 가지 메소드는 모두 클래스 안에서 정의 됩니다. 인스턴스 메소드는 인스턴스를 통해서 호출이 되고, 첫 번째 인자로 인스턴스 자신을 자동으로 전달합니다. 관습적으로 이 인수를 ‘self’라고 칭합니다. 클래스 메소드는 클래스를 통해서 호출이 되고 “@classmethod”라는 데코레이터로 정의합니다. 첫 번째 인자로는 클래스 자신이 자동으로 전달되고 이 인수를 관습적으로 ‘cls’라고 칭합니다. 스태틱 메소드는 앞서 설명한 두 메소드와는 틀리게 인스턴스나 클래스를 첫 번째 인자로 받지 않습니다. 스태틱 메소드는 클래스 안에서 정의되어 클래스 네임스페이스 안에는 있을뿐 일반 함수와 전혀 다를게 없습니다. 하지만 클래스와 연관성이 있는 함수를 클래스 안에 정의하여 클래스나 인스턴스를 통해서 호출하여 조금 편하게 쓸 수가 있는 것 입니다. 출처

class method

  • 주로 생성자 오버로딩으로 쓰인다.
  • 메소드를 클래스의 멤버로 선언한다.
  • class 자체를 매개변수 (cls)로 받는다. (인스턴스 메소드는 self인 인스턴스를 인자로 받음)
  • @classmethod 데코레이터를 사용한다.
# 클래스 함수
# class method : 첫번째 매개변수로 class를 자동으로 받는다.
   # 주로 생성자 오버로딩으로 쓰인다.(파이썬에서는 원칙적으로 생성자 오버로딩 안됨)
   @classmethod
   def FromString(cls, string):
       name, age_int, money_int = string.split('-')
       age = int(age_int)
       money = int(money_int)
       return cls(name, age, money)

   #클래스 변수의 값을 변경할 때 사용한다.
   @classmethod
   def ChangePlanet(cls, pln):
       cls.planet = pln
  • 클래스 변수를 변경할 때, 직접 변경하는 방법도 있지만 데이터 검사나 다른 부가 기능등의 추가가 필요할 때 클래스 메소드를 이용하면 아주 편리함
  • 예시 : 직원들의 연봉 인상률을 일괄 변경할 때 인상률은 1 이상으로만 변경 가능하도록 한다. (데이터 무결성 검사를 실시한 후, 데이터가 1보다 큰 경우에만 클래스변수를 변경)
class Employee:
	raise_amount = 1.1 # 연봉 인상률 클래스 변수

	#...생략

	@classmethod
	def change_raise_amount(cls, amount):
		while amount < 1: # 데이터 무결성 검사
			print('[경고] 인상률은 1보다 작을 수 없습니다.')
			amount = input('[입력] 인상률을 다시 입력해 주세요 \ㅜn=> ')
			amount = float(amount)
		cls.raise_amount = amount
		print('인상률 {}가 적용되었습니다.'.format(amount))

# 실행예시
Employee.change_raise_amount(0.9)
# [경고] 인상율은 "1"보다 작을 수 없습니다.
# [입력] 인상율을 다시 입력하여 주십시오.
# => 1.2
# 인상율 "1.2"가 적용 되었습니다.

instance method

  • 인스턴스 메소드는 인스턴스가 있어야 실행이 가능하다.
# 객체 함수
def giveMoney(self, other,how_much):
    if how_much <=self.money:
        other.money +=how_much
        self.money -= how_much
    else:
        print("you don't have {0}".format(how_much))

def showMyInfo(self):
    print("{0} has {1}".format(self.name, self.money))

(참고) static method

  • @staticmethod 데코레이터를 사용하여 선언한다.
  • @classmethod 와는 다르게 cls 매개변수를 받지 않는다. 이로 인해서 상속받는 경우 동작이 달라진다.

예시 1

class momClass(object):
    name = 'mom'

    @staticmethod
    def get_name_static():
        print(momClass.name)

    @classmethod
    def get_name_class(cls):
        print(cls.name)

# momClass를 상속받는 sonClass 정의
class sonClass(momClass):
    name = 'son'

sonClass.get_name_static() # mom : momClass의 name 속성을 반환  
sonClass.get_name_class() # son : sonClass의 name 속성을 반환

예시 2

class foo():
    @classmethod
    def set_name(cls, name):
        cls.name = name

class bar(foo):
    pass

foo.set_name('foo')
foo.name # foo

bar.set_name('bar')
bar.name # bar

예시 3

class foo():
    @staticmethod
    def set_name(name):
        foo.name = name

class bar(foo):
    pass

foo.set_name('foo')
foo.name # foo
bar.name # foo

bar.set_name('bar')
foo.name # bar
bar.name # bar

강의노트 06. ASCII, UNICODE, utf8

|

패스트캠퍼스 컴퓨터공학 입문 수업을 듣고 중요한 내용을 정리했습니다. 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.

아스키코드 (ASCII)

  • 7bit (2의 7승 : 128 가지 문자)
  • American Standard Code for Information Interchange
  • 컴퓨터의 기본 저장 단위는 바이트(byte)이고, 1byte는 8bit이다.
  • 1byte에는 2의 8승에 해당하는 256개의 고유한 값을 저장할 수 있다.
  • 아스키코드는 7비트로 128개의 고유한 값을 저장한다. (문자 하나당 숫자 하나를 매핑, 1비트는 별도의 목적을 위해서 사용)
  • 로마자 및 특수 기호(한글 포함 안됨)
views
0~127에 각각 고유값을 저장

유니코드 (UNICODE)

  • 2byte (2의 16승 : 65,536가지 문자)
  • 한글은 자음과 모음의 조합 개수만해도 128개를 넘는다.
  • 이와 같이 7bit ASCII 코드에 담을 수 없는 문자를 정의하기 위해서 2byte 국제표준코드 유니코드가 등장하였다.
  • 2byte는 16bit로 2의 16승 약 6만 5천개의 문자를 저장할 수 있다.
  • 유니코드로 ASCII 코드를 포용 가능하다.

유니코드 확인

  • ‘A’ - U+0041 ( = ASCII ‘A’ 는 16진수로 41)
  • (참고) 파이썬에서 유니코드 확인하기
>>> '\u0041'
>>> 'A'

>>> '\uAC00'
>>> '가'

UTF-8

  • 유니코드 부호화 방식 (8bit 기반 )
  • 가변 길이 유니코드 인코딩 시스템
  • 특정 문자 집합 안의 문자들을 컴퓨터 시스템 안헤서 사용할 목적으로 일정한 범위 안의 정수 (코드값) 들로 변환하는 방법
  • ASCII 코드의 언어는 1byte로 나타내며, 한글의 경우 3byte로 나타낸다.

utf-8 탄생 배경

  • 유니코드를 사용하면 영어권 사용자들은 메모리 낭비가 2배가 된다. (영어는 1byte ascii로 충분하기 때문에)
  • 유니코드는 2byte로 규약을 했으나 메모리에 저장하고, 네트워크에 통신 할 때 한번 걸러서 저장을 한다 (부호화 : encoding)
    • 0~127 사이에 존재하는 모든 코드 포인트(ASCII)들을 1byte로 저장
    • 128 이상인 것은 2byte, 3byte로 저장한다. (한글은 3byte)

파이썬의 기본 부호화 방식 utf8

>>> coded = "abcde".encode()
>>> coded
b abcde


>>> for i in coded_string:
        print(i)

97
98
99
100
101

>>> coded_string = "파이썬".encode()
>>> coded_string
b'\xed\x8c\x8c\xec\x9d\xb4\xec\x8d\xac' # 한 글자당 3byte

>>> coded.decode()
'파이썬'

강의노트 05. 절차지향 방식 Data analysis

|

패스트캠퍼스 컴퓨터공학 입문 수업을 듣고 중요한 내용을 정리했습니다. 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.

절차지향 프로그래밍 방식으로 프로그램 작성하기

개요

작성할 프로그램

  • 학생들의 점수 데이터를 통해 평균과 표준편차를 구하고,
  • 이를 기준으로 평가를 내린다.

데이터

  • class_A.bin
  • 상기 파일은 pickle.dump를 통해서 데이터 입력이 이루어졌으며, 딕셔너리 자료형을 갖고 있음 (pickle로 데이터를 저장하거나 불러올때는 파일을 바이트형식으로 읽거나 써야한다. (wb, rb))
  • lass_A.bin 파일 내용
{'greg': 95},
{'john': 25},
{'yang': 50},
{'timothy': 15},
{'melisa': 100},
{'thor': 10},
{'elen': 25},
{'mark': 80},
{'steve': 95},
{'anna': 20}

코드작성

import pickle
import math
from functools import reduce

# 평균
def average(scores):
    return reduce(lambda a, b: a + b, scores)/len(scores)

# 분산
def variance(scores, avrg):
    return reduce(lambda a, b: a + b, map(lambda s:(s-avrg)**2, scores))/len(scores)

# 평가
def evaluateClass(avrg, std_dev):
    if avrg <50 and std_dev >20:
        print("성적이 너무 저조하고 학생들의 실력 차이가 너무 크다.")
    elif avrg > 50 and std_dev >20:
        print("성적은 평균이상이지만 학생들 실력 차이가 크다. 주의 요망!")
    elif avrg < 50 and std_dev <20:
        print("학생들간 실력차는 나지 않으나 성적이 너무 저조하다. 주의 요망!")
    elif avrg > 50 and std_dev <20:
        print("성적도 평균 이상이고 학생들의 실력차도 크지 않다.")

# 파일에서 원하는 점수 데이터만 리스트로 만들기
f = open("class_A.bin", "rb")
# with open("class_A.bin", "rb") as f: 방식이 더 좋다

items = []

while 1:
    try:
        data = pickle.load(f)
    except EOFError:
        break    
    items.append(data)

print(items)

scores = []

# normal way
'''
for item in items:
    for value in item.values():
        scores.append(value)
'''

#pythonic way??
scores = list(map(lambda x: x[0] , map(lambda item:list(item.values()),items)))

print(scores)

avrg = average(scores) # 평균
variance = round(variance(scores, avrg), 1) # 분산
standard_deviation = round(math.sqrt(variance), 1) # 표준편차

print("\n")

print('*' * 50)
print("A반 성적 분석 결과")
print('*' * 50)
print("A반의 평균은 {0}점이고 분산은 {1}이며, 따라서 표준편차는 {2}이다".format(avrg, variance, standard_deviation))
print('*' * 50)
print("A반 종합 평가")
print('*' * 50)

print('\n')
evaluateClass(avrg, standard_deviation)

f.close()

170405_TIL

|

오늘 할 일 (계획)

  • 컴퓨터공학 입문 강의노트 정리 마무리 하기
  • 패스트캠퍼스 컴퓨터공학 입문 수업 듣고 강의노트 정리하기
  • 생활코딩 git branch 수업 듣기
  • AskDjango 수업 듣기
  • jekyll 블로그 pagination 방법 찾아보기 참고

오늘 한 일 (회고)

  • 생활코딩 git branch 수업을 들었다.
    • git merge, merge conflict
  • 컴퓨터공학 입문 수업에서 그동안 많이 듣기만 했던 ASCII, 유니코드, utf8에 대해서 배웠다.

내일 할 일