170410_TIL

|

오늘 할 일 (계획)

  • 패스트캠퍼스 컴퓨터공학 입문 수업 참여 및 강의노트 정리하기

오늘 한 일 (회고)

  • 컴퓨터공학 입문 수업을 듣고 강의노트를 정리했다.
    • 파이썬의 추상클래스, 다형성
    • 캐시메모리
    • 2진수, 10진수, 16진수
    • 2의 보수

내일 할 일

  • 패스트캠퍼스 웹프로그래밍 스쿨 사전과제 제출하기
  • 패스트캠퍼스 컴퓨터공학 입문 수업 듣기
  • 영어공부 게시판 정렬방식 변경 (공지사항 최상단 + 최신순), 로그인하지 않은 사용자에게도 댓글 입력창 표시

생활코딩 git 07 - github clone, git remote, pull

|

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

원격저장소

원격저장소는 소스코드와 버전을 백업하고, 다른 사람과 협업을 하기 위한 핵심적인 기능입니다. 여기서는 원격저장소에 대해서 알아봅니다

  • local repository & remote repository
  • 원격저장소의 중요한 의미 2가지
    • 소스코드를 백업한다.
    • 다른사람과 협업한다.
  • 혼자서 작업하는 경우 원격 저장소를 사용하는 이유는 크게 많지는 않다. 왜냐하면 대안이 있기 때문이다. (드롭박스, 구글 드라이브와 같은 클라우드 스토리지 서비스)

원격 저장소를 지역 저장소로 복제

여기서는 github.com이라는 서비스를 소개하고, 이 서비스를 이용해서 이미 존재하고 있는 오픈소스의 원격저장소의 내용을 내 컴퓨터의 지역저장소로 가져오는 방법에 대해서 알아봅니다. 이 과정에서 git의 소스코드와 이 소스코드의 첫번째 커밋의 내용도 알아봅니다.

  • git의 소스코드를 지역저장소로 가져오기
git clone https://github.com/git/git.git 폴더이름
  • 로그를 거꾸로 출력하기
git log --reverse
  • git의 첫번째 커밋으로 체크아웃하기
git checkout e83c5163316f89bfbde7d9ab23ca2e25604af290

원격 저장소 만들기

  • 원격 저장소의 별명을 설정할 수 있다. (저장소 주소가 길기 때문에)
  • 여러개의 원격 저장소를 로컬저장소로 저장할 수 있다.

remote 저장소 설정

# 원격 저장소의 이름(별명)을 각각 origin , memo 지정한다.
❯ git remote add origin https://github.com/wayhome25/gitfth.git
❯ git remote add memo https://github.com/wayhome25/memo.git
❯ git remote
memo
origin


# 로컬저장소를 origin 원격저장소의 master 브랜치로 연결하여 push한다.
# 처음에 한번만 -u 설정을 하면 앞으로 git push 만 입력해도 origin의 master 브랜치로 push한다.
❯ git push -u origin master

remote 저장소 변경

# 현재 원격 저장소 상태 확인
❯ git remote -v
# 변경하고자 하는 원격저장소 설정
❯ git remote set-url origin https://github.com/wayhome25/fastcampus_school
  • 이미 존재하는 원격 저장소를 새로운 로컬 저장소에 연결할 수 있다.
  • 별도의 remote 설정없이 clone을 통해서 원격 저장소와 연결된다.
❯ git clone https://github.com/wayhome25/gitfth.git .
❯ git remote -v
origin	https://github.com/wayhome25/gitfth.git (fetch)
origin	https://github.com/wayhome25/gitfth.git (push)

원격 저장소와 지역 저장소의 동기화 방법

하나의 원격저장소를 중심으로 두개의 지역저장소가 소스코드를 동기화하는 방법에 대해서 알아봅니다.

  • 동기화의 효용
    • 협업을 할 때
    • 여러대의 컴퓨터에서 작업할 때 (집에서 작업하다가 회사에서 작업을 계속 하는 등)
  • 모든 저장소들은 버전에 대한 모든 정보를 각자 갖고 있다.
  • 어떤 작업을 하기 전에는 git pull, 작업이 끝나면 git push를 하는 것을 습관화 시켜야한다.
# 집에서 (git_home/ 폴더)
git add f1.txt
git commit f1.txt
git push

# 회사에서 (git_office/ 폴더)
git pull
git add f1.txt
git commit f1.txt
git push

강의노트 09. [객체지향] oop (상속실습)

|

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

상속 실습

  • Person 이라는 부모 클래스를 갖는 Retailer 클래스와 Buyer 클래스를 작성한다.
  • 수업자료

Person 클래스

# 공통 속성을 뽑아서 부모 클래스 Person을 정의
# class_person.py

class Person:
    def __init__(self, name, age, money):
        self.name = name
        self.age = age
        self.money = money

    def give_money(self, other, how_much):
        if how_much <= self.money:
            other.money += how_much
            self.money -= how_much
        else:
            print('you don\'t have enough money')

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

