다들 STL 잘 사용하고 계신가요?
오늘도 라태웅(NHN NEXT, NEXON)님의 발표입니다.
STL의 기본 개념부터, 사용 노하우까지 담아보았습니다.
여러분들도 우리 스터디 참여하셔서 Live로 들으시고 발표도 하러 오세요!
관련 문의 : 댓글 or https://www.facebook.com/gpgstudygogo
다들 STL 잘 사용하고 계신가요?
오늘도 라태웅(NHN NEXT, NEXON)님의 발표입니다.
STL의 기본 개념부터, 사용 노하우까지 담아보았습니다.
여러분들도 우리 스터디 참여하셔서 Live로 들으시고 발표도 하러 오세요!
관련 문의 : 댓글 or https://www.facebook.com/gpgstudygogo
이것이 자바다 익명 객체 + Chap.11 기본 API 클래스(java) 발표용 PPT.
간단하게 정리한 것.
이것이 자바다 책을 기반으로 작성한 강의용 PPT입니다.
부족한 게 많으니 쓰실 때에는 추가하셔서 쓰세요~
참고 자료 : 이것이 자바다
사진 첨부 : http://palpit.tistory.com/
애플 스위프트 언어 개발 가이드를 기반으로 초기화 관련된 내용을 정리했습니다. 초기화가 복잡합니다. 크게 복잡하지 않을 수도 있는 내용이지만 언어마다 조금씩 다른 부분을 잘 정리했습니다.
http://cafe.naver.com/architect1 에서 스터디 진행중입니다.
기본적인 뼈대는 http://swift.leantra.kr/ 를 기반으로 합니다.
이것이 자바다 익명 객체 + Chap.11 기본 API 클래스(java) 발표용 PPT.
간단하게 정리한 것.
이것이 자바다 책을 기반으로 작성한 강의용 PPT입니다.
부족한 게 많으니 쓰실 때에는 추가하셔서 쓰세요~
참고 자료 : 이것이 자바다
사진 첨부 : http://palpit.tistory.com/
애플 스위프트 언어 개발 가이드를 기반으로 초기화 관련된 내용을 정리했습니다. 초기화가 복잡합니다. 크게 복잡하지 않을 수도 있는 내용이지만 언어마다 조금씩 다른 부분을 잘 정리했습니다.
http://cafe.naver.com/architect1 에서 스터디 진행중입니다.
기본적인 뼈대는 http://swift.leantra.kr/ 를 기반으로 합니다.
Light Tutorial Python
Studybee 2주차 스터디, 가볍게 보는 파이썬!!!
가볍게 파이썬에 대해서 공부하는 시간입니다~
**http://www.studybee.kr 에서 운영하는 '초심자를 위한 웹개발' 클래스에서 만드는 교재이며,
장고를 이용해 간단하게 블로그를 만드는 것을 목표로 하고 있습니다.
2. STL이 뭘까?
◆STL 은 Standard Template Library의 약자로,
‘많이 사용되는 자료구조와 알고리즘을 모아 놓은 라이브러리’라고 보면 된다.
◆링크드 리스트, 동적 배열, 트리, 스택, 큐 등 자료구조부터 검색, 정렬 등의 알
고리즘에 이르기까지 일반적으로 널리 이용되고 매번 구현이 비슷비슷한데
이 걸 매번 다시 만들어 쓰기 귀찮으니 모든 종류의 자료형에 대해 일반적으로
동작하도록 잘 만들어 둔 것이 바로 STL.
9. 컨테이너 Containers
◆시퀀스 컨테이너 ( Sequence Container )
-자료의 선형적인 집합. STL에서는 vector, list 등을 제공한다.
◆연관 컨테이너 ( Associative Container )
-자료를 일정한 규칙에 따라 조직화하여 관리한다. STL에서는 set,map
등을 제공한다.
◆어댑터 컨테이너 ( Adapter Container )
-시퀀스 컨테이너를 변형하여 자료를 미리 일정하게 정해진 방식에 따라
관리한다. 자료를 넣고 빼는 순서를 외부에서 마음대로 조작할 수 없다.
STL에서는 stack, queue등을 제공한다.
11. 컨테이너 Containers
vector
쉽게 말해서 임의 타입에 대한 동적 배열이라고 보면 된다. 들어간 요소
의 개수에 맞게 알아서 메모리를 재할당해준다.
vector<Type> name(n);
의 형태로 Type형의 n개 크기 동적배열(vector) name을 생성할 수
있다.
22. 반복자 Iterators
반복자의 특징
1) 컨테이너의 요소 하나를 가리키는 기본적인 역할을 한다.
2) 가리키는 지점의 요소를 읽고 쓸 수 있다.
→ 내용을 읽는 * 연산자가 정의된다.
3) 증감에 의해 주변 요소로 이동할 수 있다.
→ ++, -- 등의 연산자가 정의된다.
4) 반복자끼리 대입,비교가 가능해야 한다.
→ 대입, 비교 연산자가 정의된다.
23. 반복자 Iterators
반복자의 특징
1) 컨테이너의 요소 하나를 가리키는 기본적인 역할을 한다.
2) 가리키는 지점의 요소를 읽고 쓸 수 있다.
→ 내용을 읽는 * 연산자가 정의된다.
3) 증감에 의해 주변 요소로 이동할 수 있다.
→ ++, -- 등의 연산자가 정의된다.
4) 반복자끼리 대입,비교가 가능해야 한다.
→ 대입, 비교 연산자가 정의된다.
...어라? 포인터랑 비슷하네?
26. 반복자 Iterators
가장 간단한 vector 컨테이너를 통해 반복자의 활용 방법을 알아보자
배열 ari의 0번째 요소부터 ari의 5번째
요소 직전까지 연속한 요소들로 vi를 초기
화 하겠다는 구문
27. 반복자 Iterators
가장 간단한 vector 컨테이너를 통해 반복자의 활용 방법을 알아보자
배열 ari의 0번째 요소부터 ari의 5번째
요소 직전까지 연속한 요소들로 vi를 초기
화 하겠다는 구문
vector 컨테이너의 반복자를 선언하는 방법.
기타 컨테이너도 방식은 동일하다.
vector<Type>::iterator Name;의 형태로
선언.
28. 반복자 Iterators
가장 간단한 vector 컨테이너를 통해 반복자의 활용 방법을 알아보자
배열 ari의 0번째 요소부터 ari의 5번째
요소 직전까지 연속한 요소들로 vi를 초기
화 하겠다는 구문
vector 컨테이너의 반복자를 선언하는 방법.
기타 컨테이너도 방식은 동일하다.
vector<Type>::iterator Name;의 형태로
선언.
for문을 보면 생소한 vi.begin() , vi.end()라는 문구가 나온다. vi.begin()은 컨테이너의
가장 첫번째 요소를 가리키는 것이고, vi.end()는 컨테이너의 마지막 요소의 다음 요소를 가
리키는 것이다.
즉 vi.begin()에서 시작하여 반복자 it를 vi.end()가 될 때까지 반복문을 돌리면 컨테이너의
모든 요소를 내부 구현 방식에 상관없이 일관성 있게 순회할 수 있는 것이다.
29. 반복자 Iterators
가장 간단한 vector 컨테이너를 통해 반복자의 활용 방법을 알아보자
배열 ari의 0번째 요소부터 ari의 5번째
요소 직전까지 연속한 요소들로 vi를 초기
화 하겠다는 구문
vector 컨테이너의 반복자를 선언하는 방법.
기타 컨테이너도 방식은 동일하다.
vector<Type>::iterator Name;의 형태로
선언.
for문을 보면 생소한 vi.begin() , vi.end()라는 문구가 나온다. vi.begin()은 컨테이너의
가장 첫번째 요소를 가리키는 것이고, vi.end()는 컨테이너의 마지막 요소의 다음 요소를 가
리키는 것이다.
즉 vi.begin()에서 시작하여 반복자 it를 vi.end()가 될 때까지 반복문을 돌리면 컨테이너의
모든 요소를 내부 구현 방식에 상관없이 일관성 있게 순회할 수 있는 것이다.
결과
31. 반복자 Iterators
list
list는 이중 링크드 리스트로 구현된 컨테이너다. 흔히 알려진 것처럼 삽
입, 삭제는 굉장히 빠르지만 요소를 순회하는 것은 느린 자료구조이다.
list<Type> Name;
의 형태로 Type 형태의 list(이중 링크드 리스트) Name을
선언할 수 있다.
34. 반복자 Iterators
활용 예시
push_back()함수를 통해 list의 맨 마지막에
요소를 삽입할 수 있다. 이중 연결리스트이므로
O(1) 시간 만에 삽입 연산이 수행된다.
list<Type>::iterator를 통해 vector와 완전히 동일한 방식으
로 내부 요소를 모두 순회하고 있다. 이렇게 서로 다른 내부 구
조를 지닌 컨테이너라 할 지라도 동일하게 일반화된 방법으로
순회할 수 있다는 것이 STL의 강점이다.
35. 반복자 Iterators
활용 예시
push_back()함수를 통해 list의 맨 마지막에
요소를 삽입할 수 있다. 이중 연결리스트이므로
O(1) 시간 만에 삽입 연산이 수행된다.
list<Type>::iterator를 통해 vector와 완전히 동일한 방식으
로 내부 요소를 모두 순회하고 있다. 이렇게 서로 다른 내부 구
조를 지닌 컨테이너라 할 지라도 동일하게 일반화된 방법으로
순회할 수 있다는 것이 STL의 강점이다.
36. 반복자 Iterators
map
map은 연관이 있는 두 개의 값을 키(key)와 값(value)의 쌍으로 관리
하는 컨테이너다.
map은 저장되는 데이터가 항상 정렬이 되어 있다는 특징을 갖고 있다.
따라서 많은 크기의 데이터를 저장하고, 검색을 빨리 해야하는 경우
map을 굉장히 유용하게 사용할 수 있다.
38. 반복자 Iterators
key는 정렬과 참조를 위한 정보
value는 실제로 저장하고 싶은 자료
라고 생각하면 편하다.
그런데 이 때 map에서 key와 value가
의미하는 것이 각각 뭘까?
39. 반복자 Iterators
key는 정렬과 참조를 위한 정보
value는 실제로 저장하고 싶은 자료
라고 생각하면 편하다.
예를 들어 NHN NEXT 학생들의
정보를 저장한다고 하면,
key는 학생들의 학번
value는 각 학생과 관련된 정보
가 될 것이다.
그런데 이 때 map에서 key와 value가
의미하는 것이 각각 뭘까?
45. 반복자 Iterators
활용 예시
int 타입과 string 타입 두 개를 묶은 한
쌍을 나타내는 pair인 student의 선언
pair자료형에서 first와 second는 각각
pair의 첫 번째 요소와 두 번째 요소를 가
리킨다.
46. 반복자 Iterators
활용 예시
int 타입과 string 타입 두 개를 묶은 한
쌍을 나타내는 pair인 student의 선언
pair자료형에서 first와 second는 각각
pair의 첫 번째 요소와 두 번째 요소를 가
리킨다.
실행 결과는 간단하므로 생략
47. 반복자 Iterators
◆map은 pair를 이용해 한 쌍으로 묶은 정보( < key, value >의 형태 )
를 이용해 데이터를 저장한다.
◆map은 내부적으로 균형잡힌 이진 트리(balanced binary tree)로
구현되어 있다(정확히는 레드-블랙 트리 Red-Black tree).
이 때 key는 이진 트리를 정렬하고 이진 트리의 각 요소에 접근하기
위한 값으로 쓰이며, value는 실제로 저장된 값으로 쓰인다.
따라서 당연히 map에서 key는 절대 중복되어서는 안 된다.
◆균형잡힌 이진 트리는 검색 속도가 O(log n)임이 보장되기 때문에
map이 굉장히 빠른 검색 속도를 가지는 것이다.
Map은 이런 것이다!
50. 반복자 Iterators
활용 예시
각 도시의 이름을 key로, 인구수를
value로 하는 map m을 선언했다.
insert 함수를 통해 한 쌍의 데이터
(pair)를 map에 저장할 수 있다.
map은 내부적으로 자료를 정렬하여
관리하므로 이 자료가 어느 위치에 저
장될지는 알 수 없다.
51. 반복자 Iterators
활용 예시
각 도시의 이름을 key로, 인구수를
value로 하는 map m을 선언했다.
insert 함수를 통해 한 쌍의 데이터
(pair)를 map에 저장할 수 있다.
map은 내부적으로 자료를 정렬하여
관리하므로 이 자료가 어느 위치에 저
장될지는 알 수 없다.
왼쪽과 같이 익숙한 배열의 형태로도 데이터를 삽
입할 수 있다. map[key] = value; 의 형태로 쓰
면 map에 key,value 쌍의 데이터가 삽입되고,
map[key]라고 쓰면 해당 map에서 key에 해당
하는(key와 한 쌍인) value 값을 얻을 수 있다.
52. 반복자 Iterators
활용 예시
각 도시의 이름을 key로, 인구수를
value로 하는 map m을 선언했다.
insert 함수를 통해 한 쌍의 데이터
(pair)를 map에 저장할 수 있다.
map은 내부적으로 자료를 정렬하여
관리하므로 이 자료가 어느 위치에 저
장될지는 알 수 없다.
왼쪽과 같이 익숙한 배열의 형태로도 데이터를 삽
입할 수 있다. map[key] = value; 의 형태로 쓰
면 map에 key,value 쌍의 데이터가 삽입되고,
map[key]라고 쓰면 해당 map에서 key에 해당
하는(key와 한 쌍인) value 값을 얻을 수 있다.
지울 때는 erase 함수를 쓰며, 반복자 또는 특정 key
값을 통해 해당 key에 해당하는 value 한 쌍을 삭제
할 수 있다. value 값으로는 삭제할 수 없다. map의
삽입, 삭제 및 참조의 모든 기준은 key이다.
53. 반복자 Iterators
활용 예시
각 도시의 이름을 key로, 인구수를
value로 하는 map m을 선언했다.
insert 함수를 통해 한 쌍의 데이터
(pair)를 map에 저장할 수 있다.
map은 내부적으로 자료를 정렬하여
관리하므로 이 자료가 어느 위치에 저
장될지는 알 수 없다.
왼쪽과 같이 익숙한 배열의 형태로도 데이터를 삽
입할 수 있다. map[key] = value; 의 형태로 쓰
면 map에 key,value 쌍의 데이터가 삽입되고,
map[key]라고 쓰면 해당 map에서 key에 해당
하는(key와 한 쌍인) value 값을 얻을 수 있다.
지울 때는 erase 함수를 쓰며, 반복자 또는 특정 key
값을 통해 해당 key에 해당하는 value 한 쌍을 삭제
할 수 있다. value 값으로는 삭제할 수 없다. map의
삽입, 삭제 및 참조의 모든 기준은 key이다.
다른 컨테이너와 거의
완전히 똑같은 방식으
로 반복자를 이용해 컨
테이너 내부의 모든 요
소를 순회할 수 있다.
54. 반복자 Iterators
활용 예시
각 도시의 이름을 key로, 인구수를
value로 하는 map m을 선언했다.
insert 함수를 통해 한 쌍의 데이터
(pair)를 map에 저장할 수 있다.
map은 내부적으로 자료를 정렬하여
관리하므로 이 자료가 어느 위치에 저
장될지는 알 수 없다.
왼쪽과 같이 익숙한 배열의 형태로도 데이터를 삽
입할 수 있다. map[key] = value; 의 형태로 쓰
면 map에 key,value 쌍의 데이터가 삽입되고,
map[key]라고 쓰면 해당 map에서 key에 해당
하는(key와 한 쌍인) value 값을 얻을 수 있다.
지울 때는 erase 함수를 쓰며, 반복자 또는 특정 key
값을 통해 해당 key에 해당하는 value 한 쌍을 삭제
할 수 있다. value 값으로는 삭제할 수 없다. map의
삽입, 삭제 및 참조의 모든 기준은 key이다.
다른 컨테이너와 거의
완전히 똑같은 방식으
로 반복자를 이용해 컨
테이너 내부의 모든 요
소를 순회할 수 있다.
왜 이런 결과가 나올까?
55. 반복자 Iterators
활용 예시
각 도시의 이름을 key로, 인구수를
value로 하는 map m을 선언했다.
insert 함수를 통해 한 쌍의 데이터
(pair)를 map에 저장할 수 있다.
map은 내부적으로 자료를 정렬하여
관리하므로 이 자료가 어느 위치에 저
장될지는 알 수 없다.
왼쪽과 같이 익숙한 배열의 형태로도 데이터를 삽
입할 수 있다. map[key] = value; 의 형태로 쓰
면 map에 key,value 쌍의 데이터가 삽입되고,
map[key]라고 쓰면 해당 map에서 key에 해당
하는(key와 한 쌍인) value 값을 얻을 수 있다.
지울 때는 erase 함수를 쓰며, 반복자 또는 특정 key
값을 통해 해당 key에 해당하는 value 한 쌍을 삭제
할 수 있다. value 값으로는 삭제할 수 없다. map의
삽입, 삭제 및 참조의 모든 기준은 key이다.
다른 컨테이너와 거의
완전히 똑같은 방식으
로 반복자를 이용해 컨
테이너 내부의 모든 요
소를 순회할 수 있다.
왜 이런 결과가 나올까?
내부 자료들을 정렬해서 저장한다는
map의 특성을 염두에 두고 코드를 분
석해보자