컴퓨터공학 입문수업 2주차 강의노트

|

강의 중에 자유롭게 메모한 정리되지 않은 내용입니다. 강의 내용은 다른 포스팅에 따로 정리하였습니다.

4/7 (금) DAY9

유용한 정보

  • marp 마크다운으로 프리젠테이션 하는 툴

10진수 -> 2진수로 바꾸기

  • 10진수 38 = 32(2^5) + 4(2^2) + 2(2^1) => 2진수 100110
  • 10진수 7 = 4(2^2) + 2(2^1) + 1(2^0) => 2진수 111
  • 10진수 73 = 64(2^6) + 8(2^3) + 1(2^0) => 2진수 1001001

2진수 -> 10진수 바꾸기

  • 2진수 100110 = 2^5 + 2^2 + 2^1 => 10진수 38
  • 2진수 10101 = 2^4 + 2^2 + 2^0 => 10진수 21

2진수 <-> 16진수 바꾸기

  • 16진수 : 0~15 까지 16개의 숫자를 0~f 로 표현
  • 2진수 4개 = 16진수 1개
  • 16진법을 2진법으로 바로 변환하려면 각 자릿수를 2진법으로 변환하면 된다.
    • 예를 들면 25FB16를 0010(2) 0101(5) 1111(F) 1011(B)처럼 끊어서 변환한 다음 전부 붙여주고 앞의 00을 떼준 뒤 100101111110112로 적으면 된다.
  • 반대로 2진법을 16진법으로 바로 변환하려면 1의 자리에서부터 4개씩 끊어서 16진법으로 변환해주면 된다.
    • 101110101010101010111101000102를 (000)1 0111 0101 0101 0101 0111 1010 0010로 끊어주고 각각 변환하면 175557A216이 된다.
    • 100 0101 1000 = 4 A 8 => 0x4A8

16진법

  • 자리수 하나가 0-15까지 표현할 수 있다.
  • 16진수의 자리수 1개는 2^4을 표현할 수 있다.
  • 1바이트는 8비트이고 이를 통해서 표현할 수 있는 수는 2^8개이다.
  • 2진법이라면 8자리가 필요하지만, 16진법이라면 2자리만으로 가능하다.

2의 보수

  • 1의 보수 : 0은 1로, 1은 0으로 바꾸는 방식
  • 1의 보수의 문제 : 0이 2개 생긴다.
    • +0 : 0000 0000
    • -0 : 1111 1111
  • 2의 보수 : 1의 보수에 1을 더하는 것 (컴퓨터에서 음수를 표현하는 방식)
  • 맨 앞자리는 양수와 음수를 구분하기 위해서 사용(사인비트) 0: + 1: -
  • 컴퓨터에는 뺄셈 로직이 없기 때문에 보수를 사용한다.
  • 예: 2의 보수 11110011 => 1의 보수 1 1110010 => 부호화 절대값 1 0001101 => 10진수 -13

수업내용

목차

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

상속

  • 상속은 언제 쓸까?
  • OOP의 핵심 개념

is-a (아주 중요)

  • 가장 이상적이다. 자식이 부모로서 is-a 합당한가 ?
  • notebook is a computer (o)
  • laptop is a desktop (x)
  • computer 라는 공통 속성이 있고 (부모클래스) laptop, notebook 는 공통 속성을 각각 상속받는다.
  • 꼬이면 해결하기 어렵기 때문에 요즘에는 상속을 되도록 쓰지말라는 말이 나온다.
  • 클래스 만들 때 첫자는 대문자로 하는게 좋다.

오버라이딩

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

has-a

  • 과거 레거시 문법 (현재는 아무도 안쓴다)
  • A policeman(자식) has a gun(부모)
  • 종류가 아닌 소유
  • class gun, class police(gun) 이런식으로 쓸 수있지 않을까?
  • 그럼 이런 개념을 has-a가 아니라 어떻게 표현할 수 있을까? 객체합성으로 하자!

객체합성

  • 고급기법
  • has-a 라는 현실 상황을 객체합성이라는 기법을 사용하여 해결한다.
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 인스턴스를 생성해서 인스턴스 멤버로 할당한다.)
        else:
            self.gun = None # 멤버는 있지만 값은 없다.

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

    def shoot(self):
        if self.gun:
            self.gun.bang()
        else:
            print('당신은 총이 없습니다. 못 쏩니다.')

oop 실습

__name__ = '__main__' 의미

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