# 테스트 코드
# 만약 이 파일이 import 모듈이 아니라 메인함수일 때 실행

if __name__ == '__main__':
    p1 = Person('sunshine', 25, 5000)
    p2 = Person('monkey', 21, 1000)

    p1.give_money(p2, 500)

    p1.showMyInfo()
    p2.showMyInfo()

Seller 클래스

# class_seller.py

from class_person import Person

class Seller(Person):
    price = 1000

    def __init__(self, name, age, money, product_num):
        super(Seller, self).__init__(name, age, money)
        self.product_num = product_num

    def sell(self, other, how_many):
        if self.product_num >= how_many and other.money >= self.price * how_many:
            self.product_num -= how_many
            other.product_num += how_many

            self.money += self.price * how_many
            other.money -= self.price * how_many     

        else:
            print('상품이 부족하거나 돈이 부족합니다.')         

    def showMyInfo(self):
        super().showMyInfo()
        print('I\'m seller. I have {} products'.format(self.product_num))

Buyer 클래스

# class_buyer.py

from class_person import Person

class Buyer(Person):
    def __init__(self, name, age, money, product_num):
        super(Buyer, self).__init__( name, age, money)
        self.product_num = product_num

    def buy(self, other, how_many):
        if self.money >= other.price * how_many and other.product_num >= how_many:
            self.product_num += how_many
            other.product_num -= how_many

            self.money -= other.price * how_many
            other.money += other.price * how_many               
        else:
            print('상품이 부족하거나 돈이 부족합니다.')

    def showMyInfo(self):
        super().showMyInfo()
        print('I\'m buyer. I have {} products'.format(self.product_num))

메인함수

#class_main.py

from class_person import Person
from class_seller import Seller
from class_buyer import Buyer

p1 = Seller("greg", 35, 10000, 100)
p2 = Buyer("taehwan", 21, 10000, 0)

p1.showMyInfo()
print('\n')
p2.showMyInfo()

p1.sell(p2, 3)
p2.buy(p1, 3)
print('\n')

p1.showMyInfo()
print('\n')
p2.showMyInfo()

강의노트 09. [객체지향] oop (is-a, has-a, 객체합성)

|

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

객체지향 용어

  • Class: 클래스를 통하여 새로운 자료형을 직접 정의한다.
  • Object: 가장 기초적인 자료형. 혹은 어떤 자료형의 인스턴스
  • Instance: 어떤 클래스를 통하여 생성된 객체는 해당 클래스의 인스턴스
  • def: 클래스 안에서 함수를 정의(define)하는 방법
  • self: 클래스 함수 안에서 쓰임. 접근한 인스턴스/객체를 가리키는 변수
  • Inheritance: 한 클래스가 다른 클래스의 특성(trait)을 상속
  • Composition: 한 클래스를 다른 클래스의 일부로 합성할 수 있음
  • is-a: notebook is a computer. 한 항목이 다른 항목을 상속
  • has-a: 한 항목이 다른 항목을 합성했거나 어떤 특성을 가졌다. 요즘은 이 경우에 객체합성을 사용

수업내용

목차

  • 상속
    • is-a (상속)
    • has-a (상속 X)
      • 지금은 안쓰지만 예전 코드를 이해하려면 알아야한다.
      • 객체합성으로 대체 및 해결한다. (아주 과거에는 상속으로 해결했다)
  • 함수 오버로딩, 오버라이딩 (아주 중요)
  • class member의 쓰임
  • 추상 클래스의 목적과 쓰임 (생각보다 많이 쓰임)
  • 정보은닉 (information hiding)
  • 캡술화 (encapsulation)
  • 절차지향에서 객체지향으로 (oop porting 과제)
  • 다형성 (polymorphism) - 파이썬만으로 다형성을 이해하면 오해의 여지가 큼 (C++ 예시로 학습)

상속 : is-a (아주 중요)

  • 가장 이상적이다. 자식이 부모로서 is-a 합당한가 ?
  • notebook is a computer (o)
  • laptop is a desktop (x)
  • computer 라는 공통 속성이 있고 (부모클래스) laptop, notebook 는 공통 속성을 각각 상속받는다.

오버라이딩과 오버로딩

  • 상속에서 쓰이는 개념
  • 같은 이름의 함수가 있으면 자식의 함수가 우선
  • (참고) 오버로딩
    • 같은 공간 (네임스페이스)안에 같은 이름의 함수를 정의하는 것을 함수 오버로딩이라고 한다.
    • 하지만 파이썬에서는 오버로딩을 인정하지 않는다. 마지막으로 정의된 함수만 인정 (c++ 함수 오버로딩 가능)

is-a 상속 예시

# 부모 : 자식이 모두 가지는 공통된 속성(attribute)을 모두 여기에서 정의
class Computer:
    def __init__(self, cpu, ram):
        self.cpu = cpu
        self.ram = ram

    def calculate(self):
        print('컴퓨터 계산중')

    def __str__(self):
        return '나는 컴퓨터입니다. '


