자바야 놀자 PPT

286
1 JavaSpecialist.c o.kr 자자자 자자 2017.03.16 허허허

Transcript of 자바야 놀자 PPT

1JavaSpecialist.co.kr

자바야 놀자2017.03.16

허진경

2JavaSpecialist.co.kr

이 파워포인트 파일은 [ 자바야 놀자 ] 교재의 내용으로 구성되어 있습니다 .

교보문고에서 [ 자바야 놀자 ] 를 검색해 주세요 .

이 파워포인트 파일의 교재는 교보문고에서 구매할 수 있습니다 .

http://pod.kyobobook.co.kr/newPODBookList/newPODBookDetailView.ink?barcode=1400000280836&orderClick=KBC

3JavaSpecialist.co.kr

이 파워포인트 파일의 교재는 교보문고에서 구매할 수 있습니다 .

http://pod.kyobobook.co.kr/newPODBookList/newPODBookDetailView.ink?barcode=1400000280836&orderClick=KBC

교재 PDF 파일은 http://javaspecialist.co.kr/board/614 에서 다운로드 할 수 있습니다 .

교재의 소스코드는 http://javaspecialist.co.kr/board/68 에서 다운로드 할 수 있습니다 .

4JavaSpecialist.co.kr

Contents

자료형

2 4연산자 고객관리프로그램 I언어의 기본 구조자바 개요

1 63 5제어문

3 27

39

53

79

89

내부클래스

8 10예외처리 고객관리프로그램 II객체지향프로그

래밍객체와 클래스

7 129 11컬렉션과 제네릭

113 16

1 171

177

181

199

14기본 API 클래스

입출력 프로그래밍

13

217 25

1

01 자바 개요1. 자바 개요2. Java SE3. HelloWorld 애플리케이션4. 이클립스 (Eclipse) 를 이용한 개발

Chapter

1. 자바 개요

7JavaSpecialist.co.kr

자바 역사 및 버전1.1. 자바 개요

역사

• Sun Microsystems 에서 개발• 1991 년 초 그린프로젝트의

가전제품에 이용할 목적으로 개발• 1995 년 java 이름으로 명칭 변경• 1995 년 5 월 자바 기술 발표• 1995 년 12 월에 자바 베타 2 가

발표• 정식 버전이 1996 년 1 월 23 일

Java 1.0 으로 최초로 발표• 현재 자바 7(1.7.xx)

버전

• 자바의 버전은 보통 자바 SE 의 버전으로 표현

• 초기 1.0/1.1 버전은 JDK/JRE 의 명칭을 사용

• Java 1.2 가 발표되면서 J2SDK/J2RE 라고 개명하여 사용하였으나 기존의 명칭으로 사용하는 사람들이 많아 현재는 다시 JDK/JRE 의 명칭으로 돌아왔음

• 언어 자체는 자바언어명세 (JLS) 에서 정의되며 edition 으로 구분

• JLS 2nd Edition : assertion 기능이 추가된 것 외에 거의 변화가 없었음

• JLS 3rd Edition : JDK 1.5 와 함께 바뀜• 현재 JLS 3 판 , JDK 버전 1.8

8JavaSpecialist.co.kr

자바 특징1.1. 자바 개요

플랫폼 종속적

플랫폼 독립적

• OOP(Object Oriented Programming; 객체지향프로그래밍언어 )

• 플랫폼 독립적 ( 아키텍쳐 중립적 )

• 멀티스레드 (Multi-thread) 지원

• 분산환경

• 인터프리터 언어

• Simple 한 코드

• 뛰어난 보안성 (Secure)

• 고성능

• 동적

• 모듈화 (Modularity)

• 무료 개발 환경

2. 자바 SE

10JavaSpecialist.co.kr

JDK 다운로드 및 설치1.2. 자바 SE

• http://java.sun.com -> Java SE 링크 클릭 -> Java Platform(JDK) 8u??? 선택

• 다운로드 받은 파일 더블클릭 실행 , 이후 디폴트 값으로 설치

11JavaSpecialist.co.kr

3. HelloWorld

12JavaSpecialist.co.kr

HelloWorld1.3. HelloWorld

