오늘은 오늘은 제일 재미없는 시간이에요.
그러니까 자료 구조를 하기 위해서 자료 구조를 다루기 위해서 이런 이런 개념들이 있습니다라는 얘기를 할 건데요.
어떤 저 같은 사람은 이런 게 별로 재미없어 해요.
그러니까 막 바로 저 같은 사람이 아니라 일반 뭐가 일반인지
프로그램 여러분들 지금 수준에서는 코딩 코드를 보고 설명하고 이게 이렇게 동작해요가 더 나올 것 같고요 그러지 않고 얘는 글만 딱 있어요.
그래서 좀 지겨운 건데 여기서 한 번에 이해 못하셔도 돼요.
다음에 이제 코드 각각의 데이터 코드를 보면서 충분히 여기 나오는 얘기가 뭔지 다 이해하실 겁니다.
그런데 그렇다고 해서 지금 얘기 안 하면
또 그때 제가 쓰는 용어를 모르실 거라서 지금 그냥 얘기하는 거예요.
근데 잘 못 알아들어도 괜찮다 고 그냥 따라오세요.
그리고 여기 글은 잘 안 쓰여 있어서 글도 좀 이상하더라고요 하여간 인트럭션입니다.
그래서 이 과목은 알고리즘 분석 중요성 이 차트는 알고리즘 분석의 중요성 중요 개념들 관련된 사항들을 설명한대요 그래서 1.1에서 변수 레어블
설명합니다. 배려블은 시를 자바를 아실 테니까 다 아는 거고요 예를 들어서 사실은 이런 수식을 우리는 다루지는 않지만 수식이라는 게 뭐죠 이 퀄리티를 다루지는 않죠.
보통 어사인먼트를 다루는 거지 있다고 치고 얘네 숫자가 있고 xy가 있는데 얘네들의 값이 변하는 것들이 우리가 베리어블이라고 하는 거고
그 값들이 변하는 공간을 어디엔가 저장 공간을 가지고 있을 거고요 메모리에 우리가 여기서 알아야 할 건 이 방정식에는 이름들 y가 있고 그 이름에는 각각 데이터들이 들어갈 건데 걔네들을 데이터를 보관하는 의무가 있다.
그러겠지 그다음에 컴퓨터 공학에서는 데이터를 저장할 무엇인가가 필요한데 그거를 베려블이라고 한다
위에 위에 식
이런 걸 보면 변수 xy가 있는데 거기에 10 20 이런 정수 값이 들어갈 수도 있고 0.23인고요 0.23 5.5 이런 실수 값도 들어갈 수도 있고요 아니면 물론 트로폴스의 제업을 한다는 게 약간 어색하긴 하지만 곱하기라고 치고 분리한 값을 넣을 수도 있고요
이런 얘기를 왜 하는가 보면 이 베리어블의 들어가는 값의 종류가 좀 다르다라는 걸 수 있다라는 거고 수학에서는 그 값의 종류에 따라서 크게 염두를 두지 않아요.
그거에 따라서 플러스 하는 방식이 다르다고 생각하지 않고 곱하기 하는데 다르다고 생각하지는 않는데
컴퓨터 사이언스는 이 인티저와 실수와 훈련을 저장하는 방식부터가 다르며 저장하는 방식이 다른가 라고 보면 시에서 당연히 인티저는 2의 보수 트로스 컴플리먼츠 이렇게 해서 저장한다고 들은 것 같고 실수는 플로팅 포인트 뭐 하는 방식 부가 있잖나 부 실수
승부 가시고 이름을 외우는 게 힘들 그거 있죠.
약간
훈련은 01 한 빛으로 하는 게 다르고 조정 방식만 다른 게 아니라 더하기 빼기 하는 방식도 사실은 달라요 인간은 1박하기 1을 1 더하기 1을 1박하기 1이나 1.0 더하기 2.0이나 같은 방식으로 하지만 사실은 꼼꼼히 보면 우리가 너무 똑똑해서 그런 거고요 달라요
그러니까
이렇게 1.02하고 2.0 더하는 건 얘는 그냥 이렇게 더 하면 되는데 얘는 1.02 하고 2.0 소수점을 맞춘 다음에 이렇게 이렇게 이렇게 더하죠.
그런 것처럼 우리 스피u 안에 정수 더하게 하는 모듈하고 세수도 하고 모듈하고 다르게 있다고 하는 방식이 달라서
곱하기도 그렇고요
컴퓨터 공항에서는 저 오퍼레이션도 다르게 해요.
그래서 저는 타입과 밸리의 타입이 중요한 거죠.
물론
데이터 척척 시간 배우면서 저런 것까지 따지지는 않겠지만 그런 얘기가 있다.
그래서 가격 종류를 지정해야 되는데 이런 걸 데이터 타입이라고도 하고요 제가 이번 연도에 슬라이드를 다시 보면서 말이 매끄럽지 않은 부분을 살짝 고치긴 했는데 혹시 슬라이드를 벌써 뽑으신 분들이 있으면 제가
완전히 틀려서 고쳐야 되면 얘기를 하고요 말만 좀 바뀌는 거면 얘기 안 할게요 살짝 고쳐지긴 했는데 그렇다고 해서 여전히 말이 매끄럽다고 하지는 못했고요 그래서 데이터 타입에는 정수 프로스팅 포인트 문자 문자열 등이 있다.
컴퓨터 메모리에 영일만 표현할 수 있다.
이런 얘기는 다 아시는 거죠. 그래서 어떤 문제를 풀기 위해서 프로그램을 작성할 때
0 길로만 이용해서 답을 제시하기가 어렵기 때문에 이런데 데이터 타입도 고요
자
데이터 타입에는 이런 것들이 있대요 그러니까 영어로는 프리먼티 데이터 타입 즉 원시 데이터 타입으로 원시지대에 쓴 건 아니에요.
그러니까 프로그램을 랭기지가 막바로 제공해 주는 이용하게끔 해주는 인디저 플로츠 스리에서는 불리언이 없지만 특정 랭기지에서는 불리언이 있고 있으면 프리머티브라고 하고 있지 않으면 프리머티브라고 안 하죠.
그리고 그것만 부족해서 더 정리해서 만들어서 쓰는 걸 유저 디파인드 데이터 타입이라고도 하고요
힘든 얘기도 있고
시스템에서 정의된 데이터 타입을 프리먼티유 데이터 타입이라고 하는데 인체저 프로처 퀘터 이런 게 있다.
그리고 그는 그런 거는 프로그램 언어에 따라서 컴파일러에 따라서 운영 체제에 따라서 다르다 이런 얘기도 좀 들어보셨죠.
그래서 예를 들면 시에는 불리언이 없는데 파이썬에는 분리언이 있다든가 파이썬은 심지어
타입
또 있는 건지 많은 건지 살짝 애매한 사용자는 불편하지 않게 그냥 없이도 쓰는데 사실 내부에서는 있긴 있거든요.
그런 거
그다음에 머신에 따라서 지금 이 우리가 쓰는 피시 머신에서는 대부분 인티저가 32비트인데 소형 컴퓨터들 그러니까 임베디드 시스템 이런 데 들어가는 칩에서는 인튜저가 16비트일 수도 있는 거고 하드웨어에 따라서 소프트웨어에 따라서 다르다 이런 얘기도 있고요 그리고 그 사이즈에 따라서 나타날 수 있는 범위도 다르다
예를 들면 이 피자로 1617이라고 하면 이 정도 플러스 3만 땡땡땡 해서 마이너스 3만 땡땡땡까지 나타날 수 있을 거고요 사바이트면 이렇게 나타날 수 있는 거고 저런 숫자를 외울 것까지는 아닌데 나중에 데이터스포처에서도 저희도 좀 쓰기로 하죠.
os에서도 그렇고
몇 비트 몇 바이트가 어느 정도 공간을 나타내고 그러니까 32비트짜리 주소를 쓰면 공간이 2에 32승 바이트의 공간을 나타낼 수 있어서 그 정도면 4기가바이트고 이런 거는 좀 빨리 계산이 돼야 되는 거죠.
많이 해서
어
사용자 정의 데이터 타입 유저 디파인즈 데이터 타입 그러니까 특정 랭기지에서 제공해 주지 않는데 내가 만들었으면 하는 그런 것들을 유저 디파인드 타입이라고 하는 거죠.
그래서 예를 들면 시에서 스피전치라는 걸 다루고 싶어
스트리트라는 데이터 타입을 제공해 주지 않기 때문에 제가 만들어보는 거죠.
그래서 시선 스트럭트라는 걸 가지고 만드는 거고요 그래서 여러 가지 데이터들을 모으는 겁니다.
이런 개념이 사실은 얼핏 보면 그냥 그런가 보다 스트럭처 있는 거지 스트럭처 있는 거지라고 할 수도 있는데 우리가
아마 나 자바 시간에 자바 시간에 당연히 프로그램을 랭기지 배우면서 그런 얘기를 왜 스트럭처가 있을까 라는 얘기는 들으셨을 거예요.
근데 그 당시에는 잘 이해가 안 갈 수 있죠 너무 간단한 거고 당연히 있는 거니까 이제 근데 이런 생각을 해보시면 돼요 왜냐하면 제 배려 글로 여기 학생 수 넘버 러브
라는 베리어블이 있고요 그다음에 뭐랄까
2년
우리가 몇 년인지 하는 이 왜 이런 걸 했냐면 요 배리어블이랑 요 베리어블이랑은 아무런 관련이 없어요.
그래서 그냥 둘 다 단독 배리어블이라고요 그런데 어떤 경우를 보면 이 베리어블끼리 관련이 있는 관계가 있는 대리들이 있다라는 거예요.
예를 들면 어떤 학생의 메인
스튜던트네 뭐 여기에 보면 그 사람의 그레이드 확정 그 사람의 내면이 있고 아이
학번
생각해 보면 너무 당연하긴 하지만 얘네들은 얘와 얘와의 관계랑 얘네들과의 관계를 보면 얘네들은 얘랑 얘랑 뭔가 관계가 있잖아 얘는 관계가 없고 근데 관계가 없는 것처럼 관계가 있는 것들을 놔두면 뭔가 좀 부자연스럽고 프로레 할 때도 불편하고 에러를 일으키기 쉬워서 그냥 얘네들은 관련이 있는 거야
라고 해서 묶어놓은 게 스트럭처인 거예요.
그래서 우리가 c나 자바나 스트럭처를 배우는 거고요 나온 김에 그냥 그러니까 c에서 이렇게 스트럭처를 배우죠 우리가 이 시간은 c를 기본으로 하는 거지만 여러분들이 시 플러스 플러스 또는 자바를 배웠다라는 가정으로 당연히 1학년 2학기 때 배우는 거니까 우리 과는 그러면 업어버린 티드 프로그래밍 음식을 또 배우셨잖아요.
여기선 클래스가 나오죠 클래스가 이 클래스당 얘네는 뭔가라고 보면 얘네의 데이터들과 어떤 데이터들과 오퍼레이션의 관계를 본 거예요.
이어와 레지스터
등록하기 수강 신청하기 이런 거 얘랑 얘랑은 저녁
컬러로 하자
땡
전혀 관계없는 얘는 동작이고요 얘는 데이터인데 전혀 관련 없는 동작과 데이터죠 그런데 어떤 데이터와 어떤 동작은 관련이 있다라는 거예요.
아까 관련 있는 것끼리 어떻게 묶어서 스트럭처를 만들었다고 하면 이제 이 오퍼레이션은 얘에 해당하는 거잖아요.
얘네들처럼 관련 없는 게 아니라 그래서 세상이 이 데이터들만이 아니라 데이터들과 오퍼레이션의 쌍이더라 크래스 클래스로 만든 거예요.
세상을 나타나기에 세상이랑 비슷하니까 컴퓨터 프로램 언어는요 세상을 나타내려고 만든 것이고요 그래서 세상과 가장 비슷해야 좋은 언어인 거예요.
생각해 보면 우리가 쓰는
소프트웨어 컴퓨터는요 다 세상에 있는 것들을 좀 편리하게 만든 거예요.
예를 들면 수강 신청 시스템
여러분들 수능 시장
시스템이 이전에 어떻게 했는지 잘 모르시겠지만 옛날에 어떻게 했겠죠.
손으로 쓰고 5mr 카드에 작동했으면 어떻게 했겠죠.
그걸 편하게 한 거라서 편하게 만들 때는 얘가 어떻게 실제 생활에서 어떻게 하는 거구나를 잘 관찰해서 만드는 거거든요.
그러니까 랭기즈도 그걸 반영하는 게 가장 좋죠 그래서 얘는 이제 데이터와 데이터와 오퍼레이션을 묶어서
스튜던트 클라스가 있으면 스튜던트에 대한 데이터와 그다음에 오퍼레이션 레지스터 뭐지 모르겠어 학생인 지가 너무 오래됐어 퇴학하기 전과하기
그래
초보 파딩 뭐 이렇게 밥 먹기 밥 먹기 밥 먹기는 사람이 다 하는 건데
어
이런 거죠. 하여간 그렇습니다. 그래서 클래스는 조금 더 나오는 거고요 구조체 스트럭처라는 게 이제 데이터들을 묶어놓은 거라 왜 있냐 하면 관련이 있는 거
오늘 얘기는 이 체포가 바뀌면서 어떤 게 좀 넘어갈 때 관련 여기도 관련이네 병렬적으로 나오는 게 있고요 관련 있는 것들이 약간 묶여 있는 게 있는데 병렬적으로 나온 건 그냥 그런가 보다 하고 넘어가시면 돼요 1.3에서 데이터 스텝처 얘기를 잠깐 하는데요.
데이터 스트럭처는 효율적으로 데이터를 사용하기 위해
컴퓨터의 데이터를 저장하고 이용하는 방법이라고 하는데 사실 이 이름 때문에 컴퓨터 데이터 구조라는 이름 때문에 이런 생각이 잘 안 드는 거예요.
왜냐면 우리가 무슨 건물 구조라고 하면 구조 모양이라고만 생각하지 데이터 구조 데이터 스트럭처 하면 데이터가 어떻게 생겼는지만 생각하지 얘를 어떻게 이용할 건가 이런 오퍼레이션에 대한 생각은 안 하거든요.
안 한다기보다는 잘 안 들죠 다 배우고 나면 그런 건데 용어가 저렇다 보니 설명할 때 데이터를 어떻게 잘 효율적으로 사용하는 방법이라는 게 생각이 안 나고 데이터가 어떻게 생겼는지에만 관점을 두려고 하는데 어떻게 생겼는지 플러스 얘를 어떻게 이용해서 효율적으로 빠르게 이용할 건가에 대한 방법을 배우는 겁니다.
그래서 예를 들면 데이터 구조에는 어레이 파일 링크드 리스트 스테프 큐 트립 등등 등이 있다고 하는데 이렇게 두 가지로 나눌 수 있대요 우리 고등학교 때 하면 두 가지 세 가지 쓰고 외우고 하잖아요.
세상에 그렇게 딱 무 자르듯이 잘라지는 건 아니에요.
어떤 거 보면 딱 그 선상에 있는 경계선에 있는 것도 있을 수 있는데 물론 얘는 그렇지 않아요.
얘는 선형 아니면 비선형이지
빈자
이거 아닙니다. 선형 데이터 스트럭처라는 건 뭐냐면 이걸 이해하는 것 굳이 나눌 필요 나눠지기는 하죠.
근데 비선형이다. 이런 말 자체가 그렇게 의미 있는 것 같지는 않지만 뭐냐 하면 우리가 데이터들을 나타낼 때 보면
앞뒤 관계가 있는 게 있다라는 거예요.
예를 들면 자연수 1 2 3 4 5 6 7 8 90 앞에 부가 있고요 부 뒤에 101이 있고요 이런 광고 사실은 여기 있는 사람들은 이런 선형 관계 리니어한 관계에 있지 않아요.
그냥 지금은 어떻게 보면 무작위로 있거나
아니면 앉아있는 위치로 따지면 이렇게 2d에 2차원으로 있죠.
그런데 여러분들은 만약에 학번 순서로 이렇게 나타낸다.
이렇게 앉아 있는 거 말고 그러면 한 번은 유니크하고 앞뒤 크기가 있을 테니까 모든 사람을 일직선으로 나타낼 수 있잖아요.
그래서 그런 걸 선형이라고 하는 거예요.
그래서 데이터들을 봤을 때 어떤 건 선형으로 나타내시는 게 있고요
대부분은 아니지만 하여간 우리가 나타내는 것 중에 선형들이 있어요.
그래서 그런 것들은 array나 링크들 리스트로 담아서 관리를 하는 거고요 얘가 할 수 있는 건 얘가 알고 둘 다 똑같아요.
스테아우 큐는 여기에 모양은 이렇지만 접근하는 방식이 달라서 다 배우긴 배워요.
지금은 그냥 모르는 상태에서 듣는 거예요.
괜찮아요. 스테이라는 q는 물론 씨에서 배우셨겠지만
접근 가운데는 접근 못하고 앞에서만 꺼내고 뒤에서만 꺼내고 한다던가 그런 거죠.
이런 것들을 보다가 얘네들은 모양이 다른 거예요.
즉 앞뒤 관계가 있긴 있는데 트리는
트리를 우리가 그릴 때 이런 식으로 이런 식으로 그리는 건데요.
이거랑 저 선형이랑 비교해 보면 선형을 이렇게 그려버리면 얘랑 비교가 잘 안 돼요 그걸 이렇게 세로로 놓고 이렇게 그리면 여기에 그러니까 학번이 10인 사람이 있고 17 215
이렇게는 안 나타난다는 거죠. 123이 있으면 여기다가 나타날 거예요.
왜냐하면 얘랑 얘랑 크기를 비교할 수 있으니까 그런데 이렇게 할 수 없고 어떤 데이터들은 이렇게 나타내지는 데이터들이 있다라는 거예요.
그럴 때 트리를 쓰라는 거고요 예를 들면 우리가 하이키를 나타내서 지역 구분을 할 때 대한민국 밑에
서울시가 있고 경기도가 있고 부산시가 있고 그다음에 경기도 밑에는 성남시가 있고 일산 성남구가 있고 일산구가 있고 이렇게 서울에는 이럴 땐 트리를 쓰는 거고요.
그다음에 그래프 여기서 사이클이 없는 게 트인 거고 사이클이 있으면 그래프인 거죠.
그래서 우리가
어
네이버에서 네이버 지도에서 길 찾기를 한다고 하면 각각의 도시건 아니면 각각의 위치건 그게 그래프로 나타내지는 거고요 그래서 우리가 여러분들이 물러 학부 정도 수준에서는 문제 푸는 게 당연히 알려져 있는 문제를 풀게 돼요.
데이터 스트럭처를 어떻게 잡아야 될지 금방 다 아는 문제라고요 이 길찾기를 하는데 이렇게 잡고 하는 사람은 없어요.
그리고 그거를 헷갈릴 일은 없어요.
근데 조금 더 오래돼가지고 새로운 문제를 풀게 되면 내가 이 문제를 풀 때 데이터를 어떻게 잡고 해야 될지가 좀 생각이 안 들 때도 있어요.
그럴 때는 우리가 이런 식으로 나타나는 거구나라고 알고서 생각을 해 보면 되는 거죠.
덮고 졸린 시간이죠.
조리 시간
아닌가요 저만 그런가요 혹시 알아 덮고 졸린다고 그러면 그만할까 그러지 창문을 열면 되지 않을까 창문 좀 열어줄래요
저도 덥고 그래서
여기에 그래도 사찰한 것보다는 나와서 이것도 올리면 끝이 괴롭나
추천장 것보다는 괜찮은데 이렇게 먹고 나
10여 년간 졸면 뒤에 나와서 서서 들어도 돼요라고 해도 1년에 한 명 돌까 말까 졸리면 어떡하지 옆에 친한 친구랑 앉아가지고 졸리면 나 좀 때려줘 뭐 이렇게 한 번 때려주면 100원 주기
네 그런 것들 이런 데이터 스트럭처들이 있고요
책에는 앱 데이터 타입이라고 얘기를 하면서 우리가 이제 앞으로 앱 데이터 타입으로 좀 설명할 거야 어떨 때는이라고 하고요 adt라고 하는 거에 대해서 adt가 중요해 중요해 이렇게 얘기하는데 사실은 별거 아니고 우리가 생각하는 방식인데 용어가 익숙하지가 않아서 그런 거거든요.
올리면
여기가 그렇구나
더워지는데
트랙션이란 얘기하려고 저렇게 써놨네요.
그리고 여기는 이상하게도 그냥 영화만 써놨고
이제 열심히 많이 얘기해서 저희 엑스트랙을 다른 아예 안 쓰는구나 한국말로 뭐라고 얘기하는데 그렇게 점점 우리과 학생들은 얘기 안 해줘서 되게 좋아요.
근데 여전히 많이 얘기할 거고 나중에도 그럴 거라서
이거 좀 시켜야 되는
이름 아는 사람이 한 명밖에 없어서 미안한데 내가 이름 아는 사람은 지금 설마 나 아니겠지 하고 있겠지 이건 틀린 답을 원하는 거니까 그냥 시켜도 되겠지 출석부 보고 얘기하자 출석부에 맨 숫자 오늘이 공동 번째에 있는 사람 시킬게요
비싸
하나 둘 셋 넷 다섯 여섯 일곱 김준영 너무 옛날 방식이다.
준영아 틀리기를 기대하면서 얘기하는 거예요.
맞추면 제가 이제 그게 아니라 이렇게 얘기해야 되는데 맞추면 제가 곤란한 거거든요.
랙 섹션 뭔가요
추상
좋아요. 좋아요.
추상화라고 얘기하시려고 그랬죠 고마워요.
저도 이맘때 추상화라고 배웠죠 추상화
제가 이렇게 편하게 끝내주니까 좋죠 한 가지 더 물어볼 거예요.
철저하게 공대생 마인드로 그냥 머릿속에 있는 걸 생각하지 말고 지금 바로 뱉어내셔야 돼요.
추상화하면 뭐가 생각이 나요.
이게 그거 말고 머릿속에 뭐가 있잖아 공대생 마인드로 추상화 머릿속에 있는 거 피카소 솔직히 피카소 말고 생각나는 사람 없지 않아 저건 뭐야 깜짝
그런 거 아니에요.
어떻게 달라야 돼
제가 컴맹이라
아니 그러니까
우스갯소리로 이런 거 좀 못 다룰 수도 있잖아요.
앱이 어디 있는지 모르겠고 빡하게 갔는데 해피 포인트 못 참고 있으면 직원이 이렇게 해줘요.
그러면 창피하잖아요. 그럴 때 되게 쉬운 방법이 있어요.
제가 컴백이라 잘 못해요. 이러면 진짜 되게 제가
써보세요. 저희 와이프도 컴퓨터 전공하거든요.
둘 다 컴백이라 이러고 있어요. 수성아 피카소밖에 저는 이맘때 피카소밖에 생각이 안 들었거든요.
그러니까 대학교 2학년 때 3학년 때 스트라이크
추상화 피카소
그럼 피카소 하면 뭔가 그림을 그려놔요 그리고 나는 a라고 생각하는데 지 멋대로 b라고 우기는 그림들 그렇지 않아요.
그러면서 막 모든 사람들이 박
그러면 앱스트랙이 그런 건가라고 따지면 트랙에 앱스트랙에 영어 사전을 찾아보시면 이해하기 난해한 이런 거 있어요.
그게 1번 뜻이에요. 인정해요. 그런데 우리가 컴퓨터 사이언스에서 앱스트랙션을 스트라트를 그 뜻으로 쓰는 게 아니라 저기 375번째 뜻으로 쓰는 거거든요.
375번째 뜻에 이렇게 쓰여 있어요.
스테이먼트 sm라이더 인폴트 포인트 드 텍스트 그까 글이나 어디에 중요한 부분을 요약해 놓는 것을 스트레이크 앱스트랙션이라고 합니다.
동사는 스트랩 명사 앱스트랙션 앱스트랩을 명사형으로도 쓰고요
그래서 2 테이크어웨이
리모브 선팅 이런 거 지우기 없애기 그런데 아무나 중요한 걸 지우면 안 되겠죠.
되게 중요한 걸 서모레이션 안 되니까 중요하지 않은 부분을 지우는 게 스트랩입니다.
그러면 셜 데이터 타입이라고 하는 건 데이터 타입을 나타낼 건데 이 얘기예요.
중요하지 않은 부분은 좀 지울 거고 지금 생각하지 말고
중요한 부분만을 생각하는 거를 엑스 데이터 타입이라고 합니다.
그러면 여기서 뭐가 중요한데
그게 중요한 거지
그때그때 달라요 중요한 건 내가 어떤 시점에서 볼 때 어떤 시점에서 볼 때 중요한 게 다르거든요.
근데 처음. 수청 설계 단계에서는 당연히 어떻게 밑에서 어떻게 구현할 건지 c로 구현할 건지 자바로 구현할 건지 그리고 그거를 안에 뭘로 어떻게 할 건지 그런 것까지 신경 쓰지 말고 그건 나중에 일이니까 지금
하이 레벨에서 중요한 것들을 모아놓은 게 데이터의 타입인데요.
그런 관점에서 보니까 뭐 보일 거냐라고 하면 컴퓨터 포인트가
그러니까 외우지 말고 아직 내가 코딩을 안 했고 코딩하기 전에 중요한 게 트랙 데이터 타입이야라고 생각하면 이제 컴퓨터 사이언스에서 트랙 데이터 타입이라는 거는 메스메이팔 모델 4 데이터 타입 웨얼
그럴 수 있죠 여기서도 하나하나 보긴 볼 텐데요.
모델이라는 단어도 또 한 번 하고 지나갈 계획이에요.
데이터 타입 이거랑 이거랑 나타내는 거예요라고 하면 쉽게 그냥 10초 만에 끝나는 일인데 제가 스트랩이라는 단어하고
모델이라는 단어의 뜻에 이렇게 집착하는 이유는요 스트랙이라는 용어가 우리 지금 이 시간에 한 번 나오고 끝날 거다라고 하면 그냥 외우시면 돼요 그런데 앱스트랙이라는 단어는 앱스트랙션이라는 단어는 각각 교과목마다 다 나올 거거든요.
어디에선가 그리고 보는 설명이 조금씩 달라요
그러다 보면 외우려면 여기라고 그랬는데 저기서 저기라고 그랬는데 좀 다른 건데 그래서 이런 생각을 가지고 있는 추상화 라는 단어도 아셔도 되는데 뜻은 아까 간략화하는 거고 다 중요한 겁니다.
모델 모델도 한번 봐볼게요
모델
또 시킬까 모델 이번에 좀 시키기가 그러니까 모델이라고 하면 머릿속에 뭐가 있어
모델 모델
무슨 모델 저는 이렇게 딱 끊으면 패션 모델밖에 없는데 그렇지 않나요.
서로 패션 모델밖에 없죠. 잘생긴 사람이 모델인가 도대체 뭐지 라고 하면 그런 패션 모델을 생각하면 약간 헷갈려져요.
그거 말고 이런 거 봅시다
영어로 써서 미안해요. 영어 밖에 없으면서 태양계의 중용 모델이라고 하면 이제 모델이 조금 명확해질 거예요.
우리가 쓰는 모델이라는 거에서는 이런 형태로 많이 써요.
그러니까 태양계는 사실 상당히 복잡한 시스템이거든요.
상당히 어마어마하게 복잡한 시스템이죠.
태양이 있고 거기에 수도 없는 헬륨이 있고 거기가 핵융합을 하고 그다음에 지구는 어디에 있고 달도 어디에 있고 다 합쳐서 태양계잖아요.
근데 그것의 중년 모델이라고 하면 여기서도
태양의 색깔
필요 없는 것 같고 지구의 색깔 이런 필요 없죠.
지구의 크기 이건 필요한 것 같고요 태양의 크기 무게 필요하고 크기랑 무게 크기도 필요한가 무게는 필요한 것 같은데 지구와 태양과의 거리 이런 건 필요하죠 그다음에 우주에서의 절대 자표 이런 건 필요 없는 것 같고 뭔가는 필요하고 뭔가는 필요없고
그래서 이 모델도요 이 액슬렉션이랑 비슷한 느낌으로 써요.
특정 관점에서 특정 관점이 있어야 되고요 그 관점에서 관련 없는 거는 생략하는 거고요 관련이 있는 거는 킵 하는 거고 그래서 이 데이터 타입도 여러 가지 제가 있는 건데 데이터 타입의 실제가 있는 건데 그것에
수학적 모델이래요 그래서 이제 그냥 넘어와서요.
모델 때문에 얘기한 거고 그래서
응
adt라고 하는 거는 어떤 어떤 데이터 타입의 어떤 데이터의 sr 데이터 타입이라고 하는 건 요런 어떤 데이터들이 있고 어떤 오퍼레이션이 있다.
상위 레벨에서 중요한 것들을 얘기하는 거고요 어떤 관점이냐면 유저 관점이에요.
유저 관점 유저 관점에서는 필요 없는 게 있어요.
얘를
c로 구현했는지 과거로 구현했는지 그 안에 그 안에 이 레지스터를 포르으로 구현을 했는지 와일로 구현했는지 상관없어요.
나는 동작하기만 하면 되니까 얘가 어떤 데이터들을 이 스틸런지에는 메인이 있고
그레이드가 있고 아이디가 있고 이건 중요하죠 내가 이거를 얘의 데이터를 통해서 저는 정보를 꺼내야 될 테니까 어떤 오퍼레이션이 있는지도 중요해요 내가 이걸 갖고 어떻게 다룰 건가 근데 그 하우투에 대해서는 그 밑에 밑에에 대해서는 관심 없다.
이게 스트랩 데이터 타입이에요. 여기서 보시면 유저 관점에서 나타낸 거고요
그다음에 반대가 인플루엔터 관점에서 나타난 거예요.
관점이라는 거예요. 그래서 임플루멘터의 관점이 아니라 유저 관점이라는 거고요 그냥 외우실 분은 이렇게 외우시면 되고 내가 좀 더 어디 가 가지고 데이터 타입이라는 게 이런 거야라고 하면서 이렇게 좀 잘난 채 해보시고 싶으시면
이런 거를
외우면 안 돼요 외우면 다 틀려 이해하고 이런 거야 라고 좀 나아지겠죠.
그래서 이런 거죠. 그래서 문제를 푸는 과정을 단순화시키기 위해서 데이터와 이런 데이터와 연산 오퍼레이션 합쳐놓은 거를 앱슬랙 데이터 타입이라고 하는 거고요 요 앱스 데이터 타입을 다룰 때는 인플레멘테이션은 아직 신경 안 쓴다 이런 얘기 좀 생각해 보시면 되고요 그래서 예를 들면 스택
스펙이라고 하면 여기서 그냥 데이터라고만 했는데 만약에 안에 넣어야 할 게 인티저다라고 하면 인티저와 스펙의 오퍼레이션들 그러면 스튜 단트를 넣을 거면 스튜단투와 스택의 오퍼레이션들 스택의 오퍼레이션들이라고 하면 스택은 나중에 배워요.
그래서 스택은 푸시 팝을 하는 거죠.
투시합을 스택이 배워야 되니까 그래서 그냥 그냥 단순하게 얘기해 보면 스택을 만들고 스택의 데이터를 넣고 꺼내고 스택 위에는 뭐가 있는지 보는 거 스택의 안의 데이터의 개수를 확인하는 것 이런 것들이 오퍼레이션이고 아까 얘기했듯이 adt를 정의하고 생각할 때는 구현은 신경 쓰지 않아도 된다.
이런 얘기가 있죠.
이게 15분밖에 안 남았다고
내 동영상 스케줄로는 제가 그러니까 동영상 업로드하는 그러니까 예전 강의 스케줄로 보면 여기 일장을 다 끝내는 거거든요.
슬라이드는 14페이지가 또 앞으로 남아 있는
어디 대감 어디서 또 내가 이게
얘들 좀 알긴 알겠는데
그러네 알고리즘이란 저학년 강의를 하다 보면 너무 싫은 거 아닌가 이 정도는 아는 거 알고리즘이 뭔지는 아는 거 아닌가 생각하다가 2학년 1학기니까 근데 2학년 1학기 2학년 1학기가도 알아야 되는 것 같기도 하고 알고리즘이란 뭔가 하면 알고리즘 시간을 정확히 배우지 않아요.
알고리즘에 대한 정의는 확 와닿지 않아요.
우리가 늘 수확하면 딱 정확히 딱 떨어지는 것처럼 그렇지 않긴 한데 하여간 여기서는 정확한 정의는 아니고 대략 이런 겁니다라고 하면 어떤 우리가 알고리즘에 대해서 레시피 요리법으로 설명 많이 하는데요.
이렇게 일단 문제가 있어요. 오믈렛을 만드는 문제
그리고 그거를 만드는 방법이 있겠죠.
우리도 문제가 있고 방법이 있어요. 예를 들면 소프트가 나오나요 소트가 나오나팅이라고 하면 내 데이터들을 특정 키로 순서대로 나열하기
라는 게 소팅 문제인 거고요 그 문제를 풀 수 있는 방법으로 들어보셨겠지만 셀렉션 솔트 인설션 소트 퀵 솔트 이런 방법이 있는 거죠.
그런 것처럼 이걸 먼저 얘기했어야 되는데 오믈렛을 만드는 문제가 있고 그것에 대한 방법 과정으로 일을 한다 알고리즘이란 요걸 얘기하는 거다.
그래서 문제와 방법이 있는 거고요
그래서 알고리즘은 이렇게 이렇게 이렇게 한대요 단계별 지시 사항이다.
우리가 프로그램을 만들었던 게 알고리즘이라고 보시면 되고요 물론 알고리즘을 특정 언어로 더 구현을 하는 거긴 하지만 그러면 우리가 데이터 스트업 수업 시간에는 특정 문제에 대해서 방법이 여러 가지가 있고 그것들을 분석 비교한다고 그랬는데
왜 하는 거냐라고 하면
이거는 조금
해석이 약간 애매한데 하여간 그냥 이 해석으로 하면 도시에 a에서 b로 가는 여러 가지 방법이 있을 수 있잖아요.
특정 방법 중에 하나는 비행기를 타고 갈 수도 있고 버스를 타고 갈 수도 있고 자전거를 타고 갈 수도 있고 각각의 장단점이 있겠죠.
그래서 그 장단점에 따라서 내가 어떨 때는 이걸 쓸 거고 어떤 건 어떨 때는 이 방법을 쓸 거고
그래서 컴퓨터 사이언스에서 전공자들은 각각의 방법들을 다 잘 알아야 되고 왜 얘가 얘보다 좋고 왜 얘가 얘보다 좋고 늘 항상 모든 점에서 다 좋은 건 아니니까 이런 점에서는 얘가 좋고 이런 점에서 이런 거 좋아요.
잘 골라서 쓸 수 있어야죠 그래야 전공자고 심지어 전공자는 그걸 안 까서 구현할 수도 있어야 돼요 전공자와 비전공자의 차이는
그 안을 까서 구현할 수 있느냐 구현할 수 없느냐예요.
즉 만약에 제가 비전공자라고 하면 집에 있는 먹방 굽는 로봇 이거를 사용할 줄만 아는 거고 전공자라면 그 오븐을 만들 수도 있어야 되는 거죠.
요즘에 비전공자들도 컴퓨터 프로그래밍 많이 하잖아요.
우리가 프로그래밍 하기가 되게 좋아졌어요.
편해졌어요. 툴도 좋고요 라이브러리 다 있어요.
라이브러리에 다큐먼트도 좋아서 얘한테 이런 입력을 넣으면 이런 걸 해줘라고 다 있죠 그러니까 그걸 잘 조합만 하면 프로그래밍을 할 수도 있어요.
이 정도 수준이 비전공자 수준이고요 전공자 수준이라면 그 라이브러리 또 만들 수 있어야죠 에이 방법과 비 방법 씨 방법으로 그리고 걔네들이 다 어떤 장단점이 있는지
그래서 특정 문제를 푸는 방법들이 여러 가지가 있어서 걔네들의 어떤 장단점이 있는지를 배우는 게 데이터 스트럭처 시간입니다라는 거고요 그러면 장단점을 비교할 때 어떤 방법을 쓸 거냐
아
코드가 길이가 긴 건 나쁘고 코드가 길이가 짧은 거는 좋은 거냐 로스 짠 거는 좋은 거고 팔 손으로 짠 거는 나쁜 거니 그런 게 아니라 그게 아니라가 아니라 그건 왜 아닌지 또 설명할 수는 있어야죠 근데 한 2~3학년 되면 설명 왜 그런지는 아실 수도 있을 것 같고 그런 모호한 기준이 아니라
우리는 이러한 기준으로 할 겁니다라고 해서 러닝 타임 수행 시간 위주로 할 거고요 물론 메모리 사용량으로도 할 거예요.
왜 수행 시간과 메모리 사용량으로 비교를 할 거냐면 컴퓨터에서 가장 중요한 리소스가 cpu와 메모리죠 cpu는 뭔가를 하는 장치고요 메모리를 저장하는 장치 그러니까 얘가 뭘 하는데 몇 초 걸릴 거냐 얘는 스페이스가 얼마나 많이 걸릴 거냐
그런 관점에서 보겠다라는 거예요. 그래서 그러면 얼마나 오래 걸릴까를 볼 건데 문제의 크기가 엄청나게 큰 거를 10초에 푼 거랑 되게 작은 거를 1초에 푼 거랑 1초에 풀었다고 좋은 건 아니죠.
이 크기에 비례해서 몇 초 걸리느냐가 중요한 거잖아요.
그래서
문제의 크기에 따라서 몇 초 걸리느냐를 볼 건데요.
문제 크기가 특정 그래 그러면 다 100으로 맞춰서 합시다라고 할 수도 있지만 그렇게 하지 않고 얘가 문제의 크기가 1 2 3 4 5 하 이렇게 문제 크기가 커짐에 따라 내 수행 시간이
쭉 이렇게 될 건지 이렇게 갈 건지 아니면 그냥 유지될 건지 그런 것들을 볼 거예요.
이런 걸 왜 이런 식으로 보냐면 우리가 내 프로그램을 가지고 다양한 방법으로 돌릴 거거든요.
그리고 실험실 환경에서만 돌리는 게 아니라 아주 큰 것도 돌릴 거란 말이죠.
그러니까 내가 큰 거를 작은 거에서부터 큰 거를 돌릴 때 얘의 수행 시간이 어떻게 반응할 건지가 중요한 팩터가 돼서 그러는 거예요.
그래서
특정 사이즈를 딱 맞춰놓고 모든 걸 비교하는 게 아니라 크기가 작은 거서부터 쭉 했을 때 그래프를 그리는 방식으로 비교를 할 거다 그러면 데이터 크기는 뭐냐라고 하면 데이터 크기는 데이터에 입력하는 데이터 개수를 생각하시면 되고요
물론
문제에 따라서 이 데이터의 종류가 달라져요.
예를 들면 어레이에 내가 숫자들을 넣고 소팅 하는 거라면 저 어레이 안에 내용물의 배수일 거고요 아까 지도에서 길 찾기라고 하면 우리가 입력으로 지도를 넣을 거거든요.
지도를 물론 j프팩 5도 넣을 수도 있겠지만 그렇게 안 넣고 지도는 이제 브레프라는 이거 나중에 배울 거예요.
브래프라는 형태로 넣는 거거든요. 그럴 때는 데이터의 크기가 저 그래프의 사이즈인 거고요 그래프의 사이즈를 왜 저렇게 나타내는지 그때 좀 보면 됩니다.
입력 크기인 거고 그럼 입력 크기
시간은
시간은 그러면 어떻게 할래라고 하면 이런 얘기 있어요.
시간은 컴퓨터의 진짜 실행 시간을 잴래 그래서 스타워즈 탁 치고 나서 0.75초 걸렸어요.
이렇게 할 수도 있어요. 우리는 이렇게도 해볼 거예요.
근데 이거는 기계가 에이 머신 되게 좋은 머신이랑
아주 작은 노트북이랑 그걸 같이 비교하면 곤란하잖아요.
파워가 수행 시간이 다르니까 파워가 다르니까 그래서 이건 조금 별로인 것 같고 시간 그래 그러면 단위 시간당 처리한 문장의 개수 라고 했을 때는 프로그램은 언어에 따라서 저 문장의 개수가 많이 달라지는 거거든요.
코딩 스타일에 따라서도 달라지는 거고요 그래서 이것도 아닌 것 같고
그래서
이상적인 방법이라고는 하지만 이론적인 방법인 것 같고요 이론적인 방법인 것 같고 이 실행 시간으로 하는 것도 의미는 있어요.
그래서 이거는 책에서 배울 거고요 이거는 실습을 해볼 거예요.
그래서 수행 시간을 입력하기 n에 따라서 함수로 나타낼 거야
줄로 아는 것보다 직접 해보면 알겠죠.
그렇다 함수로 낮다. 보다
19페이지까지 하면 좋겠다.
증가율 그러면 시간 분의 크기가 증가율이겠지 그런 거죠.
그래서 그런데 이 증가율은 이제 크기가 증가함에 따라서 수행 시간이 어떻게 증가하는지를 나타내는 건데 그래프처럼 그리긴 할 건데요.
거기서 이런 개념이 좀 있어요.
어떤 건 좀 무시해도 된다라는 얘기인데 만약에 제가 자동차를 사러 왔는데 자동차와 심지어 와이퍼 있잖아요.
그것도 살 거예요.
따로
근데 이제 자동차 가게에 가서 자동차랑 와이퍼랑 사러 왔어요라고 안 해도 되고 자동차 사러 왔어요라고 해도 되는 게 자동차는 한 5천만 원이고 얘는 한 3만 원이라고 하면 물론 5천
3만 원이겠죠.
대략 치면 5천만 원이잖아요. 그래서 우리가 이 수행 시간을 나타낼 때 차수가 낮은 만약에 수행 시간을 나타냈는데 올 수행 시간을 나타냈는데 여기까지 잘 함수로 나타냈더니만 수행 시간을 3회 4승 이렇게 복잡하게 나왔을 때
이런 것들이 작은 것들 이런 거는 짜잔 나니까 내가 빼버리겠다.
심적 상수도 빼고 이거 n 4승으로 나타날게 이런 얘기예요.
쟤를 왜 무시해도 되냐면 우리가 n이 겁나게 큰 것까지 볼 거거든요.
n이 되게 작을 때는 얘네들도 영향을 미쳐요 그런데 n이 큰 것 들 위주로 볼 거라서 그럴 때 되면 저게 큰 영향을 안 미치고
그리고 사실 우리가 이게 실제 정확한 시간을 재는 게 아니기 때문에 대략 어느 파형이 될 거냐를 본다.
라는 관점에서 저 최고 창만 본다라는 거예요.
물론 저 최고 창을 보는 것의 정확한 정의와 이런 거는 다음 시간에 다룰 건데요.
증가 중에 이런 것들이 있어요. 컨스턴트 로그 앤 로그 엔 제곱 이런 것들이 있는데 그래프로 대강 그려보면
입력 크기가 n이고 여기가 시간인데요.
이렇게 되는 게 이런 컨스턴트고요 로코파이은 이렇게 되죠.
로그 파형 로그에 시간이 걸리는 것도 상당히 괜찮아 하는데 왜냐면 n이 증가함에 따라서 시간이 그렇게 많이 증가되지 않거든요.
n이
이 만약에 10에 30 150승 할까요.
10에 120승이 우주에 있는 원자 개수도 얘기 안 하지
찾아보세요.
아닐 것 같은데 그게 정확히 뭐죠 차더라고요 저 정도 되는데 저 정도 돼봐야 로그로 따지면 이게 한 대략 2에 3 곱해서 450승 정도로 해서 450번 하면 되는 거예요.
로그 정도가 오히려 로그를 갖고 있으면 상당히 빨리 모든 걸 끝낼 수 있죠 얘는 이런 거고요
얘가 엄청난 거고 여기 이상은 이제
좀
우리가 사이즈가 조금만 커져도 잘 못한다 이런 개념을 가지고 계시면 되고요
조금만 더 합시다 요거 전까지 할 수 있을 것 같아요.
알고리즘이 그런데 알고리즘의 시간을 제공 시간을 생각해 보면 시간을 생각해 보면 우리가 데이터에 따라서 최선 최하 평균의 경우를 생각할 수 있는데요.
그건 뭐냐면
데이터가 어떻게 들어오느냐에 따라서 제 알고리즘이 하는 일이 조금 다르고 시간이
달라요
만약에 소팅 한 기를 생각해 볼게요
네
특정 쇼팅을 모르셔도 돼요. 근데 하여간 오름차순으로 정렬하는 거예요.
근데 제 데이터가 다행히도 1 20
네
200 300 400 이렇게 들어왔으면 소팅 할 일 할 필요가 없잖아요.
그게 금방 끝나죠 특정 입력은 제 알고리즘이 금방 끝나게도 하고요 오름 차순위인 경우에 이게 거꾸로 들어오면 막 뒤집기를 해야 되니까 좀 많이 걸릴 수도 있고요
평균의 경우는 이게 대략 잘 섞여 있는 경우라고 생각하겠죠.
대략 한 반쯤은 크기가 맞고 반쯤은 틀리고 이 정도 무작위 랜덤 그래서 우리가 경우에 따라서 어떤 시간이 걸리는지를 나눠서 생각해볼 때가 있어요.
되게 특이하게도 어떤 알고리즘은 만약에 소팅 알고리즘이요
알고리즘은 따라 다른데 우리가 나중에 배울 거예요.
이렇게 들어왔을 때가 월스트로 작동하는 알고리즘도 있어요.
제대로 들어왔는데도 그래서 우리가 입력에 따라서 알고리즘이 동작하는 방식이 좀 달라가지고 최악의 경우 평균의 경우 최선의 경우를 다르게 구별할 때도 있다라는 거고요
그래서
최악의 경우는
알고리즘 오래 걸리는 거고 최소한 빨리 끝내는 거고 평균이 무작위 랜덤의 경우이다.
라는 거고 이것도 정확히 이거는 알고리즘 시간을 정확히 배우는 건 아니네
대학원 안 시간에 배울까 뭐 그 정도인데 그렇다
마음이라면 많이 못했네요. 저희가 다음 시간에 전근적 표기방을 할 거고요 아까 처음에 얘기했듯이 승인이 전혀 잘 모르시면 모르겠습니다.
모르겠습니다. 다음 주 이번 주 목요일날
될 거고요 강의실은 그때 강의실이 너무 안 좋아가지고 새로운 강의실을 찾고 있거든요.
저도 아마 목요일 전에 수요일 밤쯤이나 밤쯤이나 제가 공지할게요
저기
이 캠퍼스 공지 사항에 공지하겠습니다.
수고하셨습니다.
고맙습니다.
'Computer Science > 자료구조' 카테고리의 다른 글
[C++] C언어 및 자바와 다른 부분 기본만 메모 (0) | 2023.03.22 |
---|---|
[CS50] 2진법 (0) | 2023.02.08 |