Array 기초문법배열, 문자열, 입출력 514770-1 2017 년봄학기 3/22/2017 박경신 배열 (array) 여러개의데이터를같은이름으로활용할수있도록해주는자료구조 인덱스 (Index, 순서번호 ) 와인덱스에대응하는데이터들로이루어진자료구조 배열을이용하면한번에많은메모리공간선언가능 배열은같은타입의데이터들이순차적으로저장되는공간 원소데이터들이순차적으로저장됨 인덱스를이용하여원소데이터접근 반복문을이용하여처리하기에적합한자료구조 ( 주로 for 또는 foreach 반복문과많이사용됨 ) 배열인덱스 0 부터시작 인덱스는배열의시작위치에서부터데이터가있는상대위치 Array 자바배열의필요성과모양 Array 배열선언과배열생성의두단계필요 배열선언 int char 배열생성 선언과초기화 배열생성과값초기화 // 10 int intarray[] = {0,1,2,3,4,5,6,7,8,9; 잘못된배열선언 intarray[]; chararray[]; intarray = new int[10]; chararray = new char[20]; int[] char[] intarray; chararray; int intarray[] = new int[10]; char chararray[] = new char[20]; //int intarray[10]; //.
Array 배열선언과생성 Array 배열을초기화하면서생성한결과 Array 배열참조 생성된 1 개의배열을다수의레퍼런스가참조가능 Array 배열원소접근 반드시배열생성후접근 int intarray []; // intarray[4] = 8; //, intarray 배열변수명과 [] 사이에원소의인덱스를적어접근 배열의인덱스는 0부터시작 배열의마지막항목의인덱스는 ( 배열크기 1) int[] intarray; intarray = new int[10]; intarray[3]=6; // int n = intarray[3]; //
Array 배열인덱스 인덱스는 0 부터시작하며마지막인덱스는 ( 배열크기 -1) 인덱스는정수타입만가능 int intarray [] = new int[5]; // 0~4 int n = intarray[-2]; //. -2 int m = intarray[5]; //. 5 (0~4) 배열의크기 배열의크기는배열레퍼런스변수를선언할때결정되지않음 배열의크기는배열생성시에결정되며, 나중에바꿀수없음 배열의크기는배열의 length 필드에저장 int size = intarray.length length; Array & For-each For-each 문 배열이나나열 (enumeration) 의각원소를순차적으로접근하는데유용한 for 문 int[] num = { 1,2,3,4,5 ; int sum = 0; // k num[0], num[1],..., num[4] for (int ( k : num) 15 sum += k; System.out.println(" " + sum); String names[] = { " ", " ", " ", " ", " ", " " ; // s names[0], names[1],..., names[5] for (String s : names) System.out.print(s + " "); 메소드에서배열리턴 메소드의배열리턴 배열의레퍼런스만리턴 메소드의리턴타입 메소드가리턴하는배열의타입은리턴받는배열타입과일치 리턴타입에배열의크기를지정하지않음 매개변수에배열이전달되는경우 매개변수에배열이전달되는경우는배열의 reference 가복사 Return type Method name int[] makearray() { int temp[] = new int[4]; return temp; Array return 2 3 4 5 6
Parameter Passing Primitive Type 자바의인자전달방식 (Parameter Passing) 값에의한호출 (Pass-by-value) 기본타입 (Primitive Type: 예를들어 int, double, ) 의값을전달하는경우 값이복사되어전달 메소드의매개변수가변경되어도호출한실제인자값은변경되지않음 void sum(int m, int n) { return m + n; m n 5 7 Parameter Passing Reference Type 자바의인자전달 (Parameter Passing) 방식 객체 (class object) 혹은배열 (array) 을전달하는경우 객체나배열의레퍼런스만전달 (Pass-by-reference) 객체혹은배열이통째로복사되어전달되는것이아님 메소드의매개변수와호출한실인자가객체나배열을공유하게됨 void assignarray(int[] values) { values for (int i=0; i<values.length; i++) { values[i] = i; // values 0~9 int a = 5; int b = 7; int c = sum(a, b); System.out.println(c); a b 5 7 int[] intarray = new int[5]; // create 5 integer array assignarray(intarray intarray); for (int v : intarray) { System.out.println(v); 패키지의특징 자바 JDK 의패키지구조 패키지의특징 패키지계층구조 클래스나인터페이스가너무많아지면관리의어려움 관련된클래스파일을하나의패키지로계층화하여관리용이 패키지별접근제한 default 로선언된클래스나멤버는동일패키지내의클래스들이자유롭게접근하도록허용 동일한이름의클래스와인터페이스의사용가능 서로다른패키지에이름이같은클래스와인터페이스존재가능 높은소프트웨어재사용성 오라클에서제공하는자바 API 는패키지로구성되어있음 java.lang, java.io 등의패키지들덕분에일일이코딩하지않고입출력프로그램을간단히작성할수있음 JDK 패키지 자바에서는관련된클래스들을표준패키지로묶어사용자에게제공 자바에서제공하는패키지는 C 언어의표준라이브러리와유사 JDK 의표준패키지는 rt.jar 에담겨있음 C:\Program Files\Java\jdk1.8.0_102\jre\lib\rt.jar rt.jar 의 java.awt 패키지에컴파일된클래스들이들어있다.
자바패키지구조 java applet awt beans io lang math net nio rmi security sql text util beancontext spi color datatransfer dnd event font geom im image print channels charset spi renderable spi spi annotation instrument management ref reflect activation dgc registry server acl cert spec interfaces concurrent jar logging prefs regex spi zip 주요패키지 java.lang 자바 language 패키지 스트링, 수학함수, 입출력등자바프로그래밍에필요한기본적인클래스와인터페이스 자동으로 import 됨 - import 문필요없음 java.util 자바유틸리티패키지 날짜, 시간, 벡터, 해시맵등과같은다양한유틸리티클래스와인터페이스제공 java.io 키보드, 모니터, 프린터, 디스크등에입출력을할수있는클래스와인터페이스제공 java.awt 자바 GUI 프로그래밍을위한클래스와인터페이스제공 javax.swing 자바 GUI 프로그래밍을위한스윙패키지 atomic locks Object 클래스 특징 java.lang 패키지에포함 자바클래스계층구조의최상위에위치 모든클래스의수퍼클래스 주요메소드 String 의생성과특징 String - java.lang.string String 클래스는하나의스트링만표현 // 스트링리터럴로스트링객체생성 String str1 = "abcd"; // String 클래스의생성자를이용하여스트링생성 char data[] = {'a', 'b', 'c', 'd'; String str2 = new String(data); String str3 = new String("abcd"); // str2 와 str3 은모두 "abcd" 스트링 String 생성자 19 20
스트링리터럴과 new String() 스트링생성 단순리터럴로생성, String s = "Hello"; JVM이리터럴관리, 응용프로그램내에서공유됨 String 객체로생성, String t = new String("Hello"); 힙에 String 객체생성 스트링객체의주요특징 스트링객체는수정불가능 == 과 equals() 두스트링을비교할때반드시 equals() 를사용하여야함 equals() 는내용을비교하기때문 21 String 클래스주요메소드 String 연결 + 연산자로문자열연결 + 연산의피연산자에문자열이있는경우 + 연산에객체가포함되어있는경우 객체.toString() 을호출하여객체를문자열로변환한후문자열연결 기본타입값은문자열로변환된후에연결 System.out.print("abcd" + 1 + true + 3.13e-2 + 'E'+ "fgh" ); // abcd1true0.0313efgh 출력 String concat(string str) 를이용한문자열연결 "abcd".concat("efgh"); // abcdefg 리턴 기존 String 객체에연결되지않고새로운스트링객체생성리턴 23
String 비교 int compareto(string anotherstring) 문자열이같으면 0 리턴 이문자열이 anotherstring 보다사전에먼저나오면음수리턴 이문자열이 anotherstring 보다사전에나중에나오면양수리턴 String a = "java"; String b = "jasa"; int res = a.compareto(b); if(res == 0) System.out.println("the same"); else if(res < 0) System.out.println(a +"<"+b); else System.out.println(a +">"+b); java>jasa "java" 가 "jasa" 보다사전에나중에나오기때문에양수리턴 비교연산자 == 는문자열비교에는사용할수없음 String 공백제거, 문자열의각문자접근 공백제거 String trim() 문자열앞뒤공백문자 (tab, enter, space) 제거한문자열리턴 String a = " abcd def "; String b = "\txyz\t"; String c = a.trim(); // c = "abcd def" String d = b.trim(); // d = "xyz" 문자열의문자 char charat(int index) 문자열내의문자접근 String a = "class"; char c = a.charat(2); // c = 'a' // "class" 에포함된 s 의개수를세는코드 int count = 0; String a = "class"; // a.length() 는 5 for(int i=0; i<a.length(); i++) { if(a.charat(i) == 's') count++; 26 System.out.println(count); // 2 출력 String 예제 String 예제 String 메소드 String substring(int beginindex) 는 beginindex부터나머지부분을 string으로반환 String substring(int beginindex, int endindex) 는 beginindex부터 endindex까지부분을 string으로반환 boolean contains(charsequence s) 는 s를가지고있는지여부를 true/false 반환 int lastindexof(string str) 는 str을가지고있는 lastindex 값을반환 String dir = "C:\\JAVA"; String filename = "IMG1.jpg"; String fullpath = dir + "\\" + filename; // fullpath= = C: C:\JAVA JAVA\IMG1.jpg IMG1.jpg if (filename.contains filename.contains("jpg") ("jpg")) ) { String format = "png"; String newname = fullpath.substring(0, fullpath.lastindexof('.')+1) + format; System.out.println(" ("newname newname=" + newname); // newname= = C: C:\JAVA JAVA\IMG1.png
스트림 자바의스트림 자바스트림은입출력장치와자바응용프로그램연결 입출력장치와프로그램사이의데이터흐름을처리하는소프트웨어모듈 입력스트림 입력장치로부터자바프로그램으로데이터를전달하는소프트웨어모듈 출력스트림 자바프로그램에서출력장치로데이터를보내는소프트웨어모듈 입출력스트림기본단위 : 바이트 자바입출력스트림특징 단방향스트림, 선입선출구조 자바의입출력스트림종류 바이트입출력스트림과문자입출력스트림 바이트입출력스트림 입출력되는데이터를단순바이트의스트림으로처리 예 ) 바이너리파일을읽는입력스트림 문자입출력스트림 문자만입출력하는스트림 문자가아닌바이너리데이터는스트림에서처리하지못함 예 ) 텍스트파일을읽는입력스트림 JDK 는입출력스트림을구현한다양한클래스제공 JDK 의바이트스트림클래스계층구조 JDK 의문자스트림클래스계층구조 클래스이름이공통적으로 Stream 으로끝남 클래스이름이공통적으로 Reader/Writer 로끝남
바이트스트림클래스 바이트스트림 바이트단위의바이너리값을읽고쓰는스트림 바이트스트림클래스 java.io 패키지에포함 InputStream/OutputStream 추상클래스 바이트스트림을다루는모든클래스의슈퍼클래스 FileInputStream/FileOutputStream 파일로부터바이트단위로읽거나저장하는클래스 바이너리파일의입출력용도 DataInputStream/DataOutputStream 자바의기본데이터타입의값 ( 변수 ) 을바이너리값그대로입출력 문자열도바이너리형태로입출력 FileInputStream 을이용한파일읽기 파일전체를읽어화면에출력하는코드샘플 FileInputStream fin = new FileInputStream("c:\\test.txt"); int c; while((c = fin.read())!= -1) { System.out.print((char)c); fin.close(); C:\test.txt 파일을열고파일과입력바이트스트림객체 fin 연결 파일끝까지바이트씩 c 에읽어들임. 파일의끝을만나면 read() 는 -1 리턴 바이트 c 를문자로변환하여화면에출력 스트림을닫음. 파일도닫힘. 스트림과파일의연결을끊음. 더이상스트림으로부터읽을수없음 문자스트림클래스 문자스트림 유니코드로된문자를입출력하는스트림 문자로표현되지않는데이터는다루지않음 문자스트림은이미지, 동영상과같은바이너리데이터는입출력할수없음 - 문자스트림은문자데이터만입출력가능 문자스트림을다루는클래스 Reader/Writer java.io 패키지에포함 추상클래스. 문자스트림을다루는모든클래스의슈퍼클래스 InputStreamReader/OutputStreamWriter 바이트스트림과문자스트림을연결시켜주는다리역할 지정된문자집합이용 InputStreamReader : 바이트를읽어문자로인코딩 OutputStreamWriter : 문자를바이트로디코딩하여출력 FileReader/FileWriter 텍스트파일에서문자데이터입출력 FileReader 를이용한텍스트파일읽기 system.ini 파일전체를읽어화면에출력하는코드샘플 import java.io.*; public class FileReaderEx { public static void main(string[] args) { FileReader in = null; try { // 파일로부터문자입력스트림생성 in = new FileReader("c:\\windows\\system.ini"); int c; while ((c = in.read())!= -1) { // 한문자씩읽는다. System.out.print((char)c); in.close(); catch (IOException e) { System.out.println(" 입출력오류 "); C:\Windows\system.ini 파일을열고문자입력스트림연결 파일의끝을만나면 read() 는 -1 리턴
버퍼입출력스트림클래스 버퍼스트림 버퍼를가진스트림으로써입출력데이터를일시적으로저장하는버퍼를이용하여입출력효율개선 입출력시운영체제의 API 호출횟수를줄여입출력성능개선 출력시여러번출력되는데이터를버퍼에모아두고한번에장치로출력 입력시입력데이터를버퍼에모아두고한번에프로그램에게전달 바이트버퍼스트림클래스 BufferedInputStream 와 BufferedOutputStream 바이트단위의바이너리데이터 (Binary Data) 를처리하는버퍼스트림 문자버퍼스트림클래스 BufferedReader 와 BufferedWriter 유니코드의문자데이터 (Text Data) 만처리하는버퍼스트림 텍스트파일읽기 BufferedReader 클래스를사용한텍스트파일 read import java.io.*; public class BufferedReaderExample { public static void main(string args[])throws Exception{ FileReader fr = new FileReader("C:/test.txt"); BufferedReader br = new BufferedReader(fr); int i; while((i=br.read())!=-1){ 파일전체를읽어화면에출력 System.out.print((char)i); br.close(); fr.close(); 텍스트파일읽기 BufferedReader 클래스를사용한텍스트파일 readline ( 파일을한줄씩읽어서 lines 배열에저장 ) import java.io.*; public class BufferedReaderExample2 { static String[] lines = new String[10]; // 10 public static void main(string args[])throws Exception{ BufferedReader br = new BufferedReader(new FileReader("C:/test.txt")); int i = 0; String line = ""; while ((line=br.readline())!= null){ 한줄씩읽어 lines 배열에저장 lines[i++] = line; br.close(); for (String l : lines) System.out.println(l); // lines File 클래스 File 클래스 파일의경로명을다루는클래스 java.io.file 파일과디렉터리경로명의추상적표현 파일이름변경, 삭제, 디렉터리생성, 크기등파일관리 File 객체는파일읽고쓰기기능없음 파일입출력은파일입출력스트림이용
File 클래스생성자와주요메소드 File 클래스예제 41 파일객체생성 파일인지디렉터리인지구분 서브디렉터리리스트얻기 File f = new File("c:\\test.txt"); File f = new File("c:\\windows\\system.ini"); String res; if(f.isfile()) // 파일타입이면 res = " 파일 "; else // 디렉터리타입이면 res = " 디렉터리 "; System.out.println(f.getPath() + " 은 " + res + " 입니다."); c:\windows\system.ini 은파일입니다. File f = new File("c:\\tmp\\java_sample"); String[] filenames = f.list(); // 파일명리스트얻기 for (int i=0; i<filenames.length; i++) { File sf = new File(f, filenames[i]); System.out.print(filenames[i]); System.out.print("\t 파일크기 : " + sf.length());