1. public class HelloWorld { // 클래스 선언부2. 3. public static void main(String[] args) {4. System.out.println("Hello World"); //sysout 입력 후 Ctrl+SpaceBar5. }6. }

컴파일 실행

13JavaSpecialist.co.kr

4. 이클립스를 이용한 개발

14JavaSpecialist.co.kr

Eclipse IDE 다운로드 및 설치1.4. 이클립스를 이용한 개발

• http://eclipse.org/ -> Download -> Eclipse IDE for Java EE Developer 다운로드

• D:\Projects 폴더에 압축 풀기

• eclipse.ini 파일 맨 아래에 인코딩 설정 추가

• -Dfile.encoding=utf-8

15JavaSpecialist.co.kr

이클립스 실행과 Project workspace1.4. 이클립스를 이용한 개발

실행 시 프로젝트가 저장될 작업 공간 설정 D:\Projects\workspace 로 설정

첫 실행 화면

16JavaSpecialist.co.kr

이클립스 기본화면 구성1.4. 이클립스를 이용한 개발

워크 벤치 (Workbench) 퍼스펙티브바

메뉴바툴바

퍼스펙티브(Perspective)

퍼스펙티브에 따라사용자에게 적합한 뷰와 메뉴가 배치된다 .

좌측 View 영역

중앙 View 영역

하단 View 영역

우측 View 영역

Fast 뷰 : 잘 사용하지 않는 화면들을 최소화 시켜놓고 필요한 시점에만 잠깐 활성화 시킬 때 사용된다 .

Eclipse 기본화면은 메뉴바 , 툴바 , 퍼스펙티브바 , 4 개의 View 영역으로 크게 구분된다 .이 4 개의 뷰를 포함하는 전체 영역을 퍼스펙티브 (Perspective) 라고 하고 , Eclipse Window 전체를 워크벤치 (Workbench) 라

부른다 .

17JavaSpecialist.co.kr

이클립스 기본화면 구성1.4. 이클립스를 이용한 개발

퍼스펙티브바메뉴바

툴바

좌측 View 영역

중앙 View 영역

하단 View 영역

우측 View 영역

퍼스펙티브에 따라 사용자에게 적합한 뷰와 메뉴가 배치

18JavaSpecialist.co.kr

프로젝트 Perspective1.4. 이클립스를 이용한 개발

이클립스는 Perspective 에 따라 화면의 아이콘 및 메뉴 배치가 다르게 보인다 .어떤 프로젝트를 개발하고 있느냐에 따라 Perspective 가 달라진다 .메뉴에 보이지 않는 항목이 있다면 Other 를 선택하면 나머지 항목을 찾을 수 있다 .자바 개발을 위해서는 Java Perspective 로 변경한다 .

19JavaSpecialist.co.kr

프로젝트 생성1.4. 이클립스를 이용한 개발

File -> New -> Java Project

20JavaSpecialist.co.kr

소스코드 작성1.4. 이클립스를 이용한 개발

File -> New -> Class 클래스 이름 입력 시 대 / 소문자를 구분

21JavaSpecialist.co.kr

코드 작성1.4. 이클립스를 이용한 개발

sysout 입력 후 Ctrl+Space 로 자동완성 가능

22JavaSpecialist.co.kr

실행1.4. 이클립스를 이용한 개발

실행 단축키는 Ctrl+F11

23JavaSpecialist.co.kr

샘플 코드 가져오기1.4. 이클립스를 이용한 개발

[File] -> [Import] [General] -> [Existing Projects into Workspace]

다운로드 받은 소스코드 압축파일 선택

소스코드 다운로드 주소http://javaspecialist.co.kr/board/68

02 언어의 기본 구조1. 주석문과 식별자2. 키워드 (Java Language Keywords)3. 이름 규칙4. 변수와 메서드5. Java Standard Edition 8 Documents

Chapter

25JavaSpecialist.co.kr

1. 주석문과 식별자

26JavaSpecialist.co.kr

주석문 (Comments)2.1. 주석문과 식별자

// 한 줄 주석

/* 한 줄 또는 여러 줄 주석

*/

/** document 생성용 주석 javadoc 명령으로 API 문서를 자동 생성시킬 때 사용

*/

27JavaSpecialist.co.kr

주석문 (Comments)2.1. 주석문과 식별자

28JavaSpecialist.co.kr

세미콜론 (;), 블록 (Block), 공백 (Whitespace)2.1. 주석문과 식별자

;( 세미콜론 ), { }( 블록 ), 그리고 공백들은 코드의 가독성을 높여줌

•논리적인 한 문장이 끝날 때 반드시 세미콜론 (;) 을 붙여 줌

•블록은 중괄호 (curly brace), 즉 "{" 와 "}" 로 묶여진 부분을 말하며 , 복합문을 구성하는 요소•종속된 문장이 다수 개 일 때 "{" 로 시작하고 "}" 닫아줌

•공백 (Whitespace) 은 빈칸 , 탭 , 빈 줄 등이 있으며 , 이러한 공백은 소스 코드를 보기 좋게 하고 알아보기 쉽게 하는데 사용됨

29JavaSpecialist.co.kr

식별자2.1. 주석문과 식별자

• 대문자와 소문자를 구분하고 , 길이 제한이 없습니다 .

• 문자와 숫자 , 밑줄 (_), 달러기호 ($) 를 포함할 수 있습니다 .(밑줄 (_) 과

달러기호 ($) 는 로컬 시스템의 규칙이 있거나 부득이한 경우가 아니면

식별자에 사용하지 않는 것이 좋습니다 . 또한 유니코드를 지원하기 때문에

한글 사용이 가능하지만 , 영문자를 사용하는 것이 좋습니다 .)

• 문자 , 밑줄 (_), 달러기호 ($) 로 시작할 수 있습니다 .

• 숫자로는 시작할 수 없습니다 . 첫 문자 외에는 문자 , 숫자 , 밑줄 (_),

달러기호 ($) 등을 임의의 순서로 사용할 수 있습니다 .

• 공백을 포함할 수 없습니다 .

• 키워드는 식별자로 사용할 수 없습니다 .

30JavaSpecialist.co.kr

식별자2.1. 주석문과 식별자

2. 키워드

32JavaSpecialist.co.kr

키워드 (Keywords)2.2. 키워드

3. 이름 규칙

34JavaSpecialist.co.kr

이름 규칙2.3. 이름 규칙

▽ 클래스 이름 /인터페이스 이름- 명사나 형용사를 서술적으로 연결하여 사용합니다 .- 첫 글자는 대문자로 표기합니다 .- 연결된 단어의 첫 글자도 대문자로 표기합니다 .- 나머지 문자는 소문자로 표기합니다 .- "$"(dollar sign) 은 내부 클래스에서 특별한 의미가 있기 때문에 사용을 권장하지 않습니다 .

 ▽ 변수 이름

- 명사적 의미를 갖게 만듭니다 .- 첫 글자는 소문자 , 연결 단어의 첫 글자는 대문자로 표기합니다 .- 나머지 문자는 소문자로 표기합니다 .- 일반적으로 변수 이름에서는 "_"(underscore character) 를 사용하지 않습니다 .

 ▽ 메서드 이름

- 동사적 의미를 갖게 합니다 .- 첫 글자는 소문자 , 연결 단어의 첫 글자는 대문자로 표기합니다 .- 나머지 문자는 소문자로 표기합니다 .- 메서드 이름 뒤에는 한 쌍의 괄호 "( )" 가 뒤따릅니다 .- 일반적으로 메서드 이름에서는 "_"(underscore character) 를 사용하지 않습니다 .

4. 변수와 메서드

36JavaSpecialist.co.kr

변수2.4. 변수와 메서드

37JavaSpecialist.co.kr

메서드2.4. 변수와 메서드

38JavaSpecialist.co.kr

5. Java SE 8 Documents

39JavaSpecialist.co.kr

Java SE 8 Documents2.5. Java SE 8 Documents

http://docs.oracle.com/javase/8/docs/api/index.html

40JavaSpecialist.co.kr

배포용 설명서 (API Document) 작성2.5. Java SE 8 Documents

[Project] -> [Generate Javadoc...] [Configure...] 버튼을 클릭하여 javadoc 명령어(javadoc.exe) 의 경로와 이름을 선택

한글을 포함한 도큐먼트를 생성하려면 VM options 에 아래 내용 추가-encoding utf-8 -charset utf-8

41JavaSpecialist.co.kr

배포용 설명서 (API Document) 작성2.5. Java SE 8 Documents

42JavaSpecialist.co.kr

03 데이터 타입1. 기본 데이터 타입2. 배열 (array)3. 변수의 초기화

Chapter

43JavaSpecialist.co.kr

1. 기본 데이터 타입

44JavaSpecialist.co.kr

기본데이터 타입3.1. 기본 데이터 타입

유형 크기 범 위 초기값

정수형Integral

byte 1 byte (-128 ~ 127) - 27 ~ 27- 1 0

short 2 byte (-32,768 ~ 32,767) - 215 ~ 215- 1 0

int 4 byte (-2,147,483,648 ~ 2,147,483,647) - 231 ~ 231- 1 0

long 8 byte (-9,223,372,036,854,775,808 ~9,223,372,036,854,775,807) - 263 ~ 263- 1 0L

실수형Floating-

Point

float 4 byte (7 자리의 소수 ) ±1.401e-45F ~ 3.402e+38F 0.0F

double 8 byte (15 자리의 소수 ) ±4.940e-324 ~ 1.797e+308 0.0D논리형Logical boolean 1 bit true 또는 false false

문자형Textual

char 2 byte \u0000 ~ \uFFFF '\u0000'

String variable 각 위치에서 \u0000 ~ \uFFFF nullAll reference type null

45JavaSpecialist.co.kr

기본데이터 타입 – 정수 , 부동소수점3.1. 기본 데이터 타입

46JavaSpecialist.co.kr

기본데이터 타입 – 논리3.1. 기본 데이터 타입

47JavaSpecialist.co.kr

기본데이터 타입 – 문자3.1. 기본 데이터 타입

48JavaSpecialist.co.kr

문자열3.1. 기본 자료형

• String 클래스를 이용해서 변수 선언• String s1 = "Hello"; // 변수 선언 및 할당• String s2 = new String("Hello"); // 객체 생성• String s3; //s3 는 디폴트 값 null, 길이를 알 수 없음• String s4 = ""; //null string, 길이가 0임• String s5 = " "; //blank string, 길이가 0 이 아님

• 문자열과 다른 값과 + 연산을 수행하면 무조건 문자열로 변환• 100+200 -> 300• 100+"200" -> 100200• '10+20+"Hello" -> 30Hello• "Hello"+10+20 -> Hello1020

• 문자형은 0~65535 값을 가짐• 'A' + 10 -> 75

• 'A' 는 char 형 , 10 진수 65(0x41) 값을 가짐• int 형 크기 이하의 연산의 결과는 무조건 int 형이 된다 .

49JavaSpecialist.co.kr

2. 배열

50JavaSpecialist.co.kr

배열3.2. 배열

특징reference typehomogeneous collectionimmutable

배열 선언 ( 크기 명시 못함 )int[] intArr;

배열 생성 ( 크기 명시해야 함 )intArr = new int[5];

배열 선언과 생성을 동시에 할 수 있음int[] intArr = new int[5]; // 선호int []intArr = new int[5];int intArr[] = new int[5];

배열 생성 시 배열의 타입별 초기값

51JavaSpecialist.co.kr

Primitive type array3.2. 배열

52JavaSpecialist.co.kr

Reference type array3.2. 배열

53JavaSpecialist.co.kr

Primitive Array & Reference Array3.2. 배열

int[] arr; // 배열 선언arr = new int[5]; // 배열 생성//int[] arr = new int[5];arr[0] = 10;arr[1] = 20;arr[2] = 30;arr[3] = 40;arr[4] = 50;

int[] arr2 = {100, 200, 300, 400, 500};

Cat[] catArr = new Cat[5];catArr[0] = new Cat(3, " 나비 ");Cat c2 = new Cat(2, "너비 ");Cat c3 = new Cat(4, "누비 ");Cat c4 = new Cat(5, "노비 ");Cat c5 = new Cat(10, "호랑나비 ");catArr[1] = c2;catArr[2] = c3;catArr[3] = c4;catArr[4] = c5;

arrarr2

catArr

10 20 30 40 50

100 200 300 400 500

Stack Heap

class Cat { int age; String name; Cat(int age, String name) { this.age = age; this.name = name; } public String toString() { return name + ", " + age; }}//end Cat class

54JavaSpecialist.co.kr

Reference type 배열수정3.2. 배열

55JavaSpecialist.co.kr

배열복사3.2. 배열

56JavaSpecialist.co.kr

System.arraycopy()3.2. 배열

50 63 78 82 45 25 16 98 53 88 45 79

0 0 0 0 0 0 0 0 0 0 0 0

source

dest

0 63 78 82 45 25 16 98 53 0 00

System.arraycopy 를 사용해서 위와 같이 되도록 프로그래밍하면 ?

System.arraycopy(source, 1, dest, 2, 8);

57JavaSpecialist.co.kr

Lotto3.2. 배열

1 부터 45까지 저장된 배열의 값을 0번 방과 N( 난수 )번 방의 데이터를 교환하는 것을 100번( 더 많이 해도 됨 ) 수행한 다음 처음 6 개만 출력하는 방법도

있습니다 .

1. public class Lotto {2. public static void main(String[] args) {3. int[] lotto = {0, 0, 0, 0, 0, 0};4. 5. int index = 0; 6. while(true) { // 무한루프7. int rand = (int)(Math.random() * 45) + 1;//번호 추첨8. int i=0;9. for(i=0; i<index; i++) {10. if(rand == lotto[i]) {// 추첨된 번호임11. break;12. }13. }14. if(index == i) {// 추첨된 번호에 있지 않음15. lotto[index++] = rand;16. }17. if(index>5) break;//6 개 번호 추첨이 끝남18. }19. 20. //결과 출력21. for(int i=0; i<lotto.length; i++) {22. System.out.print(lotto[i] + "\t");23. }24. }25.}

58JavaSpecialist.co.kr

3. 변수의 초기화

59JavaSpecialist.co.kr

변수의 초기화3.3. 변수의 초기화

지역변수는 사용하기 전에 반드시 초기화

해야 함

멤버변수는 사용하기 전에 초기화 하기 않아도 기본값으로

초기화 됨

지역변수

멤버변수 ( 인스턴스 변수 )멤버변수 ( 클래스 변수 )

60JavaSpecialist.co.kr

04 연산자1. 연산자2. 단항 연산자 (Unary operator)3. 2 항 연산자 (Binary operator)4. 3 항 연산자 (Ternary operator)5. 대입 연산자 (Assignment operator)

Chapter

61JavaSpecialist.co.kr

1. 연산자

62JavaSpecialist.co.kr

연산자4.1. 연산자

우선 순위 연산자 연산자 설명

높음☝

우선순위

낮음☟

( ) [ ].

괄호소수점 /참조 연산자

++, --+, -

!~

(type)

증 /감 연산자 (증가 , 감소 )부호

논리 연산자 (반전 )비트 연산자 (반전 )

형 변환*, /, % 산술 연산자 (곱셈 , 나눗셈 , 나머지 )

+, - 산술 연산자 (덧셈 , 뺄셈 )

<<, >>, >>> 비트 이동 연산자 ( 좌 , 우 , 우 ( 부호 포함 ))

<, <=, >, >===, !=

instanceof

비교 연산자 ( 대 / 소 비교 )비교 연산자 ( 동 / 이 비교 )type 연산자 ( 객체 형 비교 )

&, |, ^ 비트 연산자 (AND, OR, XOR)논리 연산자 (AND, OR, XOR)

&&, || 논리 연산자 (Short Circuit)? : 논리연산자 (3 항 연산자 )

=+=, -=, *=, /=, %=<<=, >>=, >>>=

&=, ^=, |=

대입 연산자연산 후 대입 연산자연산 후 대입 연산자연산 후 대입 연산자

63JavaSpecialist.co.kr

2. 단항 연산자

64JavaSpecialist.co.kr

증 / 감연산자 ++ --4.2. 단항 연산자

• 증 /감 연산자는 변수의 값을 1증가 또는 감소시킴• a = a+1; 보다 a++; 이 연산속도가 빠름• ++, -- 는 변수의 앞에 오느냐 , 뒤에 오느냐에 따라 할당되는 주위 변수의 값이 달라질 수 있다 .• ++ 1 증가시킴• -- 1 감소시킴

65JavaSpecialist.co.kr

비트반전과논리반전 연산자4.2. 단항 연산자

66JavaSpecialist.co.kr

형변환4.2. 단항 연산자

작은 크기 변수 값을 큰 크기를 갖는 변수에 저장할 경우에는 자동 형 변환이 발생byte a = 10;int b = a; //promotion

큰 크기 변수의 값을 작은 크기 변수에 저장할 경우에는 명시적 형 변환을 해야 한다 .int a = 10;byte b = a; // 에러byte b = (byte) a; //type casting

기본 데이터 타입의 크기byte -> short -> int -> long -> float -> double char -^

67JavaSpecialist.co.kr

형변환 예4.2. 단항 연산자

68JavaSpecialist.co.kr

3. 2 항 연산자

69JavaSpecialist.co.kr

산술연산자 +, -, *, /, %4.3. 2 항 연산자

• 리터럴의 연산은 컴파일 시 최적화 됨char a3 = 'a';char b3 = a3 + 1; // 에러char c3 = 'a' + 1; //==> char c3 = 'b';int sec = 60*60*24; //int sec = 86400; 와 동일

• 나눗셈의 경우에도 int 형 이하의 연산은 int 형이 됨int a = 3;int b = 2;double data = a / b; //data 값은 1.0float pi = 3.141592f;float shortPi = (int)(pi * 1000) / 1000F; //F붙여야 함 . 3.141

• int 형 이하의 연산 결과는 int 형 (결과가 int형을 넘을 경우 데이터가 손상될 수 있음 )

byte a = 127;byte b = 20;byte c = (byte)(a+b); //-109

int a1 = 100000;int b1 = 100000;long c1 = (long)a1 * b1; //1410065408

70JavaSpecialist.co.kr

비교 연산자 <, <=, >, >=, ==, !=4.3. 2 항 연산자

• 비교 연산자 (Comparison operator) 의 결과 값은 크기 값을 비교하여 조건을 만족하면 true 를 , 맞지 않으면 false 를 반환

• 만약 비교되는 숫자의 자료형이 다를 경우 기본적으로 크기가 큰 자료형에 맞추어 비교 연산을 수행

• 동등 (equality) 연산자 ‘ ==’ 와 비동등 (inequality) 연산자 ‘ !=’ 는 객체 참조 값 즉 , 주소 값이 같은 지의 여부를 판단하여 true 와 false 를 반환

• 객체 참조가 아닌 실제 값을 비교 판단하기 위해서는 equals() 메서드를 이용해야 함 (equals() 메서드는 Object 클래스를 다루는 부분에서 자세하게 설명됩니다 .)

• instanceof 연산자의 경우 런타임 시 연산자의 왼쪽 항의 객체가 오른쪽 항 클래스의 인스턴스이면 true 를 반환하고 , 그렇지 않으면 false 를 반환 (instanceof 연산자를 이해하려면 클래스 개념이 있어야 합니다 . instanceof 연산자에 대해서는 객체지향프로그래밍에서 자세히 설명합니다 .)

71JavaSpecialist.co.kr

비트연산자 ^, &, |4.3. 2 항 연산자

72JavaSpecialist.co.kr

반올림 , 올림 , 내림 , 버림4.3. 2 항 연산자

원래 수 -3.6 -3.4 +3.4 +3.6반올림 Math.round() -4 -3 3 4올림 Math.ceil() -3 -3 4 4내림 Math.floor() -4 -4 3 3버림 (int) -3 -3 3 3

1. public class ToInt {2. public static void main(String[] args) {3. double a = -3.6;4. double b = -3.4;5. double c = 3.4;6. double d = 3.6;7. System.out.printf("%d %d %d %d", Math.round(a), Math.round(b), Math.round(c), Math.round(d));8. System.out.println();9. System.out.printf("%.1f %.1f %.1f %.1f", Math.ceil(a), Math.ceil(b), Math.ceil(c), Math.ceil(3.6));10. System.out.println();11. System.out.printf("%.1f %.1f %.1f %.1f", Math.floor(a), Math.floor(b), Math.floor(c), Math.floor(d));12. System.out.println();13. System.out.printf("%d %d %d %d", (int)(a), (int)(b), (int)(c), (int)(d));14. }15. }

73JavaSpecialist.co.kr

비트 이동 연산자 <<, >>, >>>4.3. 2 항 연산자

<< 왼쪽으로 비트 이동 , 오른쪽에 채워지는 비트는 0, 2 를 곱한 결과

>> 오른쪽을 비트 이동 , 채워지는 비트는 부호비트 , 2 로 나눈 결과

>>> 오른쪽을 비트이동 , 채워지는 비트는 무조건 0, 음수가 양수로 바뀔 수 있음

* 비트 이동 연산자는 오른쪽 항의 값에 대해서 단축이 일어납니다 . 단축이란 비트 이동 연산자의

젯수 값이 자료형의 크기 이상일 때 젯수의 숫자를 자료형의 크기로 나눈 나머지를 젯수로 한다는 뜻

int a = 8;

int b = a << 33; // int b = a << (33 % 32);

* / 보다 연산속도가 빠르지만 가독성이 떨어져서 권장하지 않음

74JavaSpecialist.co.kr

비트 이동 연산자 예4.3. 2 항 연산자

75JavaSpecialist.co.kr

논리 연산자 ^, &, |, &&, ||4.3. 2 항 연산자

76JavaSpecialist.co.kr

4. 3 항 연산자

77JavaSpecialist.co.kr

조건연산자 ? :4.4. 3 항 연산자

78JavaSpecialist.co.kr

5. 대입 연산자

79JavaSpecialist.co.kr

대입연산자 =, op=4.5. 대입 연산자

• 대입 연산자의 기본 기호는 ‘ =’ 이고 , 보다 발전된 대입 연산자는 x operand= a 의 형태를 가지고 있으며 이는 x = x operand a 와 같은 역할을 합니다 .

• 대입 연산자에는 =, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, ^=, |= 등이 있습니다 .

80JavaSpecialist.co.kr

05 제어문1. 조건문2. 반복문3. 탈출문

Chapter

81JavaSpecialist.co.kr

제어문5. 제어문

분기문 (if, switch~case)if( 조건식 )switch( 수식 )

수식의 결과는 int 형으로 자동 형변환 가능한 타입 또는 enum 타입뿐임JDK 1.7 부터 문자열로 비교 가능

반복문 (for, while, do~while)for : 반복 횟수가 정해져 있을 때

for( 초기값 ; 조건식 ; 증 /감문 ) {반복될 문장

}while : 반복 횟수가 정해져 있지 않을 때

초기값while( 조건식 ) { 반복될 문장 ; 증 /감문}

do~while : 반드시 한번 이상 실행할 필요가 있을 때do {

반복될 문장 ;}while( 조건식 ) ;

최초 한번 실행한 다음 조건식을 비교함

탈출문 (break, continue)break : 반복문을 더 이상 수행 안 함continue : 반복문을 1회 skip 함* return 문도 제어구조를 탈출하는 용도로 사용됨

82JavaSpecialist.co.kr

1. 조건문

83JavaSpecialist.co.kr

if 문 (if ~ else 문 )5.1. 조건문

84JavaSpecialist.co.kr

if 문 ( 다중 else if 문 )5.1. 조건문

85JavaSpecialist.co.kr

if 문 ( 중첩 if 문 )5.1. 조건문

86JavaSpecialist.co.kr

switch~case5.1. 조건문

87JavaSpecialist.co.kr

switch 예5.1. 조건문

switch(str.charAt(0)) {//case "insert": //7 부터 가능case 'i':case 'I':case ' ㅑ ': System.out.println(" 데이터를 입력합니다 ."); break;//case "update" :case 'u':case 'U':case ' ㅕ ': System.out.println(" 데이터를 수정합니다 ."); break;default : System.out.println(" 명령어가 올바르지 않습니다 ."); break;

}

88JavaSpecialist.co.kr

2. 반복문

89JavaSpecialist.co.kr

while5.2. 반복문

90JavaSpecialist.co.kr

do ~ while() ;5.2. 반복문

91JavaSpecialist.co.kr

for5.2. 반복문

92JavaSpecialist.co.kr

중첩 for 문5.2. 반복문

93JavaSpecialist.co.kr

피라미드 출력하기5.2. 반복문

나머지 예제들도 구현해 보세요 .……

94JavaSpecialist.co.kr

피라미드 출력하기5.2. 반복문

i j < dan-i 별

0 01234

5 *****

1 0123

4 ****

2 012

3 ***

3 01

2 **

4 0 1 *

i j > dan-i-1 별

0 54321

0 *****

1 5432

1 ****

2 543

2 ***

3 54

3 **

4 5 4 *for(int i=0; i<dan; i++) { for(int j=5; j>dan-i-1; j--) { System.out.print("*"); } System.out.println();}

for(int i=0; i<dan; i++) { for(int j=0; j<dan-i; j++) { System.out.print("*"); } System.out.println();}

95JavaSpecialist.co.kr

Enhanced for loop 문5.2. 반복문

배열 , Collection 객체 등의 내용을 모두 소진하기 위한 용도Java 5 버전부터 사용 가능

3. 탈출문

97JavaSpecialist.co.kr

break5.3. 탈출문

98JavaSpecialist.co.kr

continue5.3. 탈출문

99JavaSpecialist.co.kr

Label 을갖는반복문5.3. 탈출문

100JavaSpecialist.co.kr

return5.3. 탈출문

101JavaSpecialist.co.kr

소수 구하기5. 제어문

1. public class PrimeNumber {2. public static void main(String[] args) {3. System.out.println("======= Prime Number

=======");4. int cnt;5. for (int i=1; i<=100; i++) {6. cnt = 0;7. for (int j=1; j<=i; j++) {8. if(i%j == 0) {9. cnt++;10. }11. }12. if(cnt == 2) {13. System.out.print(i + " ");14. }15. }16. }17.}

102JavaSpecialist.co.kr

단어 거꾸로 출력하기5. 제어문

1. import java.util.Scanner;2. 3. public class ReverseWord {4. public static void main(String[] args) {5. 6. Scanner scan = new Scanner(System.in);7. String str = scan.nextLine();8. for(int i=str.length(); i>0; i--) {9. System.out.print(str.charAt(i-1));10. }11. scan.close();12. 13. }14.}

103JavaSpecialist.co.kr

키보드로부터데이터읽기5. 제어문

104JavaSpecialist.co.kr

난수 발생5. 제어문

105JavaSpecialist.co.kr

다이아몬드 만들기5. 제어문

public class StarDiamond { public static void main(String[] args) { int dan = 5; for(int i=0; i<dan; i++) { for(int j=0; j<dan-i-1; j++) { System.out.print(" "); } for(int j=0; j<2*i+1; j++) { if(j==0 || j==2*i) { System.out.print("*"); }else { if(j%2==1) { System.out.print(" "); }else { System.out.print("$"); } } } System.out.println(); } for(int i=0; i<dan-1; i++) { for(int j=0; j<i+1; j++) { System.out.print(" "); } for(int j=0; j<2*(dan-i-1)-1; j++) { if(j==0 || j==2*(dan-i-2)) { System.out.print("*"); }else { if(j%2==1) { System.out.print(" "); }else { System.out.print("$"); } } } System.out.println(); } }}

첫 * 와 마지막 *을 제외하고 공백

출력

짝수 인덱스 위치 $ 출력 (0 부터 시작하므로 )

먼저 다이아몬드를

만드세요 .

106JavaSpecialist.co.kr

Palindrome5. 제어문

A palindrome is a word, phrase, number, or other sequence of characters which reads the same backward as forward, such as madam or racecar. Sentence-length palindromes may be written when allowances are made for adjustments to capital letters, punctuation, and word dividers, such as "A man, a plan, a canal, Panama!", "Was it a car or a cat I saw?" or "No 'x' in Nixon". - wikipedia

입력 받은 문자열이 회문 (回文 , 팰린드롬 ) 문자열이면 true 를 출력하고 아니면 false 를 출력하는 프로그램을

작성하세요 .

• 다 좋은 것은 좋다• 소주 만 병만 주소• 여보 안경 안 보여• 다 큰 도라지라도 큰다 .• 아들딸이 다 컸다 이 딸들아• 대한전선 사장이 장사 선전한대• 다 간다 이 일요일 일요일이 다 간다

107JavaSpecialist.co.kr

06 고객관리 프로그램 I

Chapter

108JavaSpecialist.co.kr

요구사항 정의고객관리 프로그램

고객의 정보는 이름 , 성별 , 이메일 , 출생년도가 있습니다 . 고객의 정보를 입력 받아 배열에 저장해야 합니다 . 이름은 문자열로 저장하며 , 성별은 남자는 M, 여자는 F 로 저장합니다 . 이메일은 문자열로 저장하며 태어난 출생년도는 정수로 저장합니다 .

고객 관리 프로그램은 고객의 정보를 저장 , 조회 , 수정 , 삭제할 수 있는 기능이 있어야 합니다 . 고객 정보를 파일에 저장하는 기능을 구현하지 않아도 됩니다 .

I 를 눌러 고객의 정보를 입력 받도록 하며 , 저장된 고객 정보는 P 또는 N 을 눌러 이전 고객정보 또는 다음 고객정보를 조회할 수 있어야 합니다 . 조회한 고객 정보는 U 를 눌러 새로운 정보로 수정할 수 있어야 합니다 . D 를 누르면 조회한 고객 정보를 배열에서 삭제해야 합니다 . 프로그램의 종료는 Q 를 누릅니다 .

109JavaSpecialist.co.kr

변수 선언고객관리 프로그램

// 배열에 저장할 수 있는 최대 고객의 수static final int MAX = 100;// 고객정보를 저장할 변수를 배열로 선언static String[] nameList = new String[MAX];// 이름 저장static char[] genderList = new char[MAX];// 성별 저장static String[] emailList = new String[MAX];// 이메일 저장static int[] birthYearList = new int[MAX];// 출생년도 저장

// 배열은 인덱스를 필요로 함static int index = -1;// 배열은 0 부터 시작하므로 최초 인덱스는 -1 이어야 함

// 배열은 처음 선언한 크기보다 같거나 적은 개수의 자료를 저장 // 그래서 현재 데이터가 몇 개 저장되어있는 지 알 수 있는 변수 선언static int count = 0;// 개수

// 기본 입력장치로부터 데이터를 입력받기 위해 Scanner 객체 생성static Scanner scan = new Scanner(System.in);

110JavaSpecialist.co.kr

메뉴고객관리 프로그램

while(true) { System.out.printf("\n[INFO] 고객 수 : %d, 인덱스 : %d\n", count, index); System.out.println(" 메뉴를 입력하세요 ."); System.out.println("(I)nsert, (P)revious, (N)ext, (C)urrent, (U)pdate, (D)elete, (Q)uit"); System.out.print(" 메뉴 입력 : "); String menu = scan.next(); menu = menu.toLowerCase();// 입력한 문자열을 모두소문자로 변환 switch(menu.charAt(0)) { case 'i': System.out.println(" 고객정보 입력을 시작합니다 ."); break; case 'p' : System.out.println(" 이전 데이터를 출력합니다 ."); break; … case 'q' : System.out.println(" 프로그램을 종료합니다 ."); scan.close();//Scanner 객체를 닫아준다 . System.exit(0);// 프로그램을 종료시킨다 . default : System.out.println(" 메뉴를 잘 못 입력했습니다 ."); }//end switch}//end while

111JavaSpecialist.co.kr

입력고객관리 프로그램

public static void insertCustomerData() { System.out.print(" 이름 : "); String name = scan.next(); System.out.print(" 성별 (M/F) : "); char gender = scan.next().charAt(0); System.out.print(" 이메일 : "); String email = scan.next(); System.out.print(" 출생년도 : "); int birthYear = scan.nextInt();

// 고객 객체를 배열에 저장 nameList[count] = name; genderList[count] = gender; emailList[count] = email; birthYearList[count] = birthYear; count++; //count 번째 배열에 객체 저장 후 count 값을 증가시켜야 함}

112JavaSpecialist.co.kr

출력고객관리 프로그램

113JavaSpecialist.co.kr

수정고객관리 프로그램

114JavaSpecialist.co.kr

삭제고객관리 프로그램

07 객체와 클래스1. 객체와 클래스2. 패키지 (package)

Chapter

1. 객체와 클래스

117JavaSpecialist.co.kr

객체와 클래스의 정의1. 객체와 클래스

• 클래스 : 객체를 만들기 위한 틀• 객체 : 클래스의 인스턴스• 객체의 명사적 특성 : 데이터 , 변수 (Variable), 필드 (Field), 속성 (Attribute)• 객체의 동사적 특성 : 행위 (Behavior), 메서드 (Method), 기능 (Operation)

Instance Object

Class

118JavaSpecialist.co.kr

클래스1. 객체와 클래스

119JavaSpecialist.co.kr

멤버 변수 선언1. 객체와 클래스

120JavaSpecialist.co.kr

메서드 선언1. 객체와 클래스

121JavaSpecialist.co.kr

메서드 선언1. 객체와 클래스

122JavaSpecialist.co.kr

멤버변수와 지역변수1. 객체와 클래스

• 멤버변수 (Member Variable)• 클래스 안에서 선언 된 변수• 객체를 생성할 때 각 데이터 타입의 기본 값으로 자동 초기화• 기본 값 : 정수형 0, 부동소수점형 0.0, 논리형 false, 객체 null

• 지역변수 (Local Variable)• Automatic variable• 메서드 안에서 선언된 변수• 사용하기 전에 반드시 초기화 해야 함

123JavaSpecialist.co.kr

멤버변수와 지역변수1. 객체와 클래스

124JavaSpecialist.co.kr

생성자 선언 및 사용1. 객체와 클래스

125JavaSpecialist.co.kr

객체 추상화1. 객체와 클래스

• 실 객체를 클래스로 만드는 과정을 객체 추상화라 부름

• 객체• 기능을 위한 객체• 데이터 저장을 위한 객체

• Account( 은행계좌 )• 명사 ( 속성 ) : 계좌명 , 계좌번호 , 비밀번호 , 잔액 , 이자

• 동사 ( 기능 ) : 예금하다 , 출금하다 , 잔액을 조회하다 .

126JavaSpecialist.co.kr

2. 패키지

127JavaSpecialist.co.kr

패키지2. 패키지

서로 연관된 클래스들의 묶음을 패키지 (Package)

특정 패키지 안의 클래스를 사용하겠다 .

클래스 선언 전에 import 선언 , 맨 위에는 package 선언

128JavaSpecialist.co.kr

Import static2. 패키지

static 메서드를 사용할 때 클래스 이름 또는 객체 이름 없이 메서드 이름만으로 사용할 수 있도록 import 문이 개선

129JavaSpecialist.co.kr

package 선언2. 패키지

• 패키지 이름은 영문 소문자를 이용하는 것을 권장• 대분류 와 소분류 패키지들의 구분은 .(dot) 이용• 루트 패키지 패키지 이름은 java. 으로 시작할 수

없음 • 자바의 키워드들도 패키지로 사용할 수 없음

패키지 컴파일

실행 시 패키지이름을 포함해야 함

08 객체지향 프로그래밍

Chapter

1. 은닉 (Encapsulation)2. 상속 (Inheritance)3. 접근 제한자 (Access Modifier)4. 다형성 (Polymorphism)5. static modifier6. final modifier7. abstract Modifier8. 기타 Modifier9. 인터페이스 (Interface)

131JavaSpecialist.co.kr

객체지향프로그래밍객체지향프로그래밍

3. 다형성(Polymorphism)

객체지향 프로그램(OOP)

1. 은닉(Encapsulation)

2. 상속(Inheritance)

132JavaSpecialist.co.kr

1. 은닉

133JavaSpecialist.co.kr

은닉 (Encapsulation)1. 은닉 (Encapsulation)

public - 어디서든지protected – 같은 패키지 , 상속관계friendly( 공백 ) – 같은 패키지private – 같은 클래스

OO 의 특징 중 하나변수를 외부에서 직접 접근 X메서드를 통해서 변수의 값을 변경 /참조왜 ?

잘못된 값 (데이터 ) 이 변수의 값으로 되는 것을 방지

class Cat{int size;

}Cat myCat = new Cat();

myCat.size = -10;권한이 없는 사용자에 의한 데이터 접근 방지

어떻게 ?변수 선언 앞에 private메서드 선언 앞에는 public

setter, mutatorgetter, accessor

134JavaSpecialist.co.kr

은닉 - Badcase1. 은닉 (Encapsulation)

135JavaSpecialist.co.kr

은닉 – 개선된 클래스1. 은닉 (Encapsulation)

136JavaSpecialist.co.kr

2. 상속

137JavaSpecialist.co.kr

상속 (Inheritance)2. 상속 (Inheritance)

Student Teacher Employee

이름나이학번학과

이름나이교번담당과목

이름나이사번담당부서

Student Teacher Employee학번학과

교번담당과목

사번담당부서

Person 이름나이

• 단일상속만 가능• 인터페이스 (interface) 로 단일상속 단점 해결• Object(.toString(), hashCode(), equals()) 는 최상위 클래스• extends 키워드 이용하여 상속을 표현• 부모의 멤버 ( 변수 , 메서드 ) 를 자식클래스에서 사용

가능• 생성자는 상속이 안됨• Sub Class is a Super Class

• ex) 말 extends 포유류 --> 말 is a 포유류• has a 관계는 ?

• 객체가 멤버를 가지고 있다 .• class NameCard {

String name; int size;}

• NameCard has a name• final 클래스는 상속 불가• abstract 클래스는 반드시 상속해서 사용

138JavaSpecialist.co.kr

Bad Case & Good Case2. 상속 (Inheritance)

• Bad Case• 개별 클래스들에 중복된 속성 / 기능을 포함

• Good Case• 중복된 기능을 빼내 새로운 클래스로 작성한 후 구체화시킴• 일반화 된 클래스는 부모클래스• 구체화 된 클래스는 자식클래스• extends 키워드를 사용• 예제 클래스

• class Person{}• class Student extends Person{ }• class Teacher extends Person{ }• class Employee extends Person{ }

139JavaSpecialist.co.kr

메서드 재정의 (Overriding)2. 상속 (Inheritance)

• 부모클래스로부터 상속받은 메서드를 자식 클래스에서 행위를 바꾸거나 보완하기 위해 다시 정의해서 사용 하는 것

• 재정의 규칙• 상속 전재• 리턴타입 , 메서드 이름 , 파라미터 변수 선언이

일치해야 함• 접근제한자는 같거나 more public 해야 함

140JavaSpecialist.co.kr

this 와 super2. 상속 (Inheritance)

• super 는 현재 객체의 부모 객체 , 한 단계 위 부모를 의미함

• super.• 부모의 변수 또는 메서드를 참조• super.name• super.go()

• super()• 부모의 생성자를 참조• super();• super(10, 20);• super("hello");

• this 는 현재 객체 ( 자기 자신 )• this.

• 변수 또는 메서드를 참조• this.name• this.go()

• this()• 자기 자신 클래스 내의 다른 생성자를 참조

• this();• this("hello");

* 생성자 안에 this(), super() 생략시 자동으로 super() 삽입 됨

141JavaSpecialist.co.kr

this 와 super2. 상속 (Inheritance)

142JavaSpecialist.co.kr

3. 접근 제한자

143JavaSpecialist.co.kr

접근제한자3. 접근 제한자

접근제한자는 클래스와 클래스 변수 , 메서드 , 생성자 등의 접근을 제어할 수 있는 제한자

public, private, protected 와 접근제한자를 붙이지 않았을 경우에 해당하는 package friendly

144JavaSpecialist.co.kr

접근제한자3. 접근 제한자

com.abc패키지

Animal

com.xyzmain( ) Dog

Fish

Animal+ String name# int age String color- String kind

getDetails()

+ public# protected~( 공백 ) package friendly - private

main( )

name : com.abc 의 모든 클래스 , 그 외 모든 클래스에서 접근age : com.abc 의 모든 클래스에서 접근 가능 , 패키지가 다른 경우 접근 못함 단 상속관계가 있을 경우 예외 com.xyz.Dog 에서 접근 가능color : com.abc 의 모든 클래스에서 접근 가능 , 패키지 다른 경우 절대 접근 못함kind : Animal 클래스 안에서 만 참조 가능

145JavaSpecialist.co.kr

접근제한자3. 접근 제한자

146JavaSpecialist.co.kr

4. 다형성다형적 객체

Virtual Method Invocation이종모음 (Heterogeneous collection)

Wrapper class다형적 인자

instanceof중복 (Overloading)

static variablestatic method

static initializerstatic 정리

instance initializerSingleton Design Pattern

147JavaSpecialist.co.kr

다형적 객체4. 다형성

• Person 타입 변수 p 는 Person 클래스의 하위 타입 객체를 가질 수 있다 .

• 다형성은 상속을 전제로 함

148JavaSpecialist.co.kr

Virtual Method Invocation4. 다형성

• 다형적 객체로 메서드를 호출하면 자식 클래스의 재정의된 메서드를 호출한다 .

• 반드시 부모 클래스에 선언되어 있는 메서드만 호출 할 수 있다 .

149JavaSpecialist.co.kr

이종모음 (Heterogeneous collection)4. 다형성

• 다형성을 배열에 적용하면 배열이 다른 타입 객체를 가질 수 있다 .

150JavaSpecialist.co.kr

Wrapper class4. 다형성

Object[] objArr = new Object[5]; objArr[0] = s1; objArr[1] = p2; objArr[2] = new java.util.Date(); objArr[3] = new String("HelloWorld"); objArr[4] = 10; //1.4 까지 이것이 불가능 했다 .그래서 Wrapper class 를 통해 기본 데이터 타입을 참조 데이터 타입으로 변환해서 사용 했었음

151JavaSpecialist.co.kr

다형적 인자4. 다형성

• 파라미터와 리턴타입에도 다형성이 적용될 수 있다 .

152JavaSpecialist.co.kr

instanceof4. 다형성

• instanceof 는 키워드 ( 연산자 )임• 객체가 어떤 클래스의 타입인지 확인

153JavaSpecialist.co.kr

중복 (Overloading)4. 다형성

• 동일 클래스 내에서 같은 이름의 생성자 또는 메서드를 선언하는 것

• 규칙• 이름은 동일• 파라미터 개수 , 순서 , 타입이 반드시 달라야

한다 .• 리턴타입은 고려 안 함 .• 접근 제한자는 고려 안 함 .

• 예 ) println, print 메서드들

154JavaSpecialist.co.kr

5. static

155JavaSpecialist.co.kr

static variable5. static

• 객체 생성 없이 참조• 모든 객체가 같은 값을 가짐

156JavaSpecialist.co.kr

static method5. static

• 객체 생성 없이 참조• static 메서드 안에서 non-static 멤버 직접 참조 못함 ( 단 , 객체 생성을 통해 참조 가능함 )

• ++new Count().a; 는 가능

157JavaSpecialist.co.kr

static initializer5. static

• 생성자가 실행되기 전에 실행됨• static 변수 초기화에 사용• 객체를 여러 개 생성해도 한번만

실행

158JavaSpecialist.co.kr

static 정리5. static

• 변수 , 메서드 , static { }, 클래스에 사용• static 제한자는 지정된 변수와 메서드를 인스턴스와 무관하게 만들어 주기 때문에 this

를 가질 수 없다 .• static 메서드는 non-static 메서드로 재정의 (overriding) 될 수 없다 .• 변수

• 정적변수 , 여러개의 인스턴스가 모두 동일한 장소를 참조• final 과 같이 사용되어 상수가 됨 .• 객채 생성 없이 참조 가능

• 메서드• 객체 생성 없이 참조 ( 자주 사용하는 메서드들 )• Math 클래스의 메서드들• static 블럭에서는 non-static 멤버를 직접 참조 못한다 .• 객체를 생성해서도 가능

• static initializer• static {

}• 클래스가 로딩될 때 딱 ... 한번만 호출 , 생성자가 호출되기 전에

• 클래스• 내부 클래스 ( 클래스 안의 클래스 )

159JavaSpecialist.co.kr

instance initializer5. static

• 생성자가 호출되기 전에 호출됨• 인스턴스 변수 초기화에 사용• 생성자를 이용하여 인스턴스 변수 초기화가 가능하므로 사용할 기회가 많지

않음

160JavaSpecialist.co.kr

Singleton Design Pattern5. static

static 제한자와 private 제한자를 이용하여 클래스의 인스턴스가 오직 하나만 만들어 지도록 하는 프로그래밍 방법

161JavaSpecialist.co.kr

6. final

162JavaSpecialist.co.kr

final class & final method6. final

final public class Parent{ public final void method(){ System.out.println("Parent - method()"); }}

package exam.java.chapter03.final_;

public class Child extends Parent { //The type Child cannot subclass the final class Parent public void method(){ System.out.println("Parent - method()"); }}

상속 불가

재정의 불가

163JavaSpecialist.co.kr

final variable6. final

public class FinalRefVarExample { static final MyDate date = new MyDate();

public static void main(String[] args){// date = new MyDate(); //Error date.year = 2012; System.out.println( date.toString() ); }}

class MyDate { int year = 2000; int month = 1; int day = 1; public String toString() { return "[" + year + "-" + month + "-" + day + "]"; } public void doIt(final int a) {// a++; //Error }}

164JavaSpecialist.co.kr

final local variable6. final

public class FinalLocalVarExample {

public int data = 100; public static void main(String[] args) { new FinalLocalVarExample().doIt("홍길동 "); }

public void doIt(final String name) { final int age = 38; class InnerLocal { public void innerDoIt() { System.out.println(" 외부클래스의 멤버변수 data : " + data); System.out.println(" 외부클래스의 파라미터 변수 name : " + name); System.out.println(" 외부클래스의 지역변수 age : " + age); } } new InnerLocal().innerDoIt(); }}

165JavaSpecialist.co.kr

final member field 초기화6. final

final 멤버변수는 선언시 (a), 초기화자 (b), 또는 기본생성자 (c) 중 하나에서 반드시 초기화 해야 함기본생성자가 아닌 생성자에서 파라미터를 통한 초기화는 안 됨

public class FinalInitExample { public static void main(String[] args) { FinalInit f = new FinalInit(30); }}

class FinalInit { final int a = 10; //a// {// a = 10; //b// } FinalInit() { //c// a = 10; } FinalInit(int a) { this.a = a; // 이것은 final 필드의 초기화가 아님 }}

166JavaSpecialist.co.kr

final6. final

• 클래스 , 변수 , 메서드에 사용• 클래스

• 상속불가능 , 인스턴스를 생성 사용• String

• 변수• 상수정의• static 따라다님• 로컬 클래스의 메서드에서 지역변수를 참조해야 할 경우 지역변수에 final 을 붙여야 함

• 메서드• 재정의 불가능하게 함

167JavaSpecialist.co.kr

7. abstract

168JavaSpecialist.co.kr

abstract7. abstract

• 클래스 , 메서드에 사용

• 클래스

• 객체를 생성할 수 없다 .

• 추상 클래스

• 반드시 상속을 받아서 사용하도록 한다 .

• 메서드

• 추상 메서드

• 메서드 구현부분이 없다 .

• 추상메서드를 하나라도 포함하는 클래스는 추상클래스가 되어야

한다 . 그러나 추상클래스가 반드시 추상메서드를 가질 필요는 없

다 .

169JavaSpecialist.co.kr

abstract class7. abstract

170JavaSpecialist.co.kr

8. 기타 제한자

171JavaSpecialist.co.kr

기타 제한자8. 기타 제한자

Modifier Classes Attributes Methods Constructors

Access

public O O O O

protected X내부 클래스는 사용가능 O O O

friendly( 공백 ) O O O O

private X내부 클래스는 사용가능

OEncapsulation - 은닉에 사용

O클래스 안에서만 사용할 때

OSingleton Design

Pattern

Usage

abstractO

객체를 생성 못함 , 상속 가능

X Obody 는 구현 않고 선언만 함 X

static XO

공유변수 , 객체 생성 없이 참조

O객체 생성 없이 참조 가능 X

finalO

객체 생성 가능 , 상속은 불가능

O상수 선언 , static 과 같이

사용

Ofinal 메서드는 재정의 안됨 O

transient XO

객체 직렬화에 사용 X X

synchronized X X O쓰레드 동기화에 사용됨 X

volatile XO

비동기적으로 변경 가능하게 함

X X

native X XO

선언만하고 구현은 타 언어로

X

172JavaSpecialist.co.kr

9. 인터페이스

173JavaSpecialist.co.kr

인터페이스 선언9. 인터페이스

인터페이스는 서로 주고받는 표준을 정의

174JavaSpecialist.co.kr

인터페이스 사용9. 인터페이스

175JavaSpecialist.co.kr

인터페이스 사용9. 인터페이스

176JavaSpecialist.co.kr

인터페이스의멤버9. 인터페이스

• 인터페이스 내의 변수는 public static final 로 선언 됨• 메서드는 body 가 없 어야 하며 public abstract 로

선언 됨

177JavaSpecialist.co.kr

인터페이스 다중상속9. 인터페이스

• 인터페이스끼리 다중상속 가능• 가장 하위 인터페이스를 구현할 경우 상속관계에 있는 인터페이스들의 모든 메서드를 구현해야 함

178JavaSpecialist.co.kr

interface9. 인터페이스

기능의 명세를 위해 사용합니다 .

• 단일상속 문제점을 해결할 수 있다 .• interface Pet {

}• 인터페이스의 메서드는 추상메서드이어야 함

• public abstract void play( );• 인터페이스의 변수는 자동으로 상수가 됨

• public static final int NUMBER = 10;• 인터페이스를 구현할 때는 implements

• class Dog implements Pet { }• 인터페이스를 여러 개 implements 할 수 있다 .• 인터페이스는 다른 인터페이스를 여러 개 extends 할 수

있다 .

179JavaSpecialist.co.kr

미션9. 인터페이스

(도형 ) 삼각형 , 사각형 , 원의 넓이를 계산하고 출력하는 어플리케이션을 작성해야 합니다 .(각 도형은 도형의 ) 모양에 따라 이름을 가지고 있고 , 도형의 특징에 따라 사각형은 너비와 높이 , 삼각형은 밑면의 길이와 높이 , 원은 반지름 정보를 저장해야 합니다 .각 도형은 면적을 계산하여 출력하는 기능을 가지고 있어야 합니다 .

명사도형 , 삼각형 , 사각형 , 원 , 너비 , 높이 , 반지름Is 관계 ( 클래스 )

삼각형은 도형이다 .사각형은 도형이다 .원은 도형이다 .

Has a 관계 ( 클래스와 멤버 )사각형은 너비와 높이를 갖는다 .삼각형은 너비 높이를 갖는다 .원은 반지름을 갖는다도형은 도형의 이름을 갖는다 .

동사 ( 메서드 )면적을 계산하다 .면적을 출력하다 .너비 , 높이 , 반지름 정보를 저장하다 .

180JavaSpecialist.co.kr

클래스 다이어그램9. 인터페이스

181JavaSpecialist.co.kr

Shape9. 인터페이스

public abstract class Shape {

private String name;

public Shape(String name) { super(); this.name = name; }

public String getName() { return name; }

public void setName(String name) { this.name = name; }

public abstract double calcArea();}

182JavaSpecialist.co.kr

Rectangle9. 인터페이스

public class Rectangle extends Shape { private int width; private int height;

public Rectangle(String name, int width, int height) { super(name); this.width = width; this.height = height; }

public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; }

public double calcArea() { return getWidth()*getHeight(); }}

183JavaSpecialist.co.kr

Circle9. 인터페이스

public class Circle extends Shape {

private static final double PI = 3.141592; private int radius;

public Circle(String name, int radius) { super(name); this.radius = radius; }

public int getRadius() { return radius; }

public void setRadius(int radius) { this.radius = radius; }

public double calcArea() { return PI*radius*radius; }}

184JavaSpecialist.co.kr

ShapeApplication9. 인터페이스

public class ShapeApplication {

public static void main(String[] args) {// Shape myShape = new Shape(); Circle myCircle = new Circle(" 동그라미 ", 9); System.out.println(myCircle.calcArea()); Shape myShape = new Rectangle(" 네모 ", 3, 2); //polymorphic object// Virtual Method Invocation System.out.println(" 사각형 넓이는 " + myShape.calcArea()); myShape = myCircle; System.out.println(" 원의 넓이는 " + myShape.calcArea());// Heterogeneous collection Shape[] shapes = new Shape[2]; shapes[0] = myCircle; shapes[1] = new Rectangle(" 직사각형 ", 5, 4); Object[] objs = new Object[3]; objs[0] = "Hello"; objs[1] = myCircle; objs[2] = 100; Shape shapeObject = (Shape)objs[1]; System.out.println(shapeObject.calcArea()); }}

09 내부클래스1. 내부 클래스 (Inner class)2. 내부 클래스 (Inner class) 의 사용

Chapter

186JavaSpecialist.co.kr

내부 클래스 (Inner class) 종류1. 내부클래스

• 클래스 안의 클래스• Member 클래스 : 클래스 안에 클래스를 정의

• class Outer { class Inner { }}

• Outer$Inner.class• Local 클래스 : 메서드 안에 클래스를 정의

• class Outer { void doIt() { class Inner { } }}

• Outer$1$Inner.class• Anonymous 클래스 : 메서드 인자값으로 클래스 정의와 동시에 객체 생성 사용

• class Outer { void doIt() { callBack(new ActionListener() { public void actionPerformed(ActionEvent e) { ... } }); }}

• Outer$1.class

187JavaSpecialist.co.kr

내부클래스의 사용2. 내부클래스의 사용

• 별도의 클래스에서 내부클래스 참조• Outer2 out = new Outer2();

• // 내부클래스를 포함하는 외부클래스 인스턴스 생성• Outer2.MyInner2 in = out.new MyInner2();

• // 외부클래스의 인스턴스를 통해 내부클래스 객체 생성

• 내부클래스에서 변수 참조• 로컬 클래스의 메서드에서 외부클래스의 지역변수를 참조하기

위해서는 final 로 선언되어야 함

188JavaSpecialist.co.kr

로컬클래스와 로컬변수2. 내부클래스의 사용

로컬변수는 로컬클래스에서 값을 저장해서 사용하더라도 나중에 값이 변경될 수 있으며 메서드 실행이 끝나면 사라집니다 .

그러나 로컬 클래스는 final 로컬변수가 절대로 바뀌지 않는 다는 것을 알기 때문에 내부클래스에서도 그 상수를 그대로 저장해서 사용할 수 있게 하였습니다 .

public class InnerLocalExample2 {

public static void main(String[] args) { new InnerLocalExample2().doIt(10); new InnerLocalExample2().doIt(100); }

public void doIt(final int data) { class EventHandler { void callBack() { int sum=0; System.out.println(" 이벤트 실행 : " + data); for(int i=1; i<=data; i++) { sum = sum + i; } System.out.println(data +"까지의 합은 " + sum); } }//end inner local class new EventHandler().callBack(); }//end doIt()}//end class

10 예외처리1. 예외 처리2. Assertion

Chapter

190JavaSpecialist.co.kr

1. Exception

191JavaSpecialist.co.kr

예외 (Exception)1. Exception

• 예외는… mild 한 error• 처리방법

• try~catch~finally• 예외의 원인이 현재 실행되는 블록에 있을 경우• 직접 예외를 처리함• try {

// 예외가 발생할 가능성이 있는 코드}catch(Exception e) {

// 예외가 발생했을 때 실행할 코드}finally {

//반드시 실행해야 할 코드// 자원 반납

}• throws

• 예외의 원인이 그 메서드를 호출하는 호출자에게 있을 경우• 예외발생시 예외가 발생했음을 메서드 호출자에게 통지해줌• 메서드 선언부에 throws 절 사용

• 사용자 정의 예외• Exception 또는 그 하위 예외 클래스를 상속받아 구현 함

• 예외를 발생시키고 싶을 때• throw

192JavaSpecialist.co.kr

예외 (Exception)1. Exception

• checked exception• 반드시 예외 처리를 해줘야 컴파일이 수행됨• unchecked exception 을 제외한 모든 예외들 ...

• unchecked exception• 예외처리 하지 않아도 컴파일 수행됨 .• 실행 시 예외 발생하면 프로그램 비정상 종료될 가능성

있음• RuntimeException 과 그 하위 예외 클래스들 ...

193JavaSpecialist.co.kr

throws 와 try~catch1. Exception

import java.io.*;

public class ExceptionExample { public static void main(String[] args) { read(); String fileName = "abc.txt"; try { read(fileName); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }/*catch 블록을 catch(FileNotFoundException | IOException e) 으로 할수도 있지만 두 예외가 상속관계가 있으면 안된다 . 그래서 이 예제에서는 멀티케치 사용할 수 없다 .*/ }//end main

public static void read(String fileName) throws IOException, FileNotFoundException { FileReader in = new FileReader(fileName); BufferedReader br = new BufferedReader(in); System.out.println(br.readLine()); }

public static void read() { String fileName = "abc1.txt"; try { FileReader in = new FileReader(fileName); BufferedReader br = new BufferedReader(in); System.out.println(br.readLine()); } catch (FileNotFoundException fe) {// fe.printStackTrace(); System.out.println(" 파일이 존재하지 않습니다 ."); } catch (IOException ioe) {// ioe.printStackTrace(); System.out.println(" 예기치 않은 예외입니다 ."); } }}//end class

194JavaSpecialist.co.kr

사용자정의 예외와 throw1. Exception

public class MemberDAO { public void insert(MemberVO member) throws DuplicateKeyException { System.out.println(" 고객정보를 저장합니다 ."); System.out.println(member.name +"님의 정보 "); // 디비에 홍길동 /011-234-5678 정보가 있다고 치고 if("홍길동 ".equals(member.name) && "011-234-5678".equals(member.phone)) { // 이 경우에는 디비에 이미 정보가 있는 경우입니다 . // 예외를 발생시켜 insert 메서드를 호출한 곳으로 //데이터가 중복됨을 알려줘야 합니다 . // 예외를 강제로 발생시킴 throw new DuplicateKeyException("데이터가 중복됩니다 ."); }else { System.out.println("데이터베이스 저장되었습니다 ."); } }}

// 사용자 정의 예외class DuplicateKeyException extends Exception { DuplicateKeyException(String message) { super(message); }}

class MemberVO { String name; String phone; String address; MemberVO(String name, String phone, String address) { this.name = name; this.phone = phone; this.address = address; }}

195JavaSpecialist.co.kr

2. Assertion

196JavaSpecialist.co.kr

Assertion2. Assertion

JDK 1.4 버전에 추가에러가 없는 프로그램을 작성하기 위한 하나의 기술assert Expression1 ;assert Expression1 : Expression2 ;

Expression2 는 메시지임컴파일

javac -source 1.4 FileName.java실행

java -ea FileName

선행 조건은 예외처리로…유스케이스의 수행이 시작되기 위하여 필요한 조건을 뜻한다 .선행조건이 만족하지 않으면 유스케이스의 동작이 시작되지 않음을 의미한다 .

후행 조건은 Assertion 으로유스케이스의 수행이 완료된 후에 만족되어야 하는 조건을 뜻한다 .해당 유스케이스의 정상 동작에 대한 최소한의 판단 기준이 될 수 있다 .만약 이 조건이 만족되지 않으면 시스템이 정상적으로 동작했다고 판단하기 어렵다 .그러나 후행 조건이 충족되었다고 유스케이스가 올바르게 수행되었다고 판단할 수는 없다 .

197JavaSpecialist.co.kr

assert 예2. Assertion

public class AssertionExample { public static void main(String[] args) { int i = (int)(Math.random() * 4) + 1;//1,2,3,4 값이 랜덤하게 발생됨 try { System.out.println("넘어온 값 : " + doIt(i)); }catch(AssertionError ae) { System.out.println("데이터를 확인하세요 . " + ae.getMessage()); } } public static int doIt(int a) { switch(a) { case 1: System.out.println("1 이 입력되었습니다 ."); break; case 2: System.out.println("2 가 입력되었습니다 ."); break; case 3: System.out.println("3 이 입력되었습니다 ."); break; default: assert false : a;// throw new AssertionError(a); } return a; }}

11 Collection Framework1. Collection Framework2. 객체 비교3. 제네릭과 형 안정성 (Generic & Type Safety) 4. Typesafe enum5. Varargs(Variable-length arguments)

Chapter

199JavaSpecialist.co.kr

1. Collection Framework

200JavaSpecialist.co.kr

Collection 프레임워크1. Collection Framework

• Collection 인터페이스의 하위 클래스들• Set 계열

• Set 인터페이스를 구현한 클래스들• 순서 X, 중복 허용 X• HashSet, TreeSet

• List 계열• List 인터페이스를 구현한 클래스들• 순서 O, 중복 허용 O• ArrayList, LinkedList

• Map 계열• Map 인터페이스를 구현한 클래스들• MashMap, TreeMap

201JavaSpecialist.co.kr

Collection 인터페이스의 주요 메서드1. Collection Framework

202JavaSpecialist.co.kr

Set 인터페이스의 주요 메서드1. Collection Framework

203JavaSpecialist.co.kr

1. Collection Framework

204JavaSpecialist.co.kr

Tree 자료구조1. Collection Framework

• 트리 구조 (tree,  나무구조 )

• 그래프의 일종

• 여러 노드가 한 노드를 가리킬 수 없는 구조

• 간단하게는 회로가 없고 , 서로 다른 두 노드를

잇는 길이 하나뿐인 그래프

• 트리에서 최상위 노드를 루트 노드 (root node 뿌리

노드 )

• 노드 A 가 노드 B 를 가리킬 때 A 를 B 의 부모

노드 (parent node), B 를 A 의 자식 노드 (child node

)

• 자식 노드가 없는 노드를 잎 노드 (leaf node  리프

노드 )

• 잎 노드가 아닌 노드를 내부 노드 (internal node)

205JavaSpecialist.co.kr

TreeSet1. Collection Framework

206JavaSpecialist.co.kr

List 인터페이스의 주요 메서드1. Collection Framework

207JavaSpecialist.co.kr

ArrayList1. Collection Framework

208JavaSpecialist.co.kr

LinkedList1. Collection Framework

209JavaSpecialist.co.kr

Map 인터페이스의 주요 메서드1. Collection Framework

210JavaSpecialist.co.kr

HashMap1. Collection Framework

211JavaSpecialist.co.kr

TreeMap1. Collection Framework

212JavaSpecialist.co.kr

HashSet add()/HashMap put() 메서드1. Collection Framework

HashSet.javapublic boolean add(E e) {

return map.put(e, PRESENT)==null;}HashMap.javapublic V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } }

modCount++; addEntry(hash, key, value, i); return null;}

213JavaSpecialist.co.kr

TreeSet add()/TreeMap put() 메서드1. Collection Framework

==================================TreeSet.java==================================public boolean add(E e) { return m.put(e, PRESENT)==null;}

=====================================TreeMap.java=====================================public V put(K key, V value) { Entry<K,V> t = root; if (t == null) { compare(key, key); // type (and possibly null) check

root = new Entry<>(key, value, null); size = 1; modCount++; return null; } int cmp; Entry<K,V> parent; // split comparator and comparable paths Comparator<? super K> cpr = comparator;

if (cpr != null) { do { parent = t; cmp = cpr.compare(key, t.key); if (cmp < 0) t = t.left; else if (cmp > 0) t = t.right; else return t.setValue(value); } while (t != null); } else { if (key == null) throw new NullPointerException(); Comparable<? super K> k = (Comparable<? super K>) key; do { parent = t; cmp = k.compareTo(t.key); if (cmp < 0) t = t.left; else if (cmp > 0) t = t.right; else return t.setValue(value); } while (t != null); } Entry<K,V> e = new Entry<>(key, value, parent); if (cmp < 0) parent.left = e; else parent.right = e; fixAfterInsertion(e); size++; modCount++; return null;}

214JavaSpecialist.co.kr

Iterator1. Collection Framework

• Iteration : 컬렉션에 저장되어 있는 엘리먼트를 검색하는 절차

• Iterator 인터페이스 : 컬렉션에 저장된 엘리먼트를 순차적으로 하나씩 접근하고자 할

때 사

• Set 계열 : Collection 인터페이스에 정의된 iterator() 메서드를 통하여 Iterator 객체 를

반환 받아 사용

• List 계열 : listIterator() 메서드를 통해 ListIterator 객체를 반환 받아 사용

• Iterator 인터페이스의 주요 메서드

• boolean hasNext()

• E next()

• void remove()

215JavaSpecialist.co.kr

Iterator1. Collection Framework

216JavaSpecialist.co.kr

2. 객체 비교

217JavaSpecialist.co.kr

hashCode(), equals() 를 이용한 객체 동등비교2. 객체 비교

• public boolean equals(Object obj)• public int hashCode()

218JavaSpecialist.co.kr

크기비교2. 객체 비교

ComparableCollections.sort() 사용시TreeSet 기본 생성자 사용시compareTo() 재정의기본 정렬 기준 구현

ComparatorTreeSet 에 add 할 때 내가 원하는 방식으로 정렬되게 할 때TreeSet(Comparator 객체 ) 생성자 사용compare() 메서드 재정의추가 정렬 기준 구현

219JavaSpecialist.co.kr

Comparable 인터페이스 구현2. 객체 비교

220JavaSpecialist.co.kr

Comparator 인터페이스 구현2. 객체 비교

221JavaSpecialist.co.kr

JDK 1.1 이전의 Collections

222JavaSpecialist.co.kr

3. 제네릭과 형 안정성

223JavaSpecialist.co.kr

제네릭과 형 안정성3. 제네릭과 형 안정성

엘리먼트에 원하는 데이터 타입만 들어가도록 함엘리먼트를 반환 받을 때 형변환 하지 않아도 됨ArrayList myList = new ArrayList(); //jdk.1.4까지 사용ArrayList<String> myList = new ArrayList<String>(); //jdk 1.5 부터 가능ArrayList<String> myList = new ArrayList<>(); //jdk 1.7 부터 가능

public interface Comparator { // 제네릭 사용 전 int compare(Object o1, Object o2);}public class PenComparator implements Comparator { int compare(Object o1, Object o2) { //o1 과 o2 를 형변환 해야 함 //o1 객체의 멤버와 o2 객체의 멤버 비교 값 리턴 ; }}

public interface Comparator<T> { // 제네릭 사용 후 int compare(T o1, T o2);}public class PenComparator implements Comparator<Pen> { int compare(Pen o1, Pen o2) { //o1 객체의 멤버와 o2 객체의 멤버 비교 값 리턴 ; }}

224JavaSpecialist.co.kr

제네릭 클래스 (generic class)3. 제네릭과 형 안정성

225JavaSpecialist.co.kr

제네릭 클래스 (generic class)3. 제네릭과 형 안정성

226JavaSpecialist.co.kr

제네릭메서드 (generic method)3. 제네릭과 형 안정성

227JavaSpecialist.co.kr

4. Typesafe enum

228JavaSpecialist.co.kr

enum4. Typesafe enum

229JavaSpecialist.co.kr

enum4. Typesafe enum

230JavaSpecialist.co.kr

"Hidden" 정적 메서드4. Typesafe enum

• values() : enum 에 가능한 모든 값의 배열을 반환• valueOf() : 제공된 문자열에 대한 enum 을 반환

231JavaSpecialist.co.kr

열거데이터의 매핑4. Typesafe enum

메서드를 갖는 enum enum 추상 메서드 생성자를 갖는 enum

232JavaSpecialist.co.kr

5. 가변인자

233JavaSpecialist.co.kr

가변인자 (…)5. 가변인자

234JavaSpecialist.co.kr

12 고객관리 프로그램 II

Chapter

235JavaSpecialist.co.kr

요구사항고객관리 프로그램 II

고객의 정보는 이름 , 성별 , 이메일 , 출생년도가 있습니다 . 고객의 정보를 입력

받아 리스트 (List) 에 저장해야 합니다 . 이름은 문자열로 저장하며 , 성별은

남자는 M, 여자는 F 로 저장합니다 . 이메일은 문자열로 저장하며 태어난

연도는 정수로 저장합니다 .

고객 관리 프로그램은 고객의 정보를 저장 , 조회 , 수정 , 삭제할 수 있는 기능이

있어야 합니다 . 고객 정보를 파일에 저장하는 기능을 구현하지 않아도 됩니다 .

I 를 눌러 고객의 정보를 입력 받도록 하며 , 저장된 고객 정보는 P 또는 N 을

눌러 이전 고객정보 또는 다음 고객정보를 조회할 수 있어야 합니다 . 조회한

고객 정보는 U 를 눌러 새로운 정보로 수정할 수 있어야 합니다 . D 를 누르면

조회한 고객 정보를 배열에서 삭제해야 합니다 . 프로그램의 종료는 Q 를

누릅니다 .

객체지향 개념을 적용하여 확장성을 고려한 애플리케이션이 되도록 해야 합니

다 .

236JavaSpecialist.co.kr

Customer & CustomerManager고객관리 프로그램 II

Model class View & Controller class

237JavaSpecialist.co.kr

ArrayList 를 이용한데이터 관리고객관리 프로그램 II

static ArrayList<Customer> custList = new ArrayList<>();

고객정보 추가 : custList.add(cust);

고객정보 삭제 : custList.remove(index);

고객정보 조회 : Customer cust = custList.get(index);

238JavaSpecialist.co.kr

13 IO Programming1. 스트림2. 입 / 출력 클래스3. 입 / 출력과 관련된 클래스들4. 객체 직렬화

Chapter

239JavaSpecialist.co.kr

1. 스트림

240JavaSpecialist.co.kr

Stream 클래스1. 스트림

241JavaSpecialist.co.kr

FileReader1. 스트림

242JavaSpecialist.co.kr

파일로부터데이터읽기1. 스트림

char[] buffer = new char[100];int readCount = input.read(buffer);

0x12345687

0x12345687

stack heap

buffer

read()

read 메서드는 파일로부터 읽은 데이터를 buffer 라는 배열에 저장한다 .

cbuf read() 메서드public int read(char[] cbuf) { … }

243JavaSpecialist.co.kr

파일에데이터쓰기1. 스트림

char[] buffer = new char[128];int readCount = input.read(buffer);

out.write(buffer, 0, readCount)

0x12345687

0x12345687

stack heap

buffer

read()

read 메서드는 파일로부터 읽은 데이터를 buffer 라는 배열에 저장한다 .

cbuf방금 읽은 데이터

직전에 읽은 데이터

244JavaSpecialist.co.kr

필터 스트림클래스2. 입 / 출력 클래스

Node streamNode stream Filter streamFilter streamnodenode readXxx()readXxx()

245JavaSpecialist.co.kr

BufferedReader1. 스트림

246JavaSpecialist.co.kr

스트림 클래스 생성자1. 스트림

247JavaSpecialist.co.kr

3. 입 / 출력 관련 클래스

248JavaSpecialist.co.kr

File 클래스3. 입 / 출력 관련 클래스

File : 로컬의 파일을 파일 참조 할 수 있는 객체

249JavaSpecialist.co.kr

URL3. 입 / 출력 관련 클래스

인터넷상에 있는 주소 (URL) 를 참조 할 수 있는 클래스

// 브라우저가 프락시서버를 사용하는 환경에서 실행 방법은//Run -> Run Configurations -> Arguments -> //VM Arguments -> -Dhttp.proxyHost=12.26.226.2 -Dhttp.proxyPort=8080

250JavaSpecialist.co.kr

RandomAccessFile3. 입 / 출력 관련 클래스

접근 모드 r 은 읽기 전용 , rw 는 읽기 쓰기 가능

파일의 임의 위치에 접근할 수 있는 클래스

251JavaSpecialist.co.kr

4. 객체 직렬화

252JavaSpecialist.co.kr

고객의 정보를 파일에 저장하는방법4. 객체 직렬화

1. byte 단위로 저장할 것인가 ? char 단위로 저장할 것인가 ?• byte 단위로 저장하려면 FileOutputStream/FileInputStream• char 단위로 저장하려면 FileWriter/FileReader

2. 어떤 형식으로 저장할 것인가 ?고객의 정보가 이름 , 주소 , 이메일 , 나이 가 있다고 가정했을 때단순 텍스트로 저장한다 .홍길동 , 서울 ,[email protected],30\n길남 , 부산 ,[email protected],25저장할 때 필드 구분자와 컬럼 구분자를 추가해야 하고 읽은 정보를 잘라서 형변환 해야 한다 . 범용적이지만 불편하다 .( 구분자를 이용한 문자열분리와 , 형변환 )

DataOutputStream 클래스를 이용해서 저장한다 .필드 구분자와 컬럼 구분자를 추가할 필요가 없다 .읽은 정보를 형변환 할 필요 없다 .단점 : Write 했던 순서대로 읽어야 한다 . 자바에서만 사용할 수 있다 .

객체 직렬화를 이용해서 저장한다 .직렬화 가능한 클래스여야 한다 .자바에서만 사용할 수 있다 .

253JavaSpecialist.co.kr

단순텍스트로쓰기4. 객체 직렬화

import java.io.FileOutputStream;

public class TextWriteApplication {

public static void main(String[] args) { String data1 = "홍길동 , 서울 ,[email protected],30"; String data2 = "길남 , 부산 ,[email protected],25"; // 필드구분자추가 FileOutputStream fos = null; try { fos = new FileOutputStream("member.txt"); fos.write(data1.getBytes()); fos.write('\n');// 레코드 구분자 추가 fos.write(data2.getBytes()); System.out.println("File saved"); }catch(Exception e) { System.out.println(e.getMessage()); }finally { if(fos!=null) try { fos.close(); } catch(Exception e) {} } }}

데이터의 필드와 레코드( 행 ) 구분자를 추가해 줘야 한다 .레코드 구분자 : 줄바꿈 기호 (\n)필드 구분자 : 콤마 (,)

254JavaSpecialist.co.kr

단순텍스트읽기4. 객체 직렬화

import java.io.*;public class TextReadApplication { public static void main(String[] args) { FileReader fr = null; BufferedReader br = null; try { fr = new FileReader("member.txt"); br = new BufferedReader(fr); String data = null; while( (data = br.readLine()) != null) { String[] member = data.split(","); int age = Integer.parseInt(member[3]); if(age >= 30) { System.out.println(data); } } }catch(Exception e) { System.out.println(e.getMessage()); }finally { if(br!=null) try { br.close(); } catch(Exception e) {} } }}

데이터의 행과 필드를 구분해서 읽고 형변환 해 줘야 한다 .

255JavaSpecialist.co.kr

DataOutputStream 으로쓰기4. 객체 직렬화

import java.io.DataOutputStream;import java.io.FileOutputStream;public class DataWriteApplication { public static void main(String[] args) { FileOutputStream fos = null; DataOutputStream dos = null; try { fos = new FileOutputStream("member.data"); dos = new DataOutputStream(fos); dos.writeUTF("홍길동 "); dos.writeUTF(" 서울 "); dos.writeUTF("[email protected]"); dos.writeInt(30); dos.writeUTF("길남 "); dos.writeUTF(" 부산 "); dos.writeUTF("[email protected]"); dos.writeInt(25); System.out.println("File Saved"); }catch(Exception e) { System.out.println(e.getMessage()); }finally { if(dos!=null) try { dos.close(); } catch(Exception e) {} } }}

필드 구분자나 레코드 구분자를 추가하지 않아도 된다 .

256JavaSpecialist.co.kr

DataInputStream 으로읽기4. 객체 직렬화

import java.io.*;public class DataReadApplication { public static void main(String[] args) { FileInputStream fis = null; DataInputStream dis = null; try { fis = new FileInputStream("member.data"); dis = new DataInputStream(fis); String name = null; while( (name = dis.readUTF()) != null ){ System.out.println(name); System.out.println(dis.readUTF()); System.out.println(dis.readUTF()); System.out.println(dis.readInt()); } }catch(Exception e) { System.out.println(e.getMessage()); }finally { if(dis!=null) try { dis.close(); } catch(Exception e) {} } }}

읽은 데이터를 자르고 형변환 하지 않아도 된다 . 그러나 write 한 순서대로 read 해야 한다 .

257JavaSpecialist.co.kr

객체직렬화4. 객체 직렬화

• Serializable 직렬화 클래스가 구현해야 할 인터페이스 마커 인터페이스임 객체 단위로 파일에 저장할 수 있도록 함

• 객체 저장 ObjectOutputStream 의 writeObject() 메서드 이용

• 객체 읽기 ObjectInputStream 의 readObject() 메서드 이용

• transient 객체 직렬화에서 제외할 변수에 선언

• serialVersionUID 직렬화 클래스 구조가 변경될 경우 불러오지 못하는 예외를 방지하기 위해

선언 private static final long serialVersionUID = 5296081940199618979L;

258JavaSpecialist.co.kr

객체직렬화 하기 – 데이터를 저장하는엔티티 클래스4. 객체 직렬화

import java.io.Serializable;

public class Member implements Serializable{

String name; String address; String email; int age;

public Member(String name, String address, String email, int age) { this.name = name; this.address = address; this.email = email; this.age = age; } @Override public String toString() { return "Member [name=" + name + ", address=" + address + ", email=" + email + ", age=" + age + "]"; }}

259JavaSpecialist.co.kr

객체직렬화 하기 – 객체직렬화 하여 저장하기4. 객체 직렬화

import java.io.*;public class ObjectWriteApplication { public static void main(String[] args) { FileOutputStream fos = null; ObjectOutputStream oos = null; try { fos = new FileOutputStream("member.ser"); oos = new ObjectOutputStream(fos); Member m1 = new Member("홍길동 ", " 서울 ", "[email protected]", 30); Member m2 = new Member("길남 ", " 부산 ", "[email protected]", 25); oos.writeObject(m1); oos.writeObject(m2); System.out.println("File Saved"); }catch(Exception e) { System.out.println(e.getMessage()); }finally { if(oos!=null) try { oos.close(); } catch(Exception e) {} } }}

엔티티 객체를 직접 파일시스템에 저장할 수 있다 . 컬렉션 객체에 저장되어 있을 경우에는 컬렉션 객체를 직렬화 할 수 있다 .

260JavaSpecialist.co.kr

객체직렬화 하기 – 객체직렬화 한데이터읽기4. 객체 직렬화

import java.io.FileInputStream;import java.io.ObjectInputStream;

public class ObjectReadApplication { public static void main(String[] args) { FileInputStream fis = null; ObjectInputStream ois = null; try { fis = new FileInputStream("member.ser"); ois = new ObjectInputStream(fis); Member m1 = (Member)ois.readObject(); Member m2 = (Member)ois.readObject(); System.out.println(m1); System.out.println(m2); }catch(Exception e) { System.out.println(e.getMessage()); }finally { if(ois!=null) try { ois.close(); } catch(Exception e) {} } }}

엔티티 객체를 직접 파일시스템에 저장할 수 있다 . 컬렉션 객체에 저장되어 있을 경우에는 컬렉션 객체를 직렬화 할 수 있다 .

261JavaSpecialist.co.kr

고객 정보 저장하기

고객의 정보를 관리하는 프로그램을 고객의 정보를 저장하도록 수정하겠습니다 .

객체 직렬화를 이용하여 ArrayList 객체를 파일에 저장한 다음 프로그램이

시작되면 파일에 저장되어 있는 정보를 로드하여 다시 조회 할 수 있도록 합니다 .

262JavaSpecialist.co.kr

14 기본 API 클래스1. 문자열 클래스2. 정규 표현식3. Object 클래스4. 날짜 클래스5. 지역과 시간대 클래스6. 형식화 클래스7. 수학관련 클래스

Chapter

263JavaSpecialist.co.kr

1. 문자열 클래스

264JavaSpecialist.co.kr

String, StringBuffer, StringBuilder1. 문자열 클래스

265JavaSpecialist.co.kr

StringTokenizer1. 문자열 클래스

문자열을 분리하기 위한 클래스

266JavaSpecialist.co.kr

split()1. 문자열 클래스

• 정규표현식을 이용 하여 문자열을 분리• JDK 1.4 부터 사용 가능

267JavaSpecialist.co.kr

2. 정규 표현식

268JavaSpecialist.co.kr

정규 표현식 기본 개념2. 정규 표현식

269JavaSpecialist.co.kr

확장 표준문법2. 정규 표현식

270JavaSpecialist.co.kr

Pattern & Matcher

271JavaSpecialist.co.kr

3. Object 클래스

272JavaSpecialist.co.kr

주요 메서드3. Object 클래스

273JavaSpecialist.co.kr

4. 날짜 클래스

274JavaSpecialist.co.kr

Date4. 날짜 클래스

275JavaSpecialist.co.kr

Calendar4. 날짜 클래스

276JavaSpecialist.co.kr

5. 지역과 시간대 클래스

277JavaSpecialist.co.kr

Locale5. 지역과 시간대 클래스

278JavaSpecialist.co.kr

Timezone5. 지역과 시간대 클래스

279JavaSpecialist.co.kr

6. 형식화 클래스

280JavaSpecialist.co.kr

DecimalFormat6. 형식화 클래스

281JavaSpecialist.co.kr

SimpleDateFormat6. 형식화 클래스

Asia/Seoul 타임존에서 한국표준시 2017 년 3 월 13 일 오후 10 시 16 분 55 초

282JavaSpecialist.co.kr

MessageFormat6. 형식화 클래스

283JavaSpecialist.co.kr

ChoiceFormat6. 형식화 클래스

ChoiceFormat 를 작성할 때는 제한 (limit) 배열과 형식 (format) 배열을 지정

284JavaSpecialist.co.kr

7. 수학관련 클래스

285JavaSpecialist.co.kr

Random7. 수학관련 클래스

난수를 발생시키기 위해서 사용

286JavaSpecialist.co.kr

Math7. 수학관련 클래스

지수 , 로그 , 제곱근 및 삼각함수와 같은 기본 숫자 연산을 수행하기 위한 메서드가 포함