문병로 교수님 강의자료를 많이 인용하였습니다. DATA STRUCTURE Samsung Convergence Software Course 방학 특강 2014. 6. 23 (월) 들어가기 전에 • 단대가 다들 어떻게 되시나요? • • 프로그래밍, 얼마나 아시나요? • • • 인문대/사회대/경영대/자연대/공대 프로그래밍 해본 적 있다/없다 어떤 언어? 객체 지향 프로그래밍 / 자료 구조에 대해 아시나요? • • 객체 지향 프로그래밍에 대해 안다/모른다 Linked List, Stack, Queue, Tree에 대해 안다/모른다 저는… • 서울대학교 컴퓨터공학부 • 지능형 데이터 시스템 연구실 석박통합과정 • • Interested in… • • • 데이터 마이닝, 추천, 텍스트 데이터 분석, 빅데이터 병렬 처리, 등등 사용자들이 남겨놓은 다양한 데이터들(SNS/리뷰 등 텍스트 기록, 상품구매 기록, 웹 서핑 기록, TV 시청 기록, 장소 체크인 기록, 등) 이를 활용하여 사용자의 Preference를 예측하여 사용자들에게 다양한 Contents / Item / Service들을 추천하는 연구 이한빛, skcheon@europa.snu.ac.kr 저는… • 서울대학교 컴퓨터공학부 • 지능형 데이터 시스템 연구실 석박통합과정 • • Interested in… • • • 데이터 마이닝, 추천, 텍스트 데이터 분석, 빅데이터 병렬 처리, 등등 사용자들이 남겨놓은 다양한 데이터들(SNS/리뷰 등 텍스트 기록, 상품구매 기록, 웹 서핑 기록, TV 시청 기록, 장소 체크인 기록, 등) 이를 활용하여 사용자의 Preference를 예측하여 사용자들에게 다양한 Contents / Item / Service들을 추천하는 연구 이한빛, skcheon@europa.snu.ac.kr 데이터, Data • 46 int curr_ep_num = 46; • 18.4 double ratings = 18.4; • “정도전” String title = “정도전”; • true/false boolean live_yn = true; • “조재현”, “유동근”, “박영규” String[ ] cast = {“조재현”, “유동근”, “박영규”}; 조금 더 높은 추상 단계의 데이터? 예를 들어, TV_Program? 데이터, Data • TV_program? • • TV_program이 공통적으로 가지는 정보? 속성? • • 정도전, 너포위, 마녀사냥, 아빠어디가, … 프로그램이름, 방영시간, 장르, 출연진, 시청률, … 이 정보/속성들을 이용해 할 수 있는 기능? • 방영시간 변경, 출연진 리스트 가져오기, … 데이터 구조, Data Structure • 앞에서 말한 개념적인 데이터를 담는 구체적인 구현. • Object-Oriented Programming (객체 지향 프로그래밍) • Abstraction (추상화) Java의 경우에는… Class TV_program { String pg_title; int pg_duration; String genre; double rating; field method public String getPg_title() { return this.pg_title; } public void setPg_title(String new_title) { this.pg_title = new_title; } … } 객체 지향 프로그래밍, Object-oriented Programming TV Program 정도전 왕좌의 게임 마녀사냥 슈퍼맨이 돌아왔다 객체 지향 프로그래밍, Object-oriented Programming Class TV_program { String pg_title; int pg_duration; String genre; double rating; 개념(Concept) public String getPg_title() { return this.pg_title; } public void setPg_title(String new_title) { this.pg_title = new_title; } … } TV_program 정도전= new TV_program ( ); 객체(Object) 객체 지향 프로그래밍, Object-oriented Programming Class TV_program { String pg_title; int pg_duration; String genre; double rating; 개념(Concept) public String getPg_title() { return this.pg_title; } public void setPg_title(String new_title) { this.pg_title = new_title; } … } TV_program 왕좌의게임= new TV_program ( ) 객체(Object) 객체 지향 프로그래밍, Object-oriented Programming Class TV_program { String pg_title; int pg_duration; String genre; double rating; 개념(Concept) public String getPg_title() { return this.pg_title; } public void setPg_title(String new_title) { this.pg_title = new_title; } … } TV_program 마녀사냥= new TV_program ( ) 객체(Object) 객체만 만들면… TV_program 정도전 = new TV_program( ); 정도전.setPg_name(“대하드라마,정도전”); 정도전.setPg_duration(1); 정도전.setGenre(“drama”); 정도전.setRating(18.4); TV_program 정도전 = new TV_program(“정도전”, 1, “drama”, 18.4); 다시, 클래스 • 필드, field • 생성자, constructor • 메쏘드, method • • Getter/Setter : 모든 필드 변수들에 대해 보통 구현됨 이외의 method들 Getter/setter Class TV_program { String pg_title; int pg_duration; String genre; double rating; public String getPg_title() { field TV_program( ) { this.pg_title = null; this.pg_duration = 1; this.genre = null; this.rating = 0.0; } return this.pg_title; } public void setPg_title(String new_title) { this.pg_title = new_title; constructor } … (also for pg_duration, genre, rating) public double ratingToPercent( ) { return (this.rating * 100); TV_program( String title, int dur, String genre, double rating) { this.pg_title = title; this.pg_duration = dur; this.genre = genre; this.rating = rating; } } } Other method 사용자 정의 데이터 타입 Class TV_program { String pg_title; int pg_duration; String genre; double rating; public String getPg_title() { return this.pg_title; } public void setPg_title(String new_title) { this.pg_title = new_title; } … } Class EPG_schedule { int year; int month; int day; String dayofweek; TV_program[ ] program_list; … } Java의 OOP적 기능들 • 상속, inheritance • • 오버로딩, overloading • • 부모클래스와 자식클래스. 자식클래스는 부모클래스의 것들을 상속받아 재정의하 지않고 사용하면서 자신만의 새로운 것들을 정의하여 사용 가능. 하나의 이름으로 된 함수들을 여러 타입의 파라미터들에 대해 사용 가능. 인터페이스, interface • 구현하는 함수들의 이름, 입력, 출력 형태만 적어놓고 이 인터페이스를 구현하는 클 래스를 따로 두어 실제 구현을 함으로써 안의 구현을 몰라도 사용가능하도록 캡슐화. • 등등 • 자세한 설명은 생략한다. 대표적인 데이터 구조 • Linked List, Stack, Tree, … • 데이터를 어떤 형태의 구조로 담을 것인가? 클래스로 정의하는 법만 잘 알면 된다. • 클래스의 필드, 메쏘드만 잘 정의할 수 있으면, Java에서 어떤 데이터 구조든 자 기 입맛에 맞는 데이터 구조를 정의하여 사용이 가능하다. • 나중에 알게 될 진실. 연결 리스트, Linked List Figure 5.1 a) A linked list of integers; b) insertion; c) deletion Linked List • Each node contains • • Data (item) Link number, string, object, … A naïve structure public class IntegerNode { public int item; public IntegerNode next; } Example: IntegerNode n1 = new IntegerNode( ); IntegerNode n2 = new IntegerNode( ); n1.item = 5; n2.item = 9; n1.next = n2; Not good information hiding Not good data abstraction An Intermediate Version Example: public class IntegerNode { IntegerNode n1 = new IntegerNode( ); private int item; IntegerNode n2 = new IntegerNode( ); private IntegerNode next; public void setItem(int newItem) { n1.setItem(5); item = newItem; n2.setItem(9); } n1.setNext(n2); public int getItem( ) { return item; } public void setNext(IntegerNode nextNode) { next = nextNode; } public IntegerNode getNext( ) { return next; } } An Improved Version public class IntegerNode { private int item; private IntegerNode next; Example: // constructors IntegerNode n2 = new IntegerNode(9); public IntegerNode(int newItem) { item = newItem; IntegerNode n1 = new IntegerNode(5, n2); next = null; } public IntegerNode(int newItem, IntegerNode nextNode) { item = newItem; next = nextNode; } // setItem, getItem, setNext, getNext as before … } Example: IntegerNode n1 = new IntegerNode(5, new IntegerNode(9)); Head Node • Linked lists usually have a head reference Node head = null; Node head = new Node(new Integer(5)); Here, head is a simple reference variable Displaying the Contents • Sequential display of the contents of the linked list referenced by head for (Node curr = head; curr != null; curr = curr.getNext( )) { System.out.println(curr.getItem( )); } Deleting a Specified Node • Removing the node referenced by variable curr • The previous node of curr is referenced by prev prev.setNext(curr.getNext( )); Removing the 1st node head = curr.getNext( ); In C, prev->next = curr->next; Inserting a Node • Inserting a node between prev and curr newNode = new Node(new Integer(30)); newNode.setNext(curr); prev.setNext(newNode); In C, newNode = malloc(sizeof Node); newNode->item = 30; newNode->next = curr; prev.next = newNode; 스택, Stack Stack • 도입을 위한 예 “←” in keyboard input line • E.g., abcd←←efgh←←←ij←km← abeik • • 한 character를 읽어 ‘←’ 이 아니면 저장하고 ‘←’ 이면 최근에 저장된 character를 제거한다. A Stack Example 최근에 쌓은 접시를 꺼낸다 Stack of cafeteria dishes Example: Checking Balance of Braces Stack Implementation public interface StackInterface { public boolean isEmpty( ); public void push(Object newItem); public Object pop( ); public void popAll ( ); public Object peek( ); } Array-Based Implementation Items[ ] top –1 0 1 2 3 4 … MAX_STACK–1 public class StackArrayBased implements StackInterface { final int MAX_STACK = 50; private Object items[ ]; private int top; // index for stack top public StackArrayBased( ) { items = new Object[MAX_STACK]; top = –1; } public boolean isEmpty( ) { return (top < 0); } public boolean isFull ( ) { return (top == MAX_STACK–1); } public void push(Object newItem) { if (!isFull( )) items[++top] = newItem; else {exception 처리} } public Object pop( ) { if (!isEmpty( )) return items[top--]; else {exception 처리} } public void popAll( ) { items = new Object[MAX_STACK]; top = –1; } public Object peek( ) { if (!isEmpty( )) return items[top]; else {exception 처리} } } // end class StackArrayBased Reference-Based Implementation public class StackReferenceBased implements StackInterface{ private Node top; public StackReferenceBased( ) { top = null; } 5 public boolean isEmpty( ) { return (top == null); } public void push(Object newItem) { top = new Node(newItem, top); } public Object pop( ) { if (!isEmpty( )) { Node temp = top; top = top.getNext( ); return temp.getItem( ); } else {exception 처리} } public void popAll ( ) { top = null; } public Object peek( ) { if (!isEmpty( )) return top.getItem( ); else {exception 처리} } } // end class StackReferenceBased 트리, Tree An organization chart A family tree Reference-Based Implementation of Binary Tree public class TreeNode { private Object item; private TreeNode leftChild; private TreeNode rightChild; public TreeNode(Object newItem) { item = newItem; newItem leftChild = rightChild = null; } public TreeNode(Object newItem, TreeNode left, TreeNode right) { item = newItem; leftChild = left; rightChild = right; } newItem left right public Object getItem( ) { return item; } public void setItem(Object newItem) { item = newItem; } public TreeNode getLeft( ) { return leftChild; } public TreeNode getRight( ) { return rightChild; } public setLeft(TreeNode left) { leftChild = left; } public setRight(TreeNode right) { rightChild = right; } } // end TreeNode • left Search in a Binary Search Tree search(root, searchKey) { if (root is empty) return “Not found!”; else if (searchKey == root’s key) return root; else if (searchKey < root’s key) return search(root’s left child, searchKey); else return search(root’s right child, searchKey); } Insertion in a Binary Search Tree insert (root, newItem) { if (root is null) { newItem을 key로 가진 새 node를 매단다; } else if (newItem < root’s key) insert(root’s left child, newItem); else insert(root’s right child, newItem); } 사실 이 모든 것은 Java에 모두 아주 잘 구현이 되어 있습니다. • 컴퓨터 공학에서 자료구조를 배우는 이유 : Object-Oriented Programming을 배 우기에 가장 좋은 주제. • 사실 이론이 아닌 실제 구현을 해보는 것이 목적. • Java 구현에 대해 조금이나마 아셨기를 바라며!