명품 JAVA Essential.

Slides:



Advertisements
Similar presentations
멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
Advertisements

5 장 조건과 반복 ②. Contents Counting and Looping [while 문 사용 ] Powers of 2 [while 문 사용 ] More Guessing [do 문 사용 ] Election Day [do 문 사용 ] Finding Maximum &
명품 JAVA Programming 제 3 장 반복문, 배열, 예외처리.
어서와 Java는 처음이지! 제3장선택과 반복.
일반적인 하나의 코드로 다양한 자료형을 처리하는 기법을 살펴봅시다.
제 7주 2015년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
IntArray[0] int length 5 intArray 객체 제 3 장 반복문, 배열, 예외처리.
객체지향 프로그래밍.
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
7장 배열 ②.
어서와 Java는 처음이지! 제4장 배열.
제 4장 문 장 배정문 혼합문 제어문 표준 입출력.
4부 클래스 라이브러리 “4부에서는 자바 언어의 API인 클래스 라이브러리에 관해 설명합니다
어서와 Java는 처음이지! 제15장 제네릭과 컬렉션. 어서와 Java는 처음이지! 제15장 제네릭과 컬렉션.
명품 C++ 13장 예외 처리와 C 언어와의 링크 지정.
자바란 무엇인가? JDK의 다운로드 및 설치 방법 Hello, Java 프로그램의 작성 자바 프로그램의 작동 원리
윤 홍 란 제3장 클래스와 객체의 사용-1 윤 홍 란
Chapter 02 자바 기본구조 자바 프로그래밍의 기초적인 문법을 소개
[INA470] Java Programming Youn-Hee Han
명품 JAVA Programming 제 7 장 제네릭과 컬렉션.
명품 JAVA Essential.
명품 JAVA Programming.
명품 JAVA Essential.
명품 JAVA Programming 제 4 장 클래스와 객체.
Power Java 제4장 자바 프로그래밍 기초.
JAVA 프로그래밍 6장 객체지향프로그래밍의 핵심.
Power Java 제10장 배열.
10장 템플릿과 표준 템플릿 라이브러리(STL)
Choi, Namseok Java 기초 (Java의 제어문과 배열) Choi, Namseok
명품 JAVA Essential.
명품 Java Programming.
최용술 장 Thread 최용술
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
Power Java 제7장 클래스와 객체.
5장 조건과 반복 ①.
주소록 프로그램.
7장 배열 ①.
명품 JAVA Programming.
6장 객체-지향 설계 ①.
제 4주 2014년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
5장 조건과 반복 ②.
제2장 데이터 및 수식.
6장 객체-지향 설계 ①.
어서와 Java는 처음이지! 제4장 배열 IT응용시스템공학과 김형진 교수.
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
WAP Java Seminar
15장. 컬렉션 프레임워크.
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
SpringFramework 중간고사 요약 REST by SpringFramework.
[INA470] Java Programming Youn-Hee Han
컴퓨터공학실습(I) 3주 인공지능연구실.
제 4장. 객체 지향 프로그래밍 시작하기 학기 프로그래밍언어및실습 (C++).
Java IT응용시스템공학과 김형진 교수 5장. 객체지향 개념 public class SumTest {
Chap02 객체 지향 개념 2.1 객체지향(object-oriented)과 절차지향(procedural-oriented)
JA A V W. 04.
자바 5.0 프로그래밍.
5장 조건과 반복 ①.
자바 5.0 프로그래밍.
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
C# 10장. 참조형.
6장 클래스(상속).
10장 템플릿과 표준 템플릿 라이브러리(STL)
Java 5장. 객체지향 개념 public class SumTest {
12장. 자료구조로 사용되는 클래스 자료구조란? 자료구조 클래스의 사용방법.
1. 객체-지향 프로그래밍.
Presentation transcript:

명품 JAVA Essential

학습 목표 컬렉션과 제네릭 개념 Vector<E> 활용 ArrayList<E> 활용 HashMap<K,V> 활용 Iterator<E> 활용 사용자 제네릭 클래스 만들기

컬렉션(collection)의 개념 컬렉션 요소(element)라고 불리는 가변 개수의 객체들의 저장소 객체들의 컨테이너라고도 불림 요소의 개수에 따라 크기 자동 조절 요소의 삽입, 삭제에 따른 요소의 위치 자동 이동 고정 크기의 배열을 다루는 어려움 해소 다양한 객체들의 삽입, 삭제, 검색 등의 관리 용이

컬렉션 자바 인터페이스와 클래스 인터페이스 클래스 Collection<E> Map<K, V> Set<E> List<E> Queue<E> 인터페이스 클래스 HashSet<E> ArrayList<E> Vector<E> LinkedList<E> HashMap<K, V> Stack<E>

컬렉션의 특징 1. 컬렉션은 제네릭(generics) 기법으로 구현 2. 컬렉션의 요소는 객체만 가능 제네릭 특정 타입만 다루지 않고, 여러 종류의 타입으로 변신할 수 있도록 클래스나 메소드를 일반화시키는 기법 클래스나 인터페이스 이름에 <E>, <K>, <V> 등 타입매개변수 포함 제네릭 컬렉션 사례 : 벡터 Vector<E> <E>에서 E에 구체적인 타입을 주어 구체적인 타입만 다루는 벡터로 활용 정수만 다루는 컬렉션 벡터 Vector<Integer> 문자열만 다루는 컬렉션 벡터 Vector<String> 2. 컬렉션의 요소는 객체만 가능 int, char, double 등의 기본 타입으로 구체화 불가 컬렉션 사례 Vector<int> v = new Vector<int>(); // 컴파일 오류. int는 사용 불가 Vector<Integer> v = new Vector<Integer>(); // 정상 코드

제네릭은 형판과 같은 개념 제네릭 클래스나 메소드를 형판에서 찍어내듯이 생산할 수 있도록 일반화된 형판을 만드는 기법

Stack<Integer> 제네릭의 기본 개념 제네릭 JDK 1.5부터 도입(2004년 기점) 모든 종류의 데이터 타입을 다룰 수 있도록 일반화된 타입 매개 변수로 클래스(인터페이스)나 메소드를 작성하는 기법 C++의 템플릿(template)과 동일 정수만 저장 정수 스택 ... void push(Integer element) { ... } Integer pop() { ... } 20 -345 class Stack<E> { ... void push(E element) { ... } E pop() { ... } } 123 Stack<Integer> 10 ... void push(String element) { ... } String pop() { ... } Stack<String> “Good” “C#” 제네릭 스택 특정 타입으로 구체화 “C++” “Java” 문자열 스택 문자열만 저장

제네릭 Stack<E> 클래스

Vector<E> 벡터 Vector<E>의 특성 <E>에 사용할 요소의 특정 타입으로 구체화 배열을 가변 크기로 다룰 수 있게 하는 컨테이너 배열의 길이 제한 극복 요소의 개수가 넘치면 자동으로 길이 조절 요소 객체들을 삽입, 삭제, 검색하는 컨테이너 삽입, 삭제에 따라 자동으로 요소의 위치 조정 Vector에 삽입 가능한 것 객체, null 기본 타입의 값은 Wrapper 객체로 만들어 저장 Vector에 객체 삽입 벡터의 맨 뒤, 중간에 객체 삽입 가능 Vector에서 객체 삭제 임의의 위치에 있는 객체 삭제 가능

Vector<Integer> 벡터 컬렉션 내부 Vector<Integer> v = new Vector<Integer>(); add()를 이용하여 요소를 삽입하고 get()을 이용하여 요소를 검색합니다

타입 매개 변수 사용하지 않는 경우 경고 발생 Vector로만 사용하면 경고 발생 Vector<Integer>나 Vector<String> 등 타입 매개 변수를 사용하여야 함

Vector<E> 클래스의 주요 메소드

Vector<Integer> 컬렉션 활용 사례

Vector<Integer> 컬렉션 활용 사례(계속)

컬렉션과 자동 박싱/언박싱 JDK 1.5 이전 JDK 1.5부터 기본 타입 데이터를 Wrapper 객체로 만들어 삽입 자동 박싱/언박싱이 작동하여 기본 타입 값 삽입 가능 그러나, 타입 매개 변수를 기본 타입으로 구체화할 수는 없음 Vector<Integer> v = new Vector<Integer>(); v.add(new Integer(4)); Integer n = (Integer)v.get(0); int k = n.intValue(); // k = 4 Vector<Integer> v = new Vector<Integer> (); v.add(4); // 4 → new Integer(4)로 자동 박싱 int k = v.get(0); // Integer 타입이 int 타입으로 자동 언박싱, k = 4 Vector<int> v = new Vector<int> (); // 컴파일 오류

예제 7-1 : 정수만 다루는 Vector<Integer> 컬렉션 활용 다음 코드에 대한 결과는 무엇인가? import java.util.Vector; public class VectorEx { public static void main(String[] args) { // 정수 값만 다루는 제네릭 벡터 생성 Vector<Integer> v = new Vector<Integer>(); v.add(5); // 5 삽입 v.add(4); // 4 삽입 v.add(-1); // -1 삽입 // 벡터 중간에 삽입하기 v.add(2, 100); // 4와 -1 사이에 정수 100 삽입 System.out.println("벡터 내의 요소 객체 수 : " + v.size()); System.out.println("벡터의 현재 용량 : " + v.capacity()); // 모든 요소 정수 출력하기 for(int i=0; i<v.size(); i++) { int n = v.get(i); // 벡터의 i 번째 정수 System.out.println(n); } // 벡터 속의 모든 정수 더하기 int sum = 0; for(int i=0; i<v.size(); i++) { int n = v.elementAt(i); // 벡터의 i 번째 정수 sum += n; } System.out.println("벡터에 있는 정수 합 : " + sum); 벡터 내의 요소 객체 수 : 4 벡터의 현재 용량 : 10 5 4 100 -1 벡터에 있는 정수 합 : 108

예제 7-2 : Point 클래스의 객체들만 저장하는 벡터 만들기 점 (x, y)를 표현하는 Point 클래스의 객체만 다루는 벡터의 활용을 보여라. import java.util.Vector; class Point { private int x, y; public Point(int x, int y) { this.x = x; this.y = y; } public String toString() { return "(" + x + "," + y + ")"; public class PointVectorEx { public static void main(String[] args) { Vector<Point> v = new Vector<Point>(); // 3 개의 Point 객체 삽입 v.add(new Point(2, 3)); v.add(new Point(-5, 20)); v.add(new Point(30, -8)); v.remove(1); // 인덱스 1의 Point(-5, 20) 객체 삭제 // 벡터에 있는 Point 객체 모두 검색하여 출력 for(int i=0; i<v.size(); i++) { Point p = v.get(i); // 벡터의 i 번째 Point 객체 얻어내기 System.out.println(p); // p.toString()을 이용하여 객체 p 출력 } (2,3) (30,-8)

ArrayList<E> 가변 크기 배열을 구현한 클래스 벡터와 거의 동일 요소 삽입, 삭제, 검색 등 벡터 기능과 거의 동일 벡터와 달리 스레드 동기화 기능 없음 다수 스레드가 동시에 ArrayList에 접근할 때 동기화되지 않음. 개발자가 스레드 동기화 코드 작 성 ArrayList<String> = new ArrayList<String>();

ArrayList<E> 클래스의 주요 메소드

ArrayList<String> 컬렉션 활용 사례

ArrayList<String> 컬렉션 활용 사례(계속)

예제 7-3 : 문자열만 다루는 ArrayList<String> 활용 이름을 4개 입력받아 ArrayList에 저장하고, ArrayList에 저장된 이름을 모두 출력한 후, 제일 긴 이름을 출력하라. import java.util.*; public class ArrayListEx { public static void main(String[] args) { // 문자열만 삽입가능한 ArrayList 컬렉션 생성 ArrayList<String> a = new ArrayList<String>(); // 키보드로부터 4개의 이름 입력받아 ArrayList에 삽입 Scanner scanner = new Scanner(System.in); for(int i=0; i<4; i++) { System.out.print("이름을 입력하세요>>"); String s = scanner.next(); // 키보드로부터 이름 입력 a.add(s); // ArrayList 컬렉션에 삽입 } // ArrayList에 들어 있는 모든 이름 출력 for(int i=0; i<a.size(); i++) { // ArrayList의 i 번째 문자열 얻어오기 String name = a.get(i); System.out.print(name + " "); // 가장 긴 이름 출력 int longestIndex = 0; for(int i=1; i<a.size(); i++) { if(a.get(longestIndex).length() < a.get(i).length()) longestIndex = i; } System.out.println("\n가장 긴 이름은 : " + a.get(longestIndex)); 이름을 입력하세요>>Mike 이름을 입력하세요>>Jane 이름을 입력하세요>>Ashley 이름을 입력하세요>>Helen Mike Jane Ashley Helen 가장 긴 이름은 : Ashley

컬렉션의 순차 검색을 위한 Iterator Iterator<E> 인터페이스 Iterator 객체 얻어내기 리스트 구조의 컬렉션에서 요소의 순차 검색을 위한 인터페이스 Vector<E>, ArrayList<E>, LinkedList<E>가 상속받는 인터페이스 Iterator 객체 얻어내기 컬렉션의 iterator() 메소드 호출 해당 컬렉션을 순차 검색할 수 있는 Iterator 객체 리턴 컬렉션 검색 코드 Vector<Integer> v = new Vector<Integer>(); Iterator<Integer> it = v.iterator(); while(it.hasNext()) { // 모든 요소 방문 int n = it.next(); // 다음 요소 리턴 ... } Vector<Integer>객체와 Iterator 객체의 관계

예제 7-4 : Iterator<Integer>를 이용하여 정수 벡터 검색 import java.util.*; public class IteratorEx { public static void main(String[] args) { // 정수 값만 다루는 제네릭 벡터 생성 Vector<Integer> v = new Vector<Integer>(); v.add(5); // 5 삽입 v.add(4); // 4 삽입 v.add(-1); // -1 삽입 v.add(2, 100); // 4와 -1 사이에 정수 100 삽입 // Iterator를 이용한 모든 정수 출력하기 Iterator<Integer> it = v.iterator(); // Iterator 객체 얻기 while(it.hasNext()) { int n = it.next(); System.out.println(n); } // Iterator를 이용하여 모든 정수 더하기 int sum = 0; it = v.iterator(); // Iterator 객체 얻기 while(it.hasNext()) { int n = it.next(); sum += n; } System.out.println("벡터에 있는 정수 합 : " + sum); 5 4 100 -1 벡터에 있는 정수 합 : 108

HashMap<K,V> 키(key)와 값(value)의 쌍으로 구성되는 요소를 다루는 컬렉션 키와 값이 한 쌍으로 삽입 ‘값’을 검색하기 위해서는 반드시 ‘키’ 이용 삽입 및 검색이 빠른 특징 요소 삽입 : put() 메소드 요소 검색 : get() 메소드 예) HashMap<String, String> 생성, 요소 삽입, 요소 검색 HashMap<String, String> h = new HashMap<String, String>(); // 해시맵 객체 생성 h.put("apple", "사과"); // "apple" 키와 "사과" 값의 쌍을 해시맵에 삽입 String kor = h.get("apple"); // "apple" 키로 값 검색. kor는 "사과“

HashMap<String, String>의 내부 구성 HashMap<String, String> map = new HashMap<String, String>();

HashMap<K,V>의 주요 메소드

HashMap<String, String> 컬렉션 활용 사례

예제 7-5 : HashMap<String, String>로 (영어, 한글) 단어 쌍을 저장하고 검색하기 import java.util.*; public class HashMapDicEx { public static void main(String[] args) { // 영어 단어와 한글 단어의 쌍을 저장하는 HashMap 컬렉션 생성 HashMap<String, String> dic = new HashMap<String, String>(); // 3 개의 (key, value) 쌍을 dic에 저장 dic.put("baby", "아기"); // "baby"는 key, "아기"은 value dic.put("love", "사랑"); dic.put("apple", "사과"); // dic 해시맵에 들어 있는 모든 (key, value) 쌍 출력 Set<String> keys = dic.keySet(); // 모든 키를 Set 컬렉션에 받아옴 Iterator<String> it = keys.iterator(); // Set에 접근하는 Iterator 리턴 while(it.hasNext()) { String key = it.next(); // 키 String value = dic.get(key); // 값 System.out.print("(" + key + "," + value + ")"); } System.out.println(); // 영어 단어를 입력받고 한글 단어 검색 Scanner scanner = new Scanner(System.in); for(int i=0; i<3; i++) { System.out.print("찾고 싶은 단어는?"); String eng = scanner.next(); // 해시맵에서 '키' eng의 '값' kor 검색 String kor = dic.get(eng); if(kor == null) System.out.println(eng + "는 없는 단어 입니다."); else System.out.println(kor); } (love,사랑)(apple,사과)(baby,아기) 찾고 싶은 단어는?apple 사과 찾고 싶은 단어는?babo babo는 없는 단어 입니다. 찾고 싶은 단어는?love 사랑

제네릭 만들기 제네릭 클래스 작성 클래스 이름 옆에 일반화된 타입 매개 변수 추가 제네릭 객체 생성 및 활용 제네릭 타입에 구체적인 타입을 지정하여 객체를 생성하는 것을 구체화라고 함 public class MyClass<T> { T val; void set(T a) { val = a; } T get() { return val; 제네릭 클래스 MyClass 선언, 타입 매개 변수 T val의 타입은 T T 타입의 값 a를 val에 지정 T 타입의 값 val 리턴 MyClass<String> s = new MyClass<String>(); // T를 String으로 구체화 s.set("hello"); System.out.println(s.get()); // "hello" 출력 MyClass<Integer> n = new MyClass<Integer>(); // T를 Integer로 구체화 n.set(5); System.out.println(n.get()); // 숫자 5 출력

예제 7-6 : 제네릭 스택 만들기 스택을 제네릭 클래스로 작성하고, String과 Integer형 스택을 사용하는 예를 보여라. class GStack<T> { int tos; Object [] stck; public GStack() { tos = 0; stck = new Object [10]; } public void push(T item) { if(tos == 10) return; stck[tos] = item; tos++; public T pop() { if(tos == 0) return null; tos--; return (T)stck[tos]; public class MyStack { public static void main(String[] args) { GStack<String> stringStack = new GStack<String>(); stringStack.push("seoul"); stringStack.push("busan"); stringStack.push("LA"); for(int n=0; n<3; n++) System.out.println(stringStack.pop()); GStack<Integer> intStack = new GStack<Integer>(); intStack.push(1); intStack.push(3); intStack.push(5); System.out.println(intStack.pop()); } LA busan seoul 5 3 1