컴퓨터공학 입문수업 2주차 강의노트
22 Mar 2017 | 2진수 16진수강의 중에 자유롭게 메모한 정리되지 않은 내용입니다.
강의 내용은 다른 포스팅에 따로 정리하였습니다.
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
- python 파일입출력 부분 강의 노트 업데이트하기
- 절차지향, oop
- decorator, closure 공부하기
- 클래스 멤버
유용한 정보
- 영어 독해능력 (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의 개념 등이 다름)