# 부모클래스 computer를 상속받은 Notebook 클래스 정의
class Notebook(Computer):
    def __init__(self, cpu, ram, touch='normal', cam='small'):
        # 1. 클래스 이름으로 접근
        Computer.__init__(self, cpu, ram)
        self.touch = touch
        self.cam = cam

    def calculate(self): # 오버라이딩  - 같은 이름의 함수가 있으면 자식의 함수가 우선
        print('노트북 계산중')

    def __str__(self):
        return super(Notebook, self).__str__() + '그리고 난 노트북이죠!'

# 부모클래스 computer를 상속받은 Desktop 클래스 정의
class Desktop(Computer):
    def __init__(self, cpu, ram,  external_graphic = "Geforce"):
        # 2. super()로 접근
        super(Desktop, self).__init__(cpu, ram)
        # super(type, obj) -> bound super object; requires isinstance(obj, type)
        self.external_graphic = external_graphic

    def calculate(self): # 오버라이딩
        print('데스크탑 계산중')

    def __str__(self):
        return super().__str__() + '그리고 난 데스크탑이죠!'

상속 : has-a, 객체합성

  • A policeman has a gun이라는 상태를 이런식으로 쓸 수있지 않을까?
class Gun:
  ....

class Police(Gun):
  ...
  • 과거의 레거시 문법 (현재는 아무도 안쓴다)
  • 그럼 이런 개념을 has-a가 아니라 어떻게 표현할 수 있을까? 객체합성으로 하자!

객체합성 (composition)

  • has-a 라는 현실 상황을 객체합성이라는 기법을 사용하여 해결한다. (고급기법)
  • A Police has a Gun.
class Gun:
    def __init__(self, kind):
        self.kind = kind

    def bang(self):
        print('빵야빵야')

# 객체합성
class Police():
    def __init__(self, gun_kind=''):
        if gun_kind:
            self.gun = Gun(gun_kind) # Gun클래스의 인스턴스객체를 생성하여 Police의 인스턴스 멤버로 할당한다.)
        else:
            self.gun = None #gun이라는 인스턴스 멤버는 있지만 값은 없는 상태

    def get_gun(self, gun_kind):
        self.gun = Gun(gun_kind)

    def shoot(self):
        if self.gun:
            self.gun.bang()
        else:
            print('당신에게는 총이 없습니다.')
p1 = Police('리볼버')
print(p1.gun.kind) # 리볼버
p1.shoot() # 빵야빵야

p2 = Police()
p2.shoot() # 당신에게는 총이 없습니다.
p2.get_gun('기관총')
p2.shoot() # 빵야빵야

__name__ = '__main__' 의미

  • 테스트를 위해 넣은 코드가 모듈 import시에 실행되지 않도록 한다.
  • python test.py 처럼 직접 파일을 실행시키면 if 문이 참이되어 if 다음 문장들이 수행된다. (main file : 실행파일)
  • 참고
  • 모듈을 개발할 때 확인을 위한 테스트 코드 작성시에 활용한다.
if __name__ == "__main__":
  ....
  테스트 실행문

UML

  • uml
  • sw architect가 설계 할 때 사용
  • 한눈에 클래스의 상속 관계를 알 수 있는 도안

캡슐화

  • 클래스의 존재 목적 : 연관성 있는 정보의 묶음
  • 그럼 연관성의 기준을 어디까지 잡을 건지? (사람마다 다를 수 있다. 정답은 없다.)
  • 어디까지 캡슐로 묶을 건가? 이걸 잘 짜는게 (UML) sw architect의 역할

상속 실습

  • Person 이라는 부모 클래스를 갖는 Retailer 클래스와 Buyer 클래스를 작성한다.
  • 수업자료

170409_TIL

|

오늘 할 일 (계획)

  • 패스트캠퍼스 컴퓨터공학 입문 수업 강의노트 정리하기
  • django 사진 업로드 기능 공부하기 (인프런)
  • Swift3 & iOS10 수업듣기
  • 생활코딩 git 원격저장소 수업 듣기
  • 패스트캠퍼스 웹프로그래밍 스쿨 사전과제 제출하기

오늘 한 일 (회고)

  • 생활코딩 git수업을 들었다.
    • 아직 협업할 기회가 없어서 pull 기능을 적극적으로 활용할 기회는 없지만, 여러대의 컴퓨터에서 작업할 때 각 지역저장소 파일을 동기화 할 수 있다는 점은 참 편리한 것 같다.
  • 컴퓨터공학 입문 수업 강의노트를 정리했다.
    • oop 상속 (is-a, has-a, 객체합성)
    • 상속 실습내용 연습
  • 영어공부 게시판에 pagination을 추가했다.
    • 최신순 정렬로 되어 있는데, 공지사항 글을 항상 최상단에 올려두는 방법을 찾아봐야겠다.

내일 할 일

  • 패스트캠퍼스 컴퓨터공학 입문 수업 듣기
  • 영어공부 게시판에 사진 업로드 기능 추가하기