UML

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

캡슐화

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

4/5 (수) DAY8

궁금한점

  • 수업에서 배운 pickle 모듈을 통해서 파일 입출력을 복습하고 있습니다.
  • abc.txt 파일을 작성하고 해당 내용을 pickle.dump() 를 사용하여 abc2.txt 를 만들었습니다.
  • 만들어진 abc2.txt 파일에 원하지 않는 문자가 함께 들어가는 문제가 발생합니다.

질문은 아래와 같습니다.

  • 바이너리(wb) 형식으로 txt 파일에 데이터를 입력하면 문제가 생기나요?
    • 답변 : 그렇지는 않습니다. 하지만 dump로 txt 파일을 작성하지 않고 vim, 메모장 등에서 작성한 txt 파일에는 별도의 정보가 추가로 들어갈 수 있다. (따라서 pickle.load를 데이터를 읽어오면 원하지 않는 문자열이 들어감)
  • pickle.load()를 통해서 읽어올 수 있는 파일은 pickle.dump()를 통해서 바이너리(wb) 형식으로 입력된 데이터를 가진 파일만 가능하나요?
    • 답변 : 그렇습니다.

유용한 정보

  • 아스키와 유니코드, utf8 (아주 중요 - 동영상 강의 다시 보기)
  • reference counting (가비지 컬렉터)
    • c를 제외한 모든 언어는 가비지 컬렉터를 갖고 있다. (노트 내용 참고)
    • 이를 통해서 메모리 관리를 한다.
  • 심볼테이블 (변수를 저장해 놓는 공간)
    • .__dict__ 를 통해서 클래스가 가진 심볼테이블을 확인할 수 있다.
    • 모든 인스턴스는 자신의 심볼테이블에는 없지만 클래스의 변수에 접근할 수 있다.
    • 같은 변수가 존재 한다면 같은 공간 안에 있는 변수가 우선한다.
  • 인스턴스 멤버와 클래스 멤버의 차이 (중요)
  • 인스턴스 메소드와 클래스 메소드의 차이 (중요)

4/4 (화) DAY7

todo

유용한 정보

  • 영어 독해능력 (3-4년) 이후 네트워크

    정규분포식

  • pickle 사용법
  • pickle.dump? : 인터페이스를 보여준다. (주피터에서만 가능)

.items(), .keys(), .values()

  • 적차적프로그래밍 방식으로 데이터 분석 소스

oop

  • oop를 하는 가장 큰 이유는 modeling
  • 클래스변수와 인스턴스변수

  • 파이썬은 데이터를 저장할 때 ram의 private heap 부분에만 저장한다.
  • 파이썬은 연산한 정보를 저장할때 ram의 stack 부분에 저장 (c는 register에 저장 엄청빠름)

4/3 (월) DAY6

todo

수업 소개

  • 양태환 강사님
  • ythwork83@gmail.com
  • 2-3주차 내용은 어려울 예정
  • 자료구조는 전공을 포기하게 만드는 큰 원인 중 하나
  • call by reference, call by value는 C, C++ 로 설명할 예정 (파이썬 - call by assignment 사용)
  • sw 개발자가 되는 법 (넥슨 박종천 부본부장)
    • recursion, index, sort
    • stack / Heap
    • process / Thread
    • call by reference, call by value
    • native code
    • write simple text-based games
  • 레지스터를 모르면 인터프린터 언어와 컴파일 언어를 이해하기 어렵다.
  • 최적화를 했냐 안했냐가 개발자의 능력 : 메모리 / CPI(성능영향) - 메모리와 CPU
  • 하나의 언어만, 웹프로그래밍만 하는게 아니라 최적화를 위해서 메모리와 CPU를 알아야한다. (인터프린터언어 - 컴파일언어 하나 이상 배우는 것을 추천)
  • python은 메모리는 stack, heap(모든 오브젝트와 변수를 저장)만 사용한다.
  • framework의 단점은 쉽게 할 수 있도록 이미 틀이 존재한다는 것
  • 전통적인 sw 공학에서 dic은 자료형이 아니다. 정확하게 말하면 dic은 자료구조
  • 장고는 강력하지만 느리다 (렉서, 파서 최적화를 통해서 장고가 점점 빨라지고 있다. 개선의 여지가 있음)
  • 파이썬만 하지말고 컴파일러 언어 (자바)를 꼭 같이 배우는 것을 추천 (array의 개념 등이 다름)