컴퓨터의 정의
전자 회로를 이용한 고속의 자동 계산기
(냉장고, 휴대폰, 컴퓨터, 세탁기 등등)
하드웨어Hardware와 소프트웨어Software로 이루어져 있다.
Von Neumann architecture 폰 노이만 구조
입력장치 >> 주기억장치 <> 제어장치 >> 연산장치 <> 주기억장치>> 출력장치
중앙처리장치(CPU) 안에 제어장치와 연산장치가 있다.
프로그램 실행과 데이터 처리라는 중추적인 기능의 수행을 담당
입출력 저장장치 제어 산술연산장치 제어장치
폰 노이만 아키텍처와 하버드 아키텍처는 컴퓨터 구조의 한 종류이다.
- 산술 논리 장치와 프로세서 레지스터를 포함하는 처리 장치
- 명령 레지스터와 프로그램 카운터를 포함하는 컨트롤 유닛
- 데이터와 명령어를 저장하는 메모리
- 외부 대용량 저장소
- 입출력 메커니즘
장점
컴퓨터에 다른 작업을 시킬 때 하드웨어의 교체 없이 소프트웨어만 교체하면 되므로 범용성이 매우 향상된다.
즉, 전선을 일일이 교체하지 않고 프로그램만 교체하는 것으로 다른 작업을 수행할 수 있다.
단점
폰 노이만 구조에서는 나열된 명령을 단순히 순차적으로 실행하는 것을 반복하기 때문에 지연 현상이 발생하고, 이를 폰 노이만 병목 현상이라고 한다.
CPU가 명령어를 빨리 처리해도 명령어를 불러오는 속도가 느리다면 전체 속도가 느려진다.
병목 현상을 해결하기 위해 여러 방법들이 고안되었다.
Harvard architecture 하버드 아키텍처
폰 노이만 병목현상을 해결하기 위해 제안된 컴퓨터 구조이다.
프로그램의 메모리와 데이터 메모리가 물리적 구분 없이 하나의 버스로 CPU와 교류하기 때문에 폰 노이만 병목 현상이 발생한다. 이를 프로그램 메모리와 데이터 메모리를 물리적으로 구분해 다른 버스를 사용하게 하게 만든 것이 하버드 아키텍처이다. 따라서 명령어가 끝나고 다음 명령어를 바로 가져올 수 있기에 하버드 아키텍처는 폰 노이만 구조보다 빠르게 작동할 수 있다. 현대 컴퓨터는 외부적으로 폰노이만 구조를 따르면서 CPU 내부는 하버드 아키텍처를 적용해 속도를 향상시켰다.
폰 노이만 구조는 현대 컴퓨터의 기본 구조라고 할 수 있다. 하지만 메모리를 '읽고 쓰는' 구조라서 기억장치에 병목현상이 생긴다고 한다. 이것을 해결하기 위해 메모리가 저장되는 곳과 데이터를 저장하는 곳을 구분한 하버드 아키텍처라는 것이 개발되었다. 현대의 컴퓨터는 외부는 폰노이만 구조를 쓰고 있으나 CPU 내부는 하버드 아키텍처를 적용해서 속도를 향상시킨 것이 많다.
CPU Central Processing Unit
"CPU(중앙 처리 장치)는 컴퓨터에서 기억, 해석, 연산, 제어라는 4대 주요 기능을 관할하는 장치를 말한다.
기억, 해석, 연산, 제어라는 매우 중요한 역할들을 도맡는, 컴퓨터의 대뇌라고 할 정도로 매우 중요한 부분 중 하나다. 프로그램의 명령어를 해석하여 데이터를 연산/처리를 하고 그렇게 돌아가도록 제어해주는 부분, 혹은 그 기능을 내장한 칩을 의미한다. 컴퓨터가 동작하는 데 필요한 모든 계산을 처리하며 컴퓨터를 뇌에 비유하자면 단기기억 담당은 RAM, 장기기억은 SSD 와 HDD, CPU는 사고를 담당하는 대뇌피질 정도로 볼 수 있겠다. 대뇌피질 없이 인간의 사고가 성립하지 않듯이 컴퓨터도 CPU 없이는 아무런 기능도 하지 못하는 고철일 뿐이다."
Main memory 주기억 장치
메모리는 대체로 주기억장치를 뜻하며, 특히 RAM 램을 가리키는 경우가 많다고 한다.
RAM은 단기기억. 컴 끄면 사라진다.
메모리 계층 구조(Memory hierarchy)란 메모리를 필요에 따라 여러 가지 종류로 나누어 둠을 의미한다[1]. 이때 필요한 대부분의 경우 CPU가 메모리에 더 빨리 접근하기 위함이다.
메모리 계층구조 도식도
일반적으로 오른쪽 그림1과 같이 나타낸다. 레지스터와 캐시는 CPU 내부에 존재한다. 당연히 CPU는 아주 빠르게 접근할 수 있다. 메모리는 CPU 외부에 존재한다. 레지스터와 캐시보다 더 느리게 접근 할 수 밖에 없다. 하드 디스크는 CPU가 직접 접근할 방법조차 없다. CPU가 하드 디스크에 접근하기 위해서는 하드 디스크의 데이터를 메모리로 이동시키고, 메모리에서 접근해야 한다. 아주 느린 접근 밖에 불가능하다.
1차 기억 장치 컴퓨터 메모리
2차 기억 장치 보조 기억 장치
3차 기억 장치 니어라인 스토리지 및 클라우드 스토리지
보조 기억 장치
현재 사용하지 않는 프로그램은 보조 기억장치에 저장
주 기억장치에 비해 느리지만, 대용량 기억 가능
저장 장치 FDD, HDD, CD, DVD, USB, SSD 등
- 하드 디스크
- 디스켓(플로피 디스크)
- CD-ROM 계열
- DVD 계열
- 블루레이 디스크 (BD)
- 플래시 메모리
- 낸드 플래시
- NOR 플래시
- 집 드라이브
- 재즈 드라이브
- 자기 테이프
- USB 플래시 드라이브
- 솔리드 스테이트 드라이브
솔리드 스테이트 드라이브 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. SSD는 여기로 연결됩니다. 다른 뜻에 대해서는 SSD (동음이의) 문서를 참고하십시오. SSD (솔리드 스테이트 드라이브) 솔리드 스테이트 드라이브(solid-state drive, SSD)
ko.wikipedia.org
입출력장치
입력장치 : 키보드, 마우스, 선풍기 버튼
출력장치 : 모니터, 스피커, 선풍기 모터
Software 소프트웨어
각각의 고유한 기능을 수행하는 하드웨어가 언제 어떻게 동작하여 문제를 해결할 수 있는지 지시하는 명령어 집합
카카오톡은 메신저프로그램
시스템소프트웨어
유틸리티 커널
하드웨어가 뭘 할 지 알려주는 것. 시스템을 제어한다.
응용소프트웨어
응용소프트웨어는 시스템소프트웨어 위에서 움직임
데이터의 기본 단위
비트 bit, binary digit
모든 것은 비트로 시작한다
2진법 쓰는 이유: 비트를 쓰기 위해
전기off/on가 있고 없고를 선택하기 위해서 2진법을 쓴다.
컴퓨터는 전기가 있고 없고 밖에 모른다!
바이트 byte
8bit = 1byte
1바이트
0부터 255 색상
바이트 계산
16진수 0부터 15까지 쓸 수 있다.
1bit 8칸이다.
2**7*1
|
2**6*1
|
2**5*1
|
2**4*1
|
2**3*1
|
2**2*1
|
2**1*1
|
2**0*1
|
= 128+64+32+16+8+4+2+1 = 255
0까지 포함해서 256 컬러임..
**을 제곱 표시로 사용 *은 곱셈
2**7*1
|
2**6*1
|
2**5*0
|
2**4*1
|
2**3*0
|
2**2*1
|
2**1*0
|
2**0*0
|
= 212
각 칸당 2의 제곱
이진법 16진법
진법은 수의 체계를 만드는 것
같은 값을 표현하는 방식이 다를 수 있다.
수는 변하지 않는다. 이것을 어떻게 나타낼 것인가.
10진법 0부터 9까지 조합해서 양을 나타내기로 함. 문자 0, 1, 2 등은 숫자라는 기호임.
문자는 9까지 제한, 자릿수로 의미를 매기기
10진법의 123은 100이 1개 10이 2개 1이 3개
2진법 2의 배수만큼 커짐
2진법이 전기를 사용하는데 경제적이다.
수는 어떻게 계산할 것인지 다르게 표현해서 다양하게 활용할 수 있다.
진법의 활용: 컴퓨터가 데이터를 저장할 때 숫자의 규칙을 정해서 효율적으로 저장해준다.
파이썬 외의 다른 언어를 사용할 때는 더욱 중요한 개념이다
트랜지스터 Trangister
IC 직접회로 반도체=트랜지스터 회로
칩 하나에 수백개가 달려있다.
세발 트랜지스터가 등장하면서 모든 게 달라졌다..!
회로로 제어할 수 있다.
물리적으로 수정할 필요가 없고,
전기적으로 조절만 하면 바로 조정이 됨
매우 작다 매우 용량이 크다 20세기 최고 발명품 중 하나 현재의 컴퓨터와 핸드폰을 사용할 수 있게 함.
자료형 Data type
2**7*0
|
2**6*1
|
2**5*0
|
2**4*0
|
2**3*0
|
2**2*0
|
2**1*0
|
2**0*1
|
= 숫자 65
= 문자 A
문자를 표기하기 위해 문자 인코딩 규칙을 만들어 주었다.
그래서 문자인지 숫자인지 자료형 Data type을 정의해 주어야 한다.
데이터 타입이 맞지 않으면 에러가 난다. ^^
알파벳이 1바이트 자리 다 먹음
이진수에 문자를 적용한 규칙:: 유니코드 표 ::: 대응표
문자열 String
"" 또는 ''로 감싸서 사용
1개 이상의 문자가 나열된 형태
단어 하나 당 1바이트, 띄어쓰기도 문자다
연산자 Operator
피연산자Operand에 대해 지정된 연산을 지시하는 기호
ex) 숫자들은 피연산자 계산하는 기호들은 연산자
산술연산자 : 수학적 계산을 하는 연산자 +, -, ?, *, ** 등
문자열에서의 연산자
숫자 연산자와 다른 의미 >> 추상화
+ : 문자열에서는 데이터를 연결함
* : 문자열에서는 데이터를 반복함
print("안녕하세요."+"반갑습니다.")
print("안녕하세요"*5)
위 처럼 작성하고 Ctrl+F5누르고 >> TERMINAL을 보면 output
안녕하세요.반갑습니다.
안녕하세요안녕하세요안녕하세요안녕하세요안녕하세요
이렇게 나옴
프로그래밍 언어들에는 이미 정의가 되어 있다.
문자열에서 연산자를 print("안녕하세요"+10) 이런 식으로 섞어 쓰면 에러남
인덱싱 indexing
전체 문자열에서 각 문자의 위치를 인덱스index라고 함
인덱스로 한 개의 문자 위치를 콕 찍어 선택하는 것을 인덱싱이라고 함
길이가 있는 다른 타입의 데이터에도 적용 가능
위치(좌표!)라서인지 0부터 시작함 위치로 이해해야 함. 빨간 숫자가 인덱스의 위치다.
H
|
e
|
l
|
l
|
o
|
0 1 2 3 4
인덱싱을 이용해 그 좌표의 오른쪽에 있는 문자를 불러올 수 있다
이것도 일종의 연산임
숫자형 데이터는 안됨
print("Hello"[0])
print("Hello"[1])
print("Hello"[2])
print("Hello"[3])
print("Hello"[4])
print("Hello"[-1])
H
e
l
l
o
o
슬라이싱 slicing [ a : b ]
전체 문자열에서 인덱스를 활용해 일부분을 잘라냄
나열된 형태의 길이가 있는 다른 타입의 데이터에도 적용 가능하다.
indexing과 함께 많이 유용하게 사용됨. 데이터 일부를 가져올 때 사용한다.
좌표로써 이해해야 한다.
print("Hello"[1:3])
print("Hello"[2:4])
print("Hello"[:3])
print("Hello"[2:])
el
ll
Hel
llo
len()
len 내장함수: 데이터 길이가 얼마인지 숫자 내놓음
length 길이
# print("Hello"[100]) Error out of index
print(len("Hello"))
5
built-in function 내장 함수
파이썬에서(만) 기본적으로 제공하는 함수
특별한 설정없이 바로 사용 가능
이미 정의가 되어 있어서
연산은 이미 정의되어 있는 것 : 다른 프로그램에도 사용 가능.
내장 함수는 파이썬만 ..
print() , len() 등등
function 함수
y = f (x) 특정 동작을 수행하는 코드의 집합
함수를 정의definition하고(만들고)
함수를 호출call(갖다쓰기)한다.
예를 들어 print()도 미리 정해준 함수다. 함수이름()
함수는 보통 기능 단위로 만든다(정의한다).
데이터가 입력이 되고 함수 안에서 어떤 방식으로 처리한 후 결과값을 내 놓는 방식
결과값끼리 뭉쳐서 어떤 프로그램을 구성하기도 한다.
input(입력되는 데이터:x)
return(출력되는 결과값:y)
len("")
variable 변수
그릇이나 상자로 비유함.
변수 자체는 그릇이다.
그 그릇 안에 들어있는 값이 중요하다.
램 데이터 메모리 저장장치는 넓이가 있고 주소가 있다.
cpu중앙처리장치가 데이터를 처리한다.
메모리에서 데이터를 CPU로 데려와서 처리를 해야 하는데.
어떤 데이터를 메모리 어디서 가져와야 하는지 CPU에 이야기를 해줘야 하니까..
메모리 안의 데이터 주소가 필요함.
* 데이터 주소는 16진수
데이터를 불러오기 쉽도록
메모리의 어떤 값을 적용할 이름
추상화하여 개념만 남기는 것이 변수이다.
number = 10
= 는 프로그래밍에서는 대입연산자/할당연산자라고 한다.
= 오른쪽 것을 =의 왼쪽(메모리)에 저장한다는 의미
number는 변수 이름
변수 정보에는 변수이름 변수값 데이터타입 등의 정보가 있다.
변수 이름은 변수가 아니다.
변수값은 재할당 된다.
변수는 재사용이 가능하다.
print(2) 에서 2는 상수임.
a=2 에서 a는 변수이름 2는 변수값 a에 2를 할당하라~
print(a) 에서 a는 변수임
# 변수 이름 규칙
# 영어, 숫자, _ 만 사용 (파이썬은 한글도 됨)
# 제일 앞에는 숫자가 오면 안된다.
# 키워드 사용 불가 : 변수로 정의할 수 없는 단어들이 있다.
name = "본인 이름" # 변수값을 꼭 넣어줘야 한다.
first_name = "땡땡"
last_name = "김"
name = last_name + first_name #변수값은 재할당 가능하다. 최신값 반영됨.
print(name)
a = 6 #변수를 정의하고 값을 할당해 준 것.
b = 2
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a ** b)
print(a // b)
print(a % b)
김땡땡
8
4
12
3.0
36
3
0
변수 수학백과
변수란 값이 특정지어지지 않아 임의의 값을 가질 수 있는 문자를 뜻한다.
변수 두산백과
요약 문자가 여러 값을 취할 때 그 문자를 변수라 한다. 2x+1이라는 식이 있다고 하자. 이 식은 x의 값에 어떤 숫자를 넣느냐에 따라 그 값이 변하는 식이다. 예를 들어 x=1일 때는 2x+1=2·1+1=3이 되고 x=4일 때는 2x+1=2·4+1=9가 된다. 이와 같이 수학에서는 값이 정해져있지 않고 변하는 경우 문자로 그 값을 표시해두는데 이 때 이 문자를 변수라 한다. 여기서는 당연히 x가 변수가 된다.
구조적 프로그래밍
조건문(if문) 반복문(for문) 등을 사용한 프로그래밍
if 문의 구조
"""
if 조건:
실행하려는 코드
코드2줄
코드3줄
코드4줄
if문은 조건이 True(참)일 때만 안쪽 코드블럭을 실행
if 조건:
조건이 참일 때 실행하려는 코드
else:
아닐때 실행하려는 코드
else는 조건이 False(거짓)일 때 안쪽 코드 블럭을 실행
if 조건1:
조건1이 True일 때 실행
elif 조건2:
조건1은 False, 조건2는 True일 때 실행
else:
조건1 False, 조건2 False일 때 실행
"""
# bool
# True(참), False(거짓)
number1 = 6 #숫자형 정수형 변수
number2 = 6
if number1 > number2:
print(number1 > number2)
print("number1이 더 크다.")
elif number1 == number2:
print(number1 == number2)
print("number1과 number2가 같다.")
else:
print(number1 > number2)
print("number2가 더 크다.")
# 비교 연산자 (a, b는 변수)
# a > b a가 b보다 크다.
# a >= b a가 b보다 크거나 같다.
# a < b a가 b보다 작다.
# a <= b a가 b보다 작거나 같다.
# a == b a와 b가 같다.
# a != b a와 b가 같지 않다.
print(2 > 3) # False
print(2 >= 3) # False
print(2 < 3) # True
print(2 <= 3) # True
print(2 == 3) # False
print(2 != 3) # True
print("a" < "b") # True 사전 순서대로 뒤로 갈수록 커짐
print("CAT" < "DOG") # True 첫글자 기준
print("COW" > "CAT") # True 첫글자가 같으므로 두번째 글자 기준
print("DOG" == "dog") # False 문자열의 경우 로그인에 많이 쓰임!
print("DOG" > "dog") # False 대문자가 작음
◆ 문제 정의
◆ 문제 절차(알고리즘) 밟기
◆ 결과 도출
Code block 코드 블럭
파이썬은 들여쓰기로 코드블럭을 구분한다.
탭이나 띄어쓰기4번으로 권고. 통일해줘야 에러 안남
코드 블럭을 적절히 잘 지켜주세요!!!
불린 Boolean
영국의 수학자였던 조지 부울(George Boole)의 이름을 따서 만든 부울 데이터형은 참(True)/거짓(False) 혹은 0/1이라는 이진값을 갖는다.
# bool
# True(참), False(거짓)
True(), False()
둘다 예약어이기 때문에 첫글자 대문자까지 맞춰 써줘야 함.
숫자형 정수형 변수
숫자형 실수형 변수
문자형 변수
할당연산자 대입연산자
비교연산자
우선순위 비교 등 많이 쓰임.
= 할당, 대입연산자
== 비교연산자 중 같다 라는 의미!
# 논리 연산자 (bool 연산자에 사용, True/False 피연산자에 적용)
# and a and b a와 b가 모두 True 일 때만 True, 아니라면 False
# or a or b a와 b 중 하나라도 True면 True, 둘다 False면 False
# not not a 참True이면 거짓False으로 거짓False이면 참True으로 바꾸어 줌. 단항연산자
print(True and True) # True
print(True and False) # False
print(False and True) # False
print(False and False) # False
print(True or True) # True
print(True or False) # True
print(False or True) # True
print(False or False) # False
print(not True) # False
print(not False) # True
age = 17
money = 10000
if age <= 20 and money >= 10000:
print("성인이고 부자입니다.")
if age >= 20 or money >= 10000:
print("성인 또는 부자입니다.")
# 둘다 참일 때만 print가 실행됩니다!
# 문자나 숫자도 bool 형태로 적용된다.
# 0이 아니라면 1로 인식 문자가 들어있다면 1(True)이 되고 문자가 없다면 0(False)이 됨
if "안녕":
print("안녕하세요")
# 숫자가 들어있는지 안 들어있는지 체크할 때 사용. 숫자는 0이면 False, 0이 아니면 True가 된다.
if 0:
print(0)
간단한 프로그램 형식 확인
weather = "맑음" # weatheer 변수에 값 할당
print("비가 오나요?", weather == "비")
# weather의 값이 비와 같다는 비교연산식의 경우 결과가 프린트 된다. 비가 오나요? True 출력
if weather == "비": # weather 값이 "비"와 같으면 조건식이 True이므로 안쪽 코드 블록 실행
print("우산을 가져간다.")
elif weather == "맑음": #if로 들어가게 되면 elif에는 들어가지도 않음!
print("날씨가 좋다.")
else: # 조건식이 False이면 실행
print("우산을 가져가지 않는다.")
# 끝. 프로그램 종료
날씨가 좋다.
치킨과 맥주와 음료수를 다 먹고 싶은 사람이 있다.
age = 19
money = 15000
chicken = 20000
beer = 10000
drink = 5000
# if money >= chicken:
# print("치킨을 먹는다.")
# money = money - chicken
# if money >= beer and age >= 20:
# print("맥주를 먹는다.")
# money = money - beer
# if money >= drink:
# print("음료수를 먹는다.")
# money = money - drink
# 돈 있는대로 다 사 먹으려고 함
if money >= chicken + beer + drink and age >= 20:
print("치킨과 맥주와 음료수까지 먹을 수 있다.")
elif money >= chicken + beer and age >= 20:
print("치킨과 맥주 또는 치킨과 음료수까지 먹을 수 있다.")
elif money >= chicken + drink:
print("치킨과 음료수까지 먹을 수 있다.")
elif money >= chicken and age >= 20:
print("치킨이나 맥주나 음료수를 먹을 수 있다.")
elif money >= chicken :
print("치킨이나 음료수를 먹을 수 있다.")
elif money >= beer + drink and age >= 20:
print("맥주와 음료수를 먹을 수 있다.")
elif money >= beer + drink and age < 20:
print("음료수를 먹을 수 있다.")
elif money >= beer and age >= 20:
print("맥주나 음료수를 먹을 수 있다.")
elif money >= drink:
print("음료수만 먹을 수 있다.")
else:
print("아무것도 못 먹는다.")
* 다른 사람의 코드를 많이 보는 것이 좋다.
age = 20
money = 4000
chicken = 20000
beer = 10000
drink = 5000
# 변수 money의 잔액을 기준으로 작성한 다른 분의 코드
# 중복 if문 들여쓸 때 계층에 유의해야 한다
# 돈이 많으면 모든 메뉴를 먹고 음료수 두개 먹음..
if money >= chicken:
print("치킨을 먹는다.")
if money - chicken >= beer and age >= 20:
print("맥주를 먹는다.")
if money - chicken - beer >= drink:
print("음료수를 먹는다.")
if money - chicken >= drink:
print("음료수를 먹는다.")
elif money >= beer and age >= 20:
print("맥주를 먹는다.")
if money - beer >= drink:
print("음료수를 먹는다")
elif money >= drink:
print("음료수를 먹는다.")
else:
print("다음에 온다.")
※ 파이프라인 : |