SlideShare a Scribd company logo
1 of 286
Download to read offline
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
161 171 177 181 199
14
기본 API 클래
스
입출력 프로그래
밍
13
217
251
01 자바 개요
1. 자바 개요
2. Java SE
3. 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
HelloWorld
1.3. HelloWorld
1. public class HelloWorld { // 클래스 선언부
2.
3. public static void main(String[] args) {
4. System.out.println("Hello World"); //sysout 입력 후 Ctrl+SpaceBar
5. }
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 workspace
1.4. 이클립스를 이용한 개발
실행 시 프로젝트가 저장될 작업 공간 설정 D:Projectsworkspace 로 설정
첫 실행 화면
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
프로젝트 Perspective
1.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 Documents
2.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-45
F ~ 3.402e+38
F 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 null
All 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 type
homogeneous collection
immutable
배열 선언 ( 크기 명시 못함 )
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 array
3.2. 배열
52JavaSpecialist.co.kr
Reference type array
3.2. 배열
53JavaSpecialist.co.kr
Primitive Array & Reference Array
3.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;
arr
arr2
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
Lotto
3.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.0
float 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~case
5.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
while
5.2. 반복문
90JavaSpecialist.co.kr
do ~ while() ;
5.2. 반복문
91JavaSpecialist.co.kr
for
5.2. 반복문
92JavaSpecialist.co.kr
중첩 for 문
5.2. 반복문
93JavaSpecialist.co.kr
피라미드 출력하기
5.2. 반복문
나머지 예제들도 구현해 보세요 .
……
94JavaSpecialist.co.kr
피라미드 출력하기
5.2. 반복문
i j < dan-i 별
0 0
1
2
3
4
5 *****
1 0
1
2
3
4 ****
2 0
1
2
3 ***
3 0
1
2 **
4 0 1 *
i j > dan-i-1 별
0 5
4
3
2
1
0 *****
1 5
4
3
2
1 ****
2 5
4
3
2 ***
3 5
4
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
break
5.3. 탈출문
98JavaSpecialist.co.kr
continue
5.3. 탈출문
99JavaSpecialist.co.kr
Label 을 갖는 반복문
5.3. 탈출문
100JavaSpecialist.co.kr
return
5.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
Palindrome
5. 제어문
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, 인덱스 : %dn", 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 static
2. 패키지
static 메서드를 사용할 때 클래스 이름 또는 객체 이름 없이 메서드 이름만으로
사용할 수 있도록 import 문이 개선
129JavaSpecialist.co.kr
package 선언
2. 패키지
• 패키지 이름은 영문 소문자를 이용하는 것을 권장
• 대분류 와 소분류 패키지들의 구분은 .(dot) 이용
• 루트 패키지 패키지 이름은 java. 으로 시작할 수
없음
• 자바의 키워드들도 패키지로 사용할 수 없음
패키지 컴파일
실행 시 패키지이름을 포함해야 함
08 객체지향 프로그래밍
Chapter
1. 은닉 (Encapsulation)
2. 상속 (Inheritance)
3. 접근 제한자 (Access Modifier)
4. 다형성 (Polymorphism)
5. static modifier
6. final modifier
7. abstract Modifier
8. 기타 Modifier
9. 인터페이스 (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, mutator
getter, accessor
134JavaSpecialist.co.kr
은닉 - Badcase
1. 은닉 (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 Case
2. 상속 (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 와 super
2. 상속 (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 와 super
2. 상속 (Inheritance)
142JavaSpecialist.co.kr
3. 접근 제한자
143JavaSpecialist.co.kr
접근 제한자
3. 접근 제한자
접근제한자는 클래스와 클래스 변수 , 메서드 , 생성자 등의 접근을 제어할 수 있는 제
한자
public, private, protected 와 접근제한자를 붙이지 않았을 경우에 해당하는 package
friendly
144JavaSpecialist.co.kr
접근 제한자
3. 접근 제한자
com.abc
패키지
Animal
com.xyz
main( ) Dog
Fish
Animal
+ String name
# int age
String color
- String kind
getDetails()
+ public
# protected
~( 공백 ) package friendly
- privatemain( )
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 variable
static method
static initializer
static 정리
instance initializer
Singleton Design Pattern
147JavaSpecialist.co.kr
다형적 객체
4. 다형성
• Person 타입 변수 p 는 Person 클래
스의 하위 타입 객체를 가질 수 있다
.
• 다형성은 상속을 전제로 함
148JavaSpecialist.co.kr
Virtual Method Invocation
4. 다형성
• 다형적 객체로 메서드를 호출하면
자식 클래스의 재정의된 메서드를
호출한다 .
• 반드시 부모 클래스에 선언되어 있
는 메서드만 호출 할 수 있다 .
149JavaSpecialist.co.kr
이종모음 (Heterogeneous collection)
4. 다형성
• 다형성을 배열에 적용하면 배열이
다른 타입 객체를 가질 수 있다 .
150JavaSpecialist.co.kr
Wrapper class
4. 다형성
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
instanceof
4. 다형성
• instanceof 는 키워드 ( 연산자 ) 임
• 객체가 어떤 클래스의 타입인지 확
인
153JavaSpecialist.co.kr
중복 (Overloading)
4. 다형성
• 동일 클래스 내에서 같은 이름의 생성자 또는 메서드
를 선언하는 것
• 규칙
• 이름은 동일
• 파라미터 개수 , 순서 , 타입이 반드시 달라야 한
다 .
• 리턴타입은 고려 안 함 .
• 접근 제한자는 고려 안 함 .
• 예 ) println, print 메서드들
154JavaSpecialist.co.kr
5. static
155JavaSpecialist.co.kr
static variable
5. static
• 객체 생성 없이 참조
• 모든 객체가 같은 값을 가짐
156JavaSpecialist.co.kr
static method
5. static
• 객체 생성 없이 참조
• static 메서드 안에서 non-static 멤
버 직접 참조 못함 ( 단 , 객체 생성
을 통해 참조 가능함 )
• ++new Count().a; 는 가능
157JavaSpecialist.co.kr
static initializer
5. 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 initializer
5. static
• 생성자가 호출되기 전에 호출됨
• 인스턴스 변수 초기화에 사용
• 생성자를 이용하여 인스턴스 변수 초기화가 가능하므로 사용할 기회가 많지
않음
160JavaSpecialist.co.kr
Singleton Design Pattern
5. static
static 제한자와 private 제한자를 이용하여 클래스의 인스턴스가 오직 하나만 만들어 지도록 하는 프로그래밍
방법
161JavaSpecialist.co.kr
6. final
162JavaSpecialist.co.kr
final class & final method
6. 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 variable
6. 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 variable
6. 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
final
6. final
• 클래스 , 변수 , 메서드에 사용
• 클래스
• 상속불가능 , 인스턴스를 생성 사용
• String
• 변수
• 상수정의
• static 따라다님
• 로컬 클래스의 메서드에서 지역변수를 참조해
야 할 경우 지역변수에 final 을 붙여야 함
• 메서드
• 재정의 불가능하게 함
167JavaSpecialist.co.kr
7. abstract
168JavaSpecialist.co.kr
abstract
7. abstract
• 클래스 , 메서드에 사용
• 클래스
• 객체를 생성할 수 없다 .
• 추상 클래스
• 반드시 상속을 받아서 사용하도록 한다 .
• 메서드
• 추상 메서드
• 메서드 구현부분이 없다 .
• 추상메서드를 하나라도 포함하는 클래스는 추상클래스가 되어야 한
다 . 그러나 추상클래스가 반드시 추상메서드를 가질 필요는 없다 .
169JavaSpecialist.co.kr
abstract class
7. 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
내부 클래스는 사용가능
O
Encapsulation - 은닉에 사용
O
클래스 안에서만 사용할 때
O
Singleton Design
Pattern
Usage
abstract
O
객체를 생성 못함 , 상속 가
능
X
O
body 는 구현 않고 선언만 함
X
static X
O
공유변수 , 객체 생성 없이 참
조
O
객체 생성 없이 참조 가능
X
final
O
객체 생성 가능 , 상속은 불
가능
O
상수 선언 , static 과 같이 사
용
O
final 메서드는 재정의 안됨
O
transient
X
O
객체 직렬화에 사용
X X
synchronized X X
O
쓰레드 동기화에 사용됨
X
volatile X
O
비동기적으로 변경 가능하게
함
X X
native X X
O
선언만하고 구현은 타 언어
로
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
interface
9. 인터페이스
기능의 명세를 위해 사용합니다 .
• 단일상속 문제점을 해결할 수 있다 .
• 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
Shape
9. 인터페이스
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
Rectangle
9. 인터페이스
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
Circle
9. 인터페이스
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
ShapeApplication
9. 인터페이스
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~catch
1. 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
사용자정의 예외와 throw
1. 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
Assertion
2. 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 Framework
1. Collection Framework
2. 객체 비교
3. 제네릭과 형 안정성 (Generic & Type Safety)
4. Typesafe enum
5. 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
TreeSet
1. Collection Framework
206JavaSpecialist.co.kr
List 인터페이스의 주요 메서드
1. Collection Framework
207JavaSpecialist.co.kr
ArrayList
1. Collection Framework
208JavaSpecialist.co.kr
LinkedList
1. Collection Framework
209JavaSpecialist.co.kr
Map 인터페이스의 주요 메서드
1. Collection Framework
210JavaSpecialist.co.kr
HashMap
1. Collection Framework
211JavaSpecialist.co.kr
TreeMap
1. Collection Framework
212JavaSpecialist.co.kr
HashSet add()/HashMap put() 메서드
1. Collection Framework
HashSet.java
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
HashMap.java
public 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
Iterator
1. Collection Framework
• Iteration : 컬렉션에 저장되어 있는 엘리먼트를 검색하는 절차
• Iterator 인터페이스 : 컬렉션에 저장된 엘리먼트를 순차적으로 하나씩 접근하고자 할 때
사
• Set 계열 : Collection 인터페이스에 정의된 iterator() 메서드를 통하여 Iterator 객체 를 반
환 받아 사용
• List 계열 : listIterator() 메서드를 통해 ListIterator 객체를 반환 받아 사용
• Iterator 인터페이스의 주요 메서드
• boolean hasNext()
• E next()
• void remove()
215JavaSpecialist.co.kr
Iterator
1. Collection Framework
216JavaSpecialist.co.kr
2. 객체 비교
217JavaSpecialist.co.kr
hashCode(), equals() 를 이용한 객체 동등비교
2. 객체 비교
• public boolean equals(Object obj)
• public int hashCode()
218JavaSpecialist.co.kr
크기 비교
2. 객체 비교
Comparable
Collections.sort() 사용시
TreeSet 기본 생성자 사용시
compareTo() 재정의
기본 정렬 기준 구현
Comparator
TreeSet 에 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
enum
4. Typesafe enum
229JavaSpecialist.co.kr
enum
4. 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 Programming
1. 스트림
2. 입 / 출력 클래스
3. 입 / 출력과 관련된 클래스들
4. 객체 직렬화
Chapter
239JavaSpecialist.co.kr
1. 스트림
240JavaSpecialist.co.kr
Stream 클래스
1. 스트림
241JavaSpecialist.co.kr
FileReader
1. 스트림
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 streamNode streamNode stream Filter streamFilter streamFilter streamFilter streamnodenodenodenode readXxx()readXxx()readXxx()readXxx()
245JavaSpecialist.co.kr
BufferedReader
1. 스트림
246JavaSpecialist.co.kr
스트림 클래스 생성자
1. 스트림
247JavaSpecialist.co.kr
3. 입 / 출력 관련 클래스
248JavaSpecialist.co.kr
File 클래스
3. 입 / 출력 관련 클래스
File : 로컬의 파일을 파일 참조 할 수 있는 객체
249JavaSpecialist.co.kr
URL
3. 입 / 출력 관련 클래스
인터넷상에 있는 주소 (URL) 를 참조 할 수 있는 클래스
// 브라우저가 프락시서버를 사용하는 환경에서 실행 방법은
//Run -> Run Configurations -> Arguments ->
//VM Arguments -> -Dhttp.proxyHost=12.26.226.2 -Dhttp.proxyPort=8080
250JavaSpecialist.co.kr
RandomAccessFile
3. 입 / 출력 관련 클래스
접근 모드 r 은 읽기 전용 , rw 는 읽기 쓰기 가능
파일의 임의 위치에 접근할 수 있는 클래스
251JavaSpecialist.co.kr
4. 객체 직렬화
252JavaSpecialist.co.kr
고객의 정보를 파일에 저장하는 방법
4. 객체 직렬화
1. byte 단위로 저장할 것인가 ? char 단위로 저장할 것인가 ?
• byte 단위로 저장하려면 FileOutputStream/FileInputStream
• char 단위로 저장하려면 FileWriter/FileReader
2. 어떤 형식으로 저장할 것인가 ?
고객의 정보가 이름 , 주소 , 이메일 , 나이 가 있다고 가정했을 때
단순 텍스트로 저장한다 .
홍길동 , 서울 ,hong@test.com,30n
길남 , 부산 ,kil@homg.com,25
저장할 때 필드 구분자와 컬럼 구분자를 추가해야 하고 읽은 정보를 잘라서 형변
환 해야 한다 .  범용적이지만 불편하다 .( 구분자를 이용한 문자열분리와 , 형변
환 )
DataOutputStream 클래스를 이용해서 저장한다 .
필드 구분자와 컬럼 구분자를 추가할 필요가 없다 .
읽은 정보를 형변환 할 필요 없다 .
단점 : Write 했던 순서대로 읽어야 한다 . 자바에서만 사용할 수 있다 .
객체 직렬화를 이용해서 저장한다 .
직렬화 가능한 클래스여야 한다 .
자바에서만 사용할 수 있다 .
253JavaSpecialist.co.kr
단순 텍스트로 쓰기
4. 객체 직렬화
import java.io.FileOutputStream;
public class TextWriteApplication {
public static void main(String[] args) {
String data1 = " 홍길동 , 서울 ,hong@test.com,30";
String data2 = " 길남 , 부산 ,kil@homg.com,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("hong@test.com");
dos.writeInt(30); dos.writeUTF(" 길남 "); dos.writeUTF(" 부산 ");
dos.writeUTF("kil@homg.com");
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(" 홍길동 ", " 서울 ", "hong@test.com", 30);
Member m2 = new Member(" 길남 ", " 부산 ", "kil@homg.com", 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, StringBuilder
1. 문자열 클래스
265JavaSpecialist.co.kr
StringTokenizer
1. 문자열 클래스
문자열을 분리하기 위한 클래스
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
Date
4. 날짜 클래스
275JavaSpecialist.co.kr
Calendar
4. 날짜 클래스
276JavaSpecialist.co.kr
5. 지역과 시간대 클래스
277JavaSpecialist.co.kr
Locale
5. 지역과 시간대 클래스
278JavaSpecialist.co.kr
Timezone
5. 지역과 시간대 클래스
279JavaSpecialist.co.kr
6. 형식화 클래스
280JavaSpecialist.co.kr
DecimalFormat
6. 형식화 클래스
281JavaSpecialist.co.kr
SimpleDateFormat
6. 형식화 클래스
Asia/Seoul 타임존에서 한국표준시 2017 년 3 월 13 일 오후 10 시 16 분 55 초
282JavaSpecialist.co.kr
MessageFormat
6. 형식화 클래스
283JavaSpecialist.co.kr
ChoiceFormat
6. 형식화 클래스
ChoiceFormat 를 작성할 때는 제한 (limit) 배열과 형식 (format) 배열을 지정
284JavaSpecialist.co.kr
7. 수학관련 클래스
285JavaSpecialist.co.kr
Random
7. 수학관련 클래스
난수를 발생시키기 위해서 사용
286JavaSpecialist.co.kr
Math
7. 수학관련 클래스
지수 , 로그 , 제곱근 및 삼각함수와 같은 기본 숫자 연산을 수행하기 위한 메서드가 포함

More Related Content

What's hot

Relational Data Model Introduction
Relational Data Model IntroductionRelational Data Model Introduction
Relational Data Model IntroductionNishant Munjal
 
Built in classes in java
Built in classes in javaBuilt in classes in java
Built in classes in javaMahmoud Ali
 
Packages and inbuilt classes of java
Packages and inbuilt classes of javaPackages and inbuilt classes of java
Packages and inbuilt classes of javakamal kotecha
 
Intermediate code generation1
Intermediate code generation1Intermediate code generation1
Intermediate code generation1Shashwat Shriparv
 
Les07 (using the set operators)
Les07 (using the set operators)Les07 (using the set operators)
Les07 (using the set operators)Achmad Solichin
 
Date and Time Module in Python | Edureka
Date and Time Module in Python | EdurekaDate and Time Module in Python | Edureka
Date and Time Module in Python | EdurekaEdureka!
 
Java oops PPT
Java oops PPTJava oops PPT
Java oops PPTkishu0005
 
Thread priority in java
Thread priority in javaThread priority in java
Thread priority in javaRakesh Mittal
 
Decomposition methods in DBMS
Decomposition methods in DBMSDecomposition methods in DBMS
Decomposition methods in DBMSsoniyagoyal3
 
Manajemen Proses pada Linux
Manajemen Proses pada LinuxManajemen Proses pada Linux
Manajemen Proses pada Linuxnisarhmayanti
 
Object Oriented Programming Concepts using Java
Object Oriented Programming Concepts using JavaObject Oriented Programming Concepts using Java
Object Oriented Programming Concepts using JavaGlenn Guden
 
DBMS Unit 3.pptx
DBMS Unit 3.pptxDBMS Unit 3.pptx
DBMS Unit 3.pptxAmitDrKhare
 

What's hot (20)

OOP C++
OOP C++OOP C++
OOP C++
 
Java interfaces
Java   interfacesJava   interfaces
Java interfaces
 
Python-DataAbstarction.pptx
Python-DataAbstarction.pptxPython-DataAbstarction.pptx
Python-DataAbstarction.pptx
 
Relational Data Model Introduction
Relational Data Model IntroductionRelational Data Model Introduction
Relational Data Model Introduction
 
Ppt of socket
Ppt of socketPpt of socket
Ppt of socket
 
Built in classes in java
Built in classes in javaBuilt in classes in java
Built in classes in java
 
Packages and inbuilt classes of java
Packages and inbuilt classes of javaPackages and inbuilt classes of java
Packages and inbuilt classes of java
 
Intermediate code generation1
Intermediate code generation1Intermediate code generation1
Intermediate code generation1
 
Les07 (using the set operators)
Les07 (using the set operators)Les07 (using the set operators)
Les07 (using the set operators)
 
Date and Time Module in Python | Edureka
Date and Time Module in Python | EdurekaDate and Time Module in Python | Edureka
Date and Time Module in Python | Edureka
 
Oops Quiz
Oops QuizOops Quiz
Oops Quiz
 
Methods in Java
Methods in JavaMethods in Java
Methods in Java
 
Java oops PPT
Java oops PPTJava oops PPT
Java oops PPT
 
Thread priority in java
Thread priority in javaThread priority in java
Thread priority in java
 
Lossless decomposition
Lossless decompositionLossless decomposition
Lossless decomposition
 
Decomposition methods in DBMS
Decomposition methods in DBMSDecomposition methods in DBMS
Decomposition methods in DBMS
 
Manajemen Proses pada Linux
Manajemen Proses pada LinuxManajemen Proses pada Linux
Manajemen Proses pada Linux
 
Java ppt
Java pptJava ppt
Java ppt
 
Object Oriented Programming Concepts using Java
Object Oriented Programming Concepts using JavaObject Oriented Programming Concepts using Java
Object Oriented Programming Concepts using Java
 
DBMS Unit 3.pptx
DBMS Unit 3.pptxDBMS Unit 3.pptx
DBMS Unit 3.pptx
 

Similar to 자바야 놀자 PPT

Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Javajigi Jaesung
 
Programming java day2
Programming java day2Programming java day2
Programming java day2Jaehoonyam
 
Jstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNGJstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNGJung Han
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계Leonardo YongUk Kim
 
PHP 7의 새로운 특징과 기능 요약
PHP 7의 새로운 특징과 기능 요약PHP 7의 새로운 특징과 기능 요약
PHP 7의 새로운 특징과 기능 요약정아 손
 
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdf
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdfASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdf
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdfSangHoon Han
 
[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술NAVER D2
 
[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...
[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...
[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...GangSeok Lee
 
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
게임프로그래밍입문 7
게임프로그래밍입문 7게임프로그래밍입문 7
게임프로그래밍입문 7Yeonah Ki
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 APINAVER Engineering
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicknight1128
 
Ksug2015 - JPA1, JPA 소개
Ksug2015 - JPA1, JPA 소개Ksug2015 - JPA1, JPA 소개
Ksug2015 - JPA1, JPA 소개Younghan Kim
 

Similar to 자바야 놀자 PPT (20)

Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
 
Programming java day2
Programming java day2Programming java day2
Programming java day2
 
Jstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNGJstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNG
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
 
4-1. javascript
4-1. javascript4-1. javascript
4-1. javascript
 
5.Spring IoC&DI(DI와 관련된 어노테이션)
5.Spring IoC&DI(DI와 관련된 어노테이션)5.Spring IoC&DI(DI와 관련된 어노테이션)
5.Spring IoC&DI(DI와 관련된 어노테이션)
 
PHP 7의 새로운 특징과 기능 요약
PHP 7의 새로운 특징과 기능 요약PHP 7의 새로운 특징과 기능 요약
PHP 7의 새로운 특징과 기능 요약
 
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdf
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdfASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdf
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdf
 
[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술
 
[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...
[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...
[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...
 
Scala for play
Scala for playScala for play
Scala for play
 
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
 
Java script
Java scriptJava script
Java script
 
(스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션
(스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션(스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션
(스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션
 
게임프로그래밍입문 7
게임프로그래밍입문 7게임프로그래밍입문 7
게임프로그래밍입문 7
 
Jdk 7 3-nio2
Jdk 7 3-nio2Jdk 7 3-nio2
Jdk 7 3-nio2
 
Scala
ScalaScala
Scala
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
 
Ksug2015 - JPA1, JPA 소개
Ksug2015 - JPA1, JPA 소개Ksug2015 - JPA1, JPA 소개
Ksug2015 - JPA1, JPA 소개
 

More from JinKyoungHeo

6. nexcore alopex runtime
6. nexcore alopex runtime6. nexcore alopex runtime
6. nexcore alopex runtimeJinKyoungHeo
 
5-5. html5 connectivity
5-5. html5 connectivity5-5. html5 connectivity
5-5. html5 connectivityJinKyoungHeo
 
5-4. html5 offline and storage
5-4. html5 offline and storage5-4. html5 offline and storage
5-4. html5 offline and storageJinKyoungHeo
 
5-3. html5 device access
5-3. html5 device access5-3. html5 device access
5-3. html5 device accessJinKyoungHeo
 
5-2. html5 multimedia
5-2. html5 multimedia5-2. html5 multimedia
5-2. html5 multimediaJinKyoungHeo
 
5-1. html5 graphics
5-1. html5 graphics5-1. html5 graphics
5-1. html5 graphicsJinKyoungHeo
 
1. 웹 어플리케이션 아키텍처
1. 웹 어플리케이션 아키텍처1. 웹 어플리케이션 아키텍처
1. 웹 어플리케이션 아키텍처JinKyoungHeo
 

More from JinKyoungHeo (13)

6. nexcore alopex runtime
6. nexcore alopex runtime6. nexcore alopex runtime
6. nexcore alopex runtime
 
5-5. html5 connectivity
5-5. html5 connectivity5-5. html5 connectivity
5-5. html5 connectivity
 
5-4. html5 offline and storage
5-4. html5 offline and storage5-4. html5 offline and storage
5-4. html5 offline and storage
 
5-3. html5 device access
5-3. html5 device access5-3. html5 device access
5-3. html5 device access
 
5-2. html5 multimedia
5-2. html5 multimedia5-2. html5 multimedia
5-2. html5 multimedia
 
5-1. html5 graphics
5-1. html5 graphics5-1. html5 graphics
5-1. html5 graphics
 
4-3. jquery
4-3. jquery4-3. jquery
4-3. jquery
 
4-2. ajax
4-2. ajax4-2. ajax
4-2. ajax
 
3-2. selector api
3-2. selector api3-2. selector api
3-2. selector api
 
3-1. css
3-1. css3-1. css
3-1. css
 
2-2. html5
2-2. html52-2. html5
2-2. html5
 
2 1. html4.01
2 1. html4.012 1. html4.01
2 1. html4.01
 
1. 웹 어플리케이션 아키텍처
1. 웹 어플리케이션 아키텍처1. 웹 어플리케이션 아키텍처
1. 웹 어플리케이션 아키텍처
 

자바야 놀자 PPT

  • 2. 2JavaSpecialist.co.kr 이 파워포인트 파일은 [ 자바야 놀자 ] 교재 의 내용으로 구성되어 있습니다 . 교보문고에서 [ 자바야 놀자 ] 를 검색해 주 세요 . 이 파워포인트 파일의 교재는 교보문고에서 구매할 수 있습니다 . http://pod.kyobobook.co.kr/newPODBookList/newPODBookDetailView.ink?barcode=1400000280836&orderClick=KBC
  • 3. 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 에서 다운로드 할 수 있습니다 .
  • 4. 4JavaSpecialist.co.kr Contents 자료형 2 4 연산자 고객관리프로그램 I언어의 기본 구조자바 개요 1 63 5 제어문 3 27 39 53 79 89 내부클래스 8 10 예외처리 고객관리프로그램 II객체지향프로그 래밍 객체와 클래스 7 129 11 컬렉션과 제네릭 113 161 171 177 181 199 14 기본 API 클래 스 입출력 프로그래 밍 13 217 251
  • 5. 01 자바 개요 1. 자바 개요 2. Java SE 3. HelloWorld 애플리케이션 4. 이클립스 (Eclipse) 를 이용한 개발 Chapter
  • 7. 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
  • 8. 8JavaSpecialist.co.kr 자바 특징 1.1. 자바 개요 플랫폼 종속적 플랫폼 독립적 • OOP(Object Oriented Programming; 객체지향프로그래밍언어 ) • 플랫폼 독립적 ( 아키텍쳐 중립적 ) • 멀티스레드 (Multi-thread) 지원 • 분산환경 • 인터프리터 언어 • Simple 한 코드 • 뛰어난 보안성 (Secure) • 고성능 • 동적 • 모듈화 (Modularity) • 무료 개발 환경
  • 10. 10JavaSpecialist.co.kr JDK 다운로드 및 설치 1.2. 자바 SE • http://java.sun.com -> Java SE 링크 클릭 -> Java Platform(JDK) 8u??? 선택 • 다운로드 받은 파일 더블클릭 실행 , 이후 디폴트 값으로 설치
  • 12. 12JavaSpecialist.co.kr HelloWorld 1.3. HelloWorld 1. public class HelloWorld { // 클래스 선언부 2. 3. public static void main(String[] args) { 4. System.out.println("Hello World"); //sysout 입력 후 Ctrl+SpaceBar 5. } 6. } 컴파일 실행
  • 14. 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
  • 15. 15JavaSpecialist.co.kr 이클립스 실행과 Project workspace 1.4. 이클립스를 이용한 개발 실행 시 프로젝트가 저장될 작업 공간 설정 D:Projectsworkspace 로 설정 첫 실행 화면
  • 16. 16JavaSpecialist.co.kr 이클립스 기본화면 구성 1.4. 이클립스를 이용한 개발 워크 벤치 (Workbench) 퍼스펙티브바 메뉴바 툴바 퍼스펙티브 (Perspective) 퍼스펙티브에 따라 사용자에게 적합한 뷰와 메뉴가 배치된다 . 좌측 View 영역 중앙 View 영역 하단 View 영역 우측 View 영역 Fast 뷰 : 잘 사용하지 않는 화면들을 최소화 시켜놓고 필요한 시점에만 잠깐 활성화 시킬 때 사용된다 . Eclipse 기본화면은 메뉴바 , 툴바 , 퍼스펙티브바 , 4 개의 View 영역으로 크게 구분된다 . 이 4 개의 뷰를 포함하는 전체 영역을 퍼스펙티브 (Perspective) 라고 하고 , Eclipse Window 전체를 워크벤치 (Workbench) 라 부른다 .
  • 17. 17JavaSpecialist.co.kr 이클립스 기본화면 구성 1.4. 이클립스를 이용한 개발 퍼스펙티브바 메뉴바 툴바 좌측 View 영역 중앙 View 영역 하단 View 영역 우측 View 영역 퍼스펙티브에 따라 사용자에게 적합한 뷰와 메뉴가 배치
  • 18. 18JavaSpecialist.co.kr 프로젝트 Perspective 1.4. 이클립스를 이용한 개발 이클립스는 Perspective 에 따라 화면의 아이콘 및 메뉴 배치가 다르게 보인다 . 어떤 프로젝트를 개발하고 있느냐에 따라 Perspective 가 달라진다 . 메뉴에 보이지 않는 항목이 있다면 Other 를 선택하면 나머지 항목을 찾을 수 있다 . 자바 개발을 위해서는 Java Perspective 로 변경한다 .
  • 19. 19JavaSpecialist.co.kr 프로젝트 생성 1.4. 이클립스를 이용한 개발 File -> New -> Java Project
  • 20. 20JavaSpecialist.co.kr 소스코드 작성 1.4. 이클립스를 이용한 개발 File -> New -> Class 클래스 이름 입력 시 대 / 소문자를 구분
  • 21. 21JavaSpecialist.co.kr 코드 작성 1.4. 이클립스를 이용한 개발 sysout 입력 후 Ctrl+Space 로 자동완성 가능
  • 23. 23JavaSpecialist.co.kr 샘플 코드 가져오기 1.4. 이클립스를 이용한 개발 [File] -> [Import] [General] -> [Existing Projects into Workspace] 다운로드 받은 소스코드 압축파일 선택 소스코드 다운로드 주소 http://javaspecialist.co.kr/board/68
  • 24. 02 언어의 기본 구조 1. 주석문과 식별자 2. 키워드 (Java Language Keywords) 3. 이름 규칙 4. 변수와 메서드 5. Java Standard Edition 8 Documents Chapter
  • 26. 26JavaSpecialist.co.kr 주석문 (Comments) 2.1. 주석문과 식별자 // 한 줄 주석 /* 한 줄 또는 여러 줄 주석 */ /** document 생성용 주석 javadoc 명령으로 API 문서를 자동 생성시킬 때 사용 */
  • 28. 28JavaSpecialist.co.kr 세미콜론 (;), 블록 (Block), 공백 (Whitespace) 2.1. 주석문과 식별자 ;( 세미콜론 ), { }( 블록 ), 그리고 공백들은 코드의 가독성을 높여줌 •논리적인 한 문장이 끝날 때 반드시 세미콜론 (;) 을 붙여 줌 •블록은 중괄호 (curly brace), 즉 "{" 와 "}" 로 묶여진 부분을 말하며 , 복합 문을 구성하는 요소 •종속된 문장이 다수 개 일 때 "{" 로 시작하고 "}" 닫아줌 •공백 (Whitespace) 은 빈칸 , 탭 , 빈 줄 등이 있으며 , 이러한 공백은 소스 코드를 보기 좋게 하고 알아보기 쉽게 하는데 사용됨
  • 29. 29JavaSpecialist.co.kr 식별자 2.1. 주석문과 식별자 • 대문자와 소문자를 구분하고 , 길이 제한이 없습니다 . • 문자와 숫자 , 밑줄 (_), 달러기호 ($) 를 포함할 수 있습니다 .( 밑줄 (_) 과 달러 기호 ($) 는 로컬 시스템의 규칙이 있거나 부득이한 경우가 아니면 식별자에 사 용하지 않는 것이 좋습니다 . 또한 유니코드를 지원하기 때문에 한글 사용이 가능하지만 , 영문자를 사용하는 것이 좋습니다 .) • 문자 , 밑줄 (_), 달러기호 ($) 로 시작할 수 있습니다 . • 숫자로는 시작할 수 없습니다 . 첫 문자 외에는 문자 , 숫자 , 밑줄 (_), 달러기 호 ($) 등을 임의의 순서로 사용할 수 있습니다 . • 공백을 포함할 수 없습니다 . • 키워드는 식별자로 사용할 수 없습니다 .
  • 34. 34JavaSpecialist.co.kr 이름 규칙 2.3. 이름 규칙 ▽ 클래스 이름 / 인터페이스 이름 - 명사나 형용사를 서술적으로 연결하여 사용합니다 . - 첫 글자는 대문자로 표기합니다 . - 연결된 단어의 첫 글자도 대문자로 표기합니다 . - 나머지 문자는 소문자로 표기합니다 . - "$"(dollar sign) 은 내부 클래스에서 특별한 의미가 있기 때문에 사용을 권장하지 않습니다 .   ▽ 변수 이름 - 명사적 의미를 갖게 만듭니다 . - 첫 글자는 소문자 , 연결 단어의 첫 글자는 대문자로 표기합니다 . - 나머지 문자는 소문자로 표기합니다 . - 일반적으로 변수 이름에서는 "_"(underscore character) 를 사용하지 않습니다 .   ▽ 메서드 이름 - 동사적 의미를 갖게 합니다 . - 첫 글자는 소문자 , 연결 단어의 첫 글자는 대문자로 표기합니다 . - 나머지 문자는 소문자로 표기합니다 . - 메서드 이름 뒤에는 한 쌍의 괄호 "( )" 가 뒤따릅니다 . - 일반적으로 메서드 이름에서는 "_"(underscore character) 를 사용하지 않습니다 .
  • 39. 39JavaSpecialist.co.kr Java SE 8 Documents 2.5. Java SE 8 Documents http://docs.oracle.com/javase/8/docs/api/index.html
  • 40. 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
  • 41. 41JavaSpecialist.co.kr 배포용 설명서 (API Document) 작성 2.5. Java SE 8 Documents
  • 42. 42JavaSpecialist.co.kr 03 데이터 타입 1. 기본 데이터 타입 2. 배열 (array) 3. 변수의 초기화 Chapter
  • 44. 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-45 F ~ 3.402e+38 F 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 null All reference type null
  • 45. 45JavaSpecialist.co.kr –기본 데이터 타입 정수 , 부동소수점 3.1. 기본 데이터 타입
  • 46. 46JavaSpecialist.co.kr –기본 데이터 타입 논리 3.1. 기본 데이터 타입
  • 47. 47JavaSpecialist.co.kr –기본 데이터 타입 문자 3.1. 기본 데이터 타입
  • 48. 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 형이 된다 .
  • 50. 50JavaSpecialist.co.kr 배열 3.2. 배열 특징 reference type homogeneous collection immutable 배열 선언 ( 크기 명시 못함 ) int[] intArr; 배열 생성 ( 크기 명시해야 함 ) intArr = new int[5]; 배열 선언과 생성을 동시에 할 수 있음 int[] intArr = new int[5]; // 선호 int []intArr = new int[5]; int intArr[] = new int[5]; 배열 생성 시 배열의 타입별 초기값
  • 53. 53JavaSpecialist.co.kr Primitive Array & Reference Array 3.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; arr arr2 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
  • 56. 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);
  • 57. 57JavaSpecialist.co.kr Lotto 3.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. }
  • 59. 59JavaSpecialist.co.kr 변수의 초기화 3.3. 변수의 초기화 지역변수는 사용하기 전에 반드시 초기화 해야 함 멤버변수는 사용하기 전에 초 기화 하기 않아도 기본값으로 초기화 됨 지역변수 멤버변수 ( 인스턴스 변수 ) 멤버변수 ( 클래스 변수 )
  • 60. 60JavaSpecialist.co.kr 04 연산자 1. 연산자 2. 단항 연산자 (Unary operator) 3. 2 항 연산자 (Binary operator) 4. 3 항 연산자 (Ternary operator) 5. 대입 연산자 (Assignment operator) Chapter
  • 62. 62JavaSpecialist.co.kr 연산자 4.1. 연산자 우선 순위 연산자 연산자 설명 높음☝ 우 선 순 위 낮음☟ ( ) [ ] . 괄호 소수점 / 참조 연산자 ++, -- +, - ! ~ (type) 증 / 감 연산자 ( 증가 , 감소 ) 부호 논리 연산자 ( 반전 ) 비트 연산자 ( 반전 ) 형 변환 *, /, % 산술 연산자 ( 곱셈 , 나눗셈 , 나머지 ) +, - 산술 연산자 ( 덧셈 , 뺄셈 ) <<, >>, >>> 비트 이동 연산자 ( 좌 , 우 , 우 ( 부호 포함 )) <, <=, >, >= ==, != instanceof 비교 연산자 ( 대 / 소 비교 ) 비교 연산자 ( 동 / 이 비교 ) type 연산자 ( 객체 형 비교 ) &, |, ^ 비트 연산자 (AND, OR, XOR) 논리 연산자 (AND, OR, XOR) &&, || 논리 연산자 (Short Circuit) ? : 논리연산자 (3 항 연산자 ) = +=, -=, *=, /=, %= <<=, >>=, >>>= &=, ^=, |= 대입 연산자 연산 후 대입 연산자 연산 후 대입 연산자 연산 후 대입 연산자
  • 64. 64JavaSpecialist.co.kr 증 / 감 연산자 ++ -- 4.2. 단항 연산자 • 증 / 감 연산자는 변수의 값을 1 증가 또는 감소시킴 • a = a+1; 보다 a++; 이 연산속도가 빠름 • ++, -- 는 변수의 앞에 오느냐 , 뒤에 오느냐에 따라 할당되는 주위 변수의 값이 달라질 수 있다 . • ++ 1 증가시킴 • -- 1 감소시킴
  • 65. 65JavaSpecialist.co.kr 비트 반전과 논리 반전 연산자 4.2. 단항 연산자
  • 66. 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 -^
  • 69. 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.0 float 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
  • 70. 70JavaSpecialist.co.kr 비교 연산자 <, <=, >, >=, ==, != 4.3. 2 항 연산자 • 비교 연산자 (Comparison operator) 의 결과 값은 크기 값을 비교하여 조건을 만족하면 true 를 , 맞지 않으면 false 를 반환 • 만약 비교되는 숫자의 자료형이 다를 경우 기본적으로 크기가 큰 자료형에 맞추어 비교 연산을 수행 • 동등 (equality) 연산자 ‘ ==’ 와 비동등 (inequality) 연산자 ‘ !=’ 는 객체 참조 값 즉 , 주소 값이 같은 지의 여부를 판단하여 true 와 false 를 반환 • 객체 참조가 아닌 실제 값을 비교 판단하기 위해서는 equals() 메서드를 이용해야 함 (equals() 메서 드는 Object 클래스를 다루는 부분에서 자세하게 설명됩니다 .) • instanceof 연산자의 경우 런타임 시 연산자의 왼쪽 항의 객체가 오른쪽 항 클래스의 인스턴스이 면 true 를 반환하고 , 그렇지 않으면 false 를 반환 (instanceof 연산자를 이해하려면 클래스 개념이 있 어야 합니다 . instanceof 연산자에 대해서는 객체지향프로그래밍에서 자세히 설명합니다 .)
  • 72. 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. }
  • 73. 73JavaSpecialist.co.kr 비트 이동 연산자 <<, >>, >>> 4.3. 2 항 연산자 << 왼쪽으로 비트 이동 , 오른쪽에 채워지는 비트는 0, 2 를 곱한 결과 >> 오른쪽을 비트 이동 , 채워지는 비트는 부호비트 , 2 로 나눈 결과 >>> 오른쪽을 비트이동 , 채워지는 비트는 무조건 0, 음수가 양수로 바뀔 수 있음 * 비트 이동 연산자는 오른쪽 항의 값에 대해서 단축이 일어납니다 . 단축이란 비트 이동 연산자의 젯 수 값이 자료형의 크기 이상일 때 젯수의 숫자를 자료형의 크기로 나눈 나머지를 젯수로 한다는 뜻 int a = 8; int b = a << 33; // int b = a << (33 % 32); * / 보다 연산속도가 빠르지만 가독성이 떨어져서 권장하지 않음
  • 75. 75JavaSpecialist.co.kr 논리 연산자 ^, &, |, &&, || 4.3. 2 항 연산자
  • 79. 79JavaSpecialist.co.kr 대입연산자 =, op= 4.5. 대입 연산자 • 대입 연산자의 기본 기호는 ‘ =’ 이고 , 보다 발전된 대입 연산자는 x operand= a 의 형태를 가 지고 있으며 이는 x = x operand a 와 같은 역할을 합니다 . • 대입 연산자에는 =, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, ^=, |= 등이 있습니다 .
  • 80. 80JavaSpecialist.co.kr 05 제어문 1. 조건문 2. 반복문 3. 탈출문 Chapter
  • 81. 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 문도 제어구조를 탈출하는 용도로 사용됨
  • 83. 83JavaSpecialist.co.kr if 문 (if ~ else 문 ) 5.1. 조건문
  • 84. 84JavaSpecialist.co.kr if 문 ( 다중 else if 문 ) 5.1. 조건문
  • 85. 85JavaSpecialist.co.kr if 문 ( 중첩 if 문 ) 5.1. 조건문
  • 87. 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; }
  • 94. 94JavaSpecialist.co.kr 피라미드 출력하기 5.2. 반복문 i j < dan-i 별 0 0 1 2 3 4 5 ***** 1 0 1 2 3 4 **** 2 0 1 2 3 *** 3 0 1 2 ** 4 0 1 * i j > dan-i-1 별 0 5 4 3 2 1 0 ***** 1 5 4 3 2 1 **** 2 5 4 3 2 *** 3 5 4 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(); }
  • 95. 95JavaSpecialist.co.kr Enhanced for loop 문 5.2. 반복문 배열 , Collection 객체 등의 내용을 모두 소진하기 위한 용도 Java 5 버전부터 사용 가능
  • 99. 99JavaSpecialist.co.kr Label 을 갖는 반복문 5.3. 탈출문
  • 101. 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.}
  • 102. 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.}
  • 105. 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 부터 시작하므로 ) 먼저 다이아몬드 를 만드세요 .
  • 106. 106JavaSpecialist.co.kr Palindrome 5. 제어문 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 를 출력하는 프로그램을 작성하세요 . • 다 좋은 것은 좋다 • 소주 만 병만 주소 • 여보 안경 안 보여 • 다 큰 도라지라도 큰다 . • 아들딸이 다 컸다 이 딸들아 • 대한전선 사장이 장사 선전한대 • 다 간다 이 일요일 일요일이 다 간다
  • 108. 108JavaSpecialist.co.kr 요구사항 정의 고객관리 프로그램 고객의 정보는 이름 , 성별 , 이메일 , 출생년도가 있습니다 . 고객의 정보를 입력 받아 배열에 저장해야 합니다 . 이름은 문자열로 저장하며 , 성별은 남자는 M, 여 자는 F 로 저장합니다 . 이메일은 문자열로 저장하며 태어난 출생년도는 정수로 저 장합니다 . 고객 관리 프로그램은 고객의 정보를 저장 , 조회 , 수정 , 삭제할 수 있는 기능이 있어야 합니다 . 고객 정보를 파일에 저장하는 기능을 구현하지 않아도 됩니다 . I 를 눌러 고객의 정보를 입력 받도록 하며 , 저장된 고객 정보는 P 또는 N 을 눌러 이전 고객정보 또는 다음 고객정보를 조회할 수 있어야 합니다 . 조회한 고객 정보 는 U 를 눌러 새로운 정보로 수정할 수 있어야 합니다 . D 를 누르면 조회한 고객 정 보를 배열에서 삭제해야 합니다 . 프로그램의 종료는 Q 를 누릅니다 .
  • 109. 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);
  • 110. 110JavaSpecialist.co.kr 메뉴 고객관리 프로그램 while(true) { System.out.printf("n[INFO] 고객 수 : %d, 인덱스 : %dn", 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
  • 111. 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 값을 증가시켜야 함 }
  • 115. 07 객체와 클래스 1. 객체와 클래스 2. 패키지 (package) Chapter
  • 117. 117JavaSpecialist.co.kr 객체와 클래스의 정의 1. 객체와 클래스 • 클래스 : 객체를 만들기 위한 틀 • 객체 : 클래스의 인스턴스 • 객체의 명사적 특성 : 데이터 , 변수 (Variable), 필드 (Field), 속성 (Attribute) • 객체의 동사적 특성 : 행위 (Behavior), 메서드 (Method), 기능 (Operation) Instance Object Class
  • 122. 122JavaSpecialist.co.kr 멤버변수와 지역변수 1. 객체와 클래스 • 멤버변수 (Member Variable) • 클래스 안에서 선언 된 변수 • 객체를 생성할 때 각 데이터 타입의 기본 값으로 자동 초기화 • 기본 값 : 정수형 0, 부동소수점형 0.0, 논리형 false, 객체 null • 지역변수 (Local Variable) • Automatic variable • 메서드 안에서 선언된 변수 • 사용하기 전에 반드시 초기화 해야 함
  • 124. 124JavaSpecialist.co.kr 생성자 선언 및 사용 1. 객체와 클래스
  • 125. 125JavaSpecialist.co.kr 객체 추상화 1. 객체와 클래스 • 실 객체를 클래스로 만드는 과정을 객체 추상화라 부름 • 객체 • 기능을 위한 객체 • 데이터 저장을 위한 객체 • Account( 은행계좌 ) • 명사 ( 속성 ) : 계좌명 , 계좌번호 , 비밀번호 , 잔액 , 이자 • 동사 ( 기능 ) : 예금하다 , 출금하다 , 잔액을 조회하다 .
  • 127. 127JavaSpecialist.co.kr 패키지 2. 패키지 서로 연관된 클래스들의 묶음을 패키지 (Package) 특정 패키지 안의 클래스를 사용하겠다 . 클래스 선언 전에 import 선언 , 맨 위에는 package 선언
  • 128. 128JavaSpecialist.co.kr Import static 2. 패키지 static 메서드를 사용할 때 클래스 이름 또는 객체 이름 없이 메서드 이름만으로 사용할 수 있도록 import 문이 개선
  • 129. 129JavaSpecialist.co.kr package 선언 2. 패키지 • 패키지 이름은 영문 소문자를 이용하는 것을 권장 • 대분류 와 소분류 패키지들의 구분은 .(dot) 이용 • 루트 패키지 패키지 이름은 java. 으로 시작할 수 없음 • 자바의 키워드들도 패키지로 사용할 수 없음 패키지 컴파일 실행 시 패키지이름을 포함해야 함
  • 130. 08 객체지향 프로그래밍 Chapter 1. 은닉 (Encapsulation) 2. 상속 (Inheritance) 3. 접근 제한자 (Access Modifier) 4. 다형성 (Polymorphism) 5. static modifier 6. final modifier 7. abstract Modifier 8. 기타 Modifier 9. 인터페이스 (Interface)
  • 133. 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, mutator getter, accessor
  • 137. 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 클래스는 반드시 상속해서 사용
  • 138. 138JavaSpecialist.co.kr Bad Case & Good Case 2. 상속 (Inheritance) • Bad Case • 개별 클래스들에 중복된 속성 / 기능을 포함 • Good Case • 중복된 기능을 빼내 새로운 클래스로 작성한 후 구체화시킴 • 일반화 된 클래스는 부모클래스 • 구체화 된 클래스는 자식클래스 • extends 키워드를 사용 • 예제 클래스 • class Person{} • class Student extends Person{ } • class Teacher extends Person{ } • class Employee extends Person{ }
  • 139. 139JavaSpecialist.co.kr 메서드 재정의 (Overriding) 2. 상속 (Inheritance) • 부모클래스로부터 상속받은 메서드를 자식 클래스에서 행위를 바꾸거나 보완하기 위해 다시 정의해서 사용 하는 것 • 재정의 규칙 • 상속 전재 • 리턴타입 , 메서드 이름 , 파라미터 변수 선언이 일 치해야 함 • 접근제한자는 같거나 more public 해야 함
  • 140. 140JavaSpecialist.co.kr this 와 super 2. 상속 (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() 삽입 됨
  • 143. 143JavaSpecialist.co.kr 접근 제한자 3. 접근 제한자 접근제한자는 클래스와 클래스 변수 , 메서드 , 생성자 등의 접근을 제어할 수 있는 제 한자 public, private, protected 와 접근제한자를 붙이지 않았을 경우에 해당하는 package friendly
  • 144. 144JavaSpecialist.co.kr 접근 제한자 3. 접근 제한자 com.abc 패키지 Animal com.xyz main( ) Dog Fish Animal + String name # int age String color - String kind getDetails() + public # protected ~( 공백 ) package friendly - privatemain( ) name : com.abc 의 모든 클래스 , 그 외 모든 클래스에서 접근 age : com.abc 의 모든 클래스에서 접근 가능 , 패키지가 다른 경우 접근 못함 단 상속관계가 있을 경우 예외 com.xyz.Dog 에서 접근 가능 color : com.abc 의 모든 클래스에서 접근 가능 , 패키지 다른 경우 절대 접근 못함 kind : Animal 클래스 안에서 만 참조 가능
  • 146. 146JavaSpecialist.co.kr 4. 다형성 다형적 객체 Virtual Method Invocation 이종모음 (Heterogeneous collection) Wrapper class 다형적 인자 instanceof 중복 (Overloading) static variable static method static initializer static 정리 instance initializer Singleton Design Pattern
  • 147. 147JavaSpecialist.co.kr 다형적 객체 4. 다형성 • Person 타입 변수 p 는 Person 클래 스의 하위 타입 객체를 가질 수 있다 . • 다형성은 상속을 전제로 함
  • 148. 148JavaSpecialist.co.kr Virtual Method Invocation 4. 다형성 • 다형적 객체로 메서드를 호출하면 자식 클래스의 재정의된 메서드를 호출한다 . • 반드시 부모 클래스에 선언되어 있 는 메서드만 호출 할 수 있다 .
  • 149. 149JavaSpecialist.co.kr 이종모음 (Heterogeneous collection) 4. 다형성 • 다형성을 배열에 적용하면 배열이 다른 타입 객체를 가질 수 있다 .
  • 150. 150JavaSpecialist.co.kr Wrapper class 4. 다형성 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 를 통해 기본 데이터 타입을 참조 데이터 타입으로 변환해서 사용 했었음
  • 151. 151JavaSpecialist.co.kr 다형적 인자 4. 다형성 • 파라미터와 리턴타입에도 다형성이 적용될 수 있다 .
  • 152. 152JavaSpecialist.co.kr instanceof 4. 다형성 • instanceof 는 키워드 ( 연산자 ) 임 • 객체가 어떤 클래스의 타입인지 확 인
  • 153. 153JavaSpecialist.co.kr 중복 (Overloading) 4. 다형성 • 동일 클래스 내에서 같은 이름의 생성자 또는 메서드 를 선언하는 것 • 규칙 • 이름은 동일 • 파라미터 개수 , 순서 , 타입이 반드시 달라야 한 다 . • 리턴타입은 고려 안 함 . • 접근 제한자는 고려 안 함 . • 예 ) println, print 메서드들
  • 155. 155JavaSpecialist.co.kr static variable 5. static • 객체 생성 없이 참조 • 모든 객체가 같은 값을 가짐
  • 156. 156JavaSpecialist.co.kr static method 5. static • 객체 생성 없이 참조 • static 메서드 안에서 non-static 멤 버 직접 참조 못함 ( 단 , 객체 생성 을 통해 참조 가능함 ) • ++new Count().a; 는 가능
  • 157. 157JavaSpecialist.co.kr static initializer 5. static • 생성자가 실행되기 전에 실행됨 • static 변수 초기화에 사용 • 객체를 여러 개 생성해도 한번만 실행
  • 158. 158JavaSpecialist.co.kr static 정리 5. static • 변수 , 메서드 , static { }, 클래스에 사용 • static 제한자는 지정된 변수와 메서드를 인스턴스와 무관하게 만들어 주기 때문에 this 를 가질 수 없다 . • static 메서드는 non-static 메서드로 재정의 (overriding) 될 수 없다 . • 변수 • 정적변수 , 여러개의 인스턴스가 모두 동일한 장소를 참조 • final 과 같이 사용되어 상수가 됨 . • 객채 생성 없이 참조 가능 • 메서드 • 객체 생성 없이 참조 ( 자주 사용하는 메서드들 ) • Math 클래스의 메서드들 • static 블럭에서는 non-static 멤버를 직접 참조 못한다 . • 객체를 생성해서도 가능 • static initializer • static { } • 클래스가 로딩될 때 딱 ... 한번만 호출 , 생성자가 호출되기 전에 • 클래스 • 내부 클래스 ( 클래스 안의 클래스 )
  • 159. 159JavaSpecialist.co.kr instance initializer 5. static • 생성자가 호출되기 전에 호출됨 • 인스턴스 변수 초기화에 사용 • 생성자를 이용하여 인스턴스 변수 초기화가 가능하므로 사용할 기회가 많지 않음
  • 160. 160JavaSpecialist.co.kr Singleton Design Pattern 5. static static 제한자와 private 제한자를 이용하여 클래스의 인스턴스가 오직 하나만 만들어 지도록 하는 프로그래밍 방법
  • 162. 162JavaSpecialist.co.kr final class & final method 6. 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()"); } } 상속 불가 재정의 불가
  • 163. 163JavaSpecialist.co.kr final variable 6. 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 } }
  • 164. 164JavaSpecialist.co.kr final local variable 6. 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(); } }
  • 165. 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 필드의 초기화가 아님 } }
  • 166. 166JavaSpecialist.co.kr final 6. final • 클래스 , 변수 , 메서드에 사용 • 클래스 • 상속불가능 , 인스턴스를 생성 사용 • String • 변수 • 상수정의 • static 따라다님 • 로컬 클래스의 메서드에서 지역변수를 참조해 야 할 경우 지역변수에 final 을 붙여야 함 • 메서드 • 재정의 불가능하게 함
  • 168. 168JavaSpecialist.co.kr abstract 7. abstract • 클래스 , 메서드에 사용 • 클래스 • 객체를 생성할 수 없다 . • 추상 클래스 • 반드시 상속을 받아서 사용하도록 한다 . • 메서드 • 추상 메서드 • 메서드 구현부분이 없다 . • 추상메서드를 하나라도 포함하는 클래스는 추상클래스가 되어야 한 다 . 그러나 추상클래스가 반드시 추상메서드를 가질 필요는 없다 .
  • 171. 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 내부 클래스는 사용가능 O Encapsulation - 은닉에 사용 O 클래스 안에서만 사용할 때 O Singleton Design Pattern Usage abstract O 객체를 생성 못함 , 상속 가 능 X O body 는 구현 않고 선언만 함 X static X O 공유변수 , 객체 생성 없이 참 조 O 객체 생성 없이 참조 가능 X final O 객체 생성 가능 , 상속은 불 가능 O 상수 선언 , static 과 같이 사 용 O final 메서드는 재정의 안됨 O transient X O 객체 직렬화에 사용 X X synchronized X X O 쓰레드 동기화에 사용됨 X volatile X O 비동기적으로 변경 가능하게 함 X X native X X O 선언만하고 구현은 타 언어 로 X
  • 176. 176JavaSpecialist.co.kr 인터페이스의 멤버 9. 인터페이스 • 인터페이스 내의 변수는 public static final 로 선언 됨 • 메서드는 body 가 없 어야 하며 public abstract 로 선 언 됨
  • 177. 177JavaSpecialist.co.kr 인터페이스 다중상속 9. 인터페이스 • 인터페이스끼리 다중상속 가능 • 가장 하위 인터페이스를 구현할 경우 상속관계 에 있는 인터페이스들의 모든 메서드를 구현해 야 함
  • 178. 178JavaSpecialist.co.kr interface 9. 인터페이스 기능의 명세를 위해 사용합니다 . • 단일상속 문제점을 해결할 수 있다 . • interface Pet { } • 인터페이스의 메서드는 추상메서드이어야 함 • public abstract void play( ); • 인터페이스의 변수는 자동으로 상수가 됨 • public static final int NUMBER = 10; • 인터페이스를 구현할 때는 implements • class Dog implements Pet { } • 인터페이스를 여러 개 implements 할 수 있다 . • 인터페이스는 다른 인터페이스를 여러 개 extends 할 수 있 다 .
  • 179. 179JavaSpecialist.co.kr 미션 9. 인터페이스 ( 도형 ) 삼각형 , 사각형 , 원의 넓이를 계산하고 출력하는 어플리케이션을 작성해야 합니다 . ( 각 도형은 도형의 ) 모양에 따라 이름을 가지고 있고 , 도형의 특징에 따라 사각형은 너비와 높이 , 삼각형은 밑면의 길이와 높이 , 원은 반지름 정보를 저장해야 합니다 . 각 도형은 면적을 계산하여 출력하는 기능을 가지고 있어야 합니다 . 명사 도형 , 삼각형 , 사각형 , 원 , 너비 , 높이 , 반지름 Is 관계 ( 클래스 ) 삼각형은 도형이다 . 사각형은 도형이다 . 원은 도형이다 . Has a 관계 ( 클래스와 멤버 ) 사각형은 너비와 높이를 갖는다 . 삼각형은 너비 높이를 갖는다 . 원은 반지름을 갖는다 도형은 도형의 이름을 갖는다 . 동사 ( 메서드 ) 면적을 계산하다 . 면적을 출력하다 . 너비 , 높이 , 반지름 정보를 저장하다 .
  • 181. 181JavaSpecialist.co.kr Shape 9. 인터페이스 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(); }
  • 182. 182JavaSpecialist.co.kr Rectangle 9. 인터페이스 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(); } }
  • 183. 183JavaSpecialist.co.kr Circle 9. 인터페이스 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; } }
  • 184. 184JavaSpecialist.co.kr ShapeApplication 9. 인터페이스 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()); } }
  • 185. 09 내부클래스 1. 내부 클래스 (Inner class) 2. 내부 클래스 (Inner class) 의 사용 Chapter
  • 186. 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
  • 187. 187JavaSpecialist.co.kr 내부클래스의 사용 2. 내부클래스의 사용 • 별도의 클래스에서 내부클래스 참조 • Outer2 out = new Outer2(); • // 내부클래스를 포함하는 외부클래스 인스턴스 생성 • Outer2.MyInner2 in = out.new MyInner2(); • // 외부클래스의 인스턴스를 통해 내부클래스 객체 생성 • 내부클래스에서 변수 참조 • 로컬 클래스의 메서드에서 외부클래스의 지역변수를 참조하기 위 해서는 final 로 선언되어야 함
  • 188. 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
  • 189. 10 예외처리 1. 예외 처리 2. Assertion Chapter
  • 191. 191JavaSpecialist.co.kr 예외 (Exception) 1. Exception • 예외는… mild 한 error • 처리방법 • try~catch~finally • 예외의 원인이 현재 실행되는 블록에 있을 경우 • 직접 예외를 처리함 • try { // 예외가 발생할 가능성이 있는 코드 }catch(Exception e) { // 예외가 발생했을 때 실행할 코드 }finally { // 반드시 실행해야 할 코드 // 자원 반납 } • throws • 예외의 원인이 그 메서드를 호출하는 호출자에게 있을 경우 • 예외발생시 예외가 발생했음을 메서드 호출자에게 통지해줌 • 메서드 선언부에 throws 절 사용 • 사용자 정의 예외 • Exception 또는 그 하위 예외 클래스를 상속받아 구현 함 • 예외를 발생시키고 싶을 때 • throw
  • 192. 192JavaSpecialist.co.kr 예외 (Exception) 1. Exception • checked exception • 반드시 예외 처리를 해줘야 컴파일이 수행됨 • unchecked exception 을 제외한 모든 예외들 ... • unchecked exception • 예외처리 하지 않아도 컴파일 수행됨 . • 실행 시 예외 발생하면 프로그램 비정상 종료될 가능성 있 음 • RuntimeException 과 그 하위 예외 클래스들 ...
  • 193. 193JavaSpecialist.co.kr throws 와 try~catch 1. 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
  • 194. 194JavaSpecialist.co.kr 사용자정의 예외와 throw 1. 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; } }
  • 196. 196JavaSpecialist.co.kr Assertion 2. Assertion JDK 1.4 버전에 추가 에러가 없는 프로그램을 작성하기 위한 하나의 기술 assert Expression1 ; assert Expression1 : Expression2 ; Expression2 는 메시지임 컴파일 javac -source 1.4 FileName.java 실행 java -ea FileName 선행 조건은 예외처리로… 유스케이스의 수행이 시작되기 위하여 필요한 조건을 뜻한다 . 선행조건이 만족하지 않으면 유스케이스의 동작이 시작되지 않음을 의미한다 . 후행 조건은 Assertion 으로 유스케이스의 수행이 완료된 후에 만족되어야 하는 조건을 뜻한다 . 해당 유스케이스의 정상 동작에 대한 최소한의 판단 기준이 될 수 있다 . 만약 이 조건이 만족되지 않으면 시스템이 정상적으로 동작했다고 판단하기 어렵다 . 그러나 후행 조건이 충족되었다고 유스케이스가 올바르게 수행되었다고 판단할 수는 없다 .
  • 197. 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; } }
  • 198. 11 Collection Framework 1. Collection Framework 2. 객체 비교 3. 제네릭과 형 안정성 (Generic & Type Safety) 4. Typesafe enum 5. Varargs(Variable-length arguments) Chapter
  • 200. 200JavaSpecialist.co.kr Collection 프레임워크 1. Collection Framework • Collection 인터페이스의 하위 클래스들 • Set 계열 • Set 인터페이스를 구현한 클래스들 • 순서 X, 중복 허용 X • HashSet, TreeSet • List 계열 • List 인터페이스를 구현한 클래스들 • 순서 O, 중복 허용 O • ArrayList, LinkedList • Map 계열 • Map 인터페이스를 구현한 클래스들 • MashMap, TreeMap
  • 202. 202JavaSpecialist.co.kr Set 인터페이스의 주요 메서드 1. Collection Framework
  • 204. 204JavaSpecialist.co.kr Tree 자료구조 1. Collection Framework • 트리 구조 (tree, 나무구조 ) • 그래프의 일종 • 여러 노드가 한 노드를 가리킬 수 없는 구조 • 간단하게는 회로가 없고 , 서로 다른 두 노드를 잇는 길이 하나뿐인 그래프 • 트리에서 최상위 노드를 루트 노드 (root node 뿌리 노드 ) • 노드 A 가 노드 B 를 가리킬 때 A 를 B 의 부모 노 드 (parent node), B 를 A 의 자식 노드 (child node) • 자식 노드가 없는 노드를 잎 노드 (leaf node 리프 노 드 ) • 잎 노드가 아닌 노드를 내부 노드 (internal node)
  • 206. 206JavaSpecialist.co.kr List 인터페이스의 주요 메서드 1. Collection Framework
  • 209. 209JavaSpecialist.co.kr Map 인터페이스의 주요 메서드 1. Collection Framework
  • 212. 212JavaSpecialist.co.kr HashSet add()/HashMap put() 메서드 1. Collection Framework HashSet.java public boolean add(E e) { return map.put(e, PRESENT)==null; } HashMap.java public 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; }
  • 213. 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;
  • 214. 214JavaSpecialist.co.kr Iterator 1. Collection Framework • Iteration : 컬렉션에 저장되어 있는 엘리먼트를 검색하는 절차 • Iterator 인터페이스 : 컬렉션에 저장된 엘리먼트를 순차적으로 하나씩 접근하고자 할 때 사 • Set 계열 : Collection 인터페이스에 정의된 iterator() 메서드를 통하여 Iterator 객체 를 반 환 받아 사용 • List 계열 : listIterator() 메서드를 통해 ListIterator 객체를 반환 받아 사용 • Iterator 인터페이스의 주요 메서드 • boolean hasNext() • E next() • void remove()
  • 217. 217JavaSpecialist.co.kr hashCode(), equals() 를 이용한 객체 동등비교 2. 객체 비교 • public boolean equals(Object obj) • public int hashCode()
  • 218. 218JavaSpecialist.co.kr 크기 비교 2. 객체 비교 Comparable Collections.sort() 사용시 TreeSet 기본 생성자 사용시 compareTo() 재정의 기본 정렬 기준 구현 Comparator TreeSet 에 add 할 때 내가 원하는 방식으로 정렬되게 할 때 TreeSet(Comparator 객체 ) 생성자 사용 compare() 메서드 재정의 추가 정렬 기준 구현
  • 223. 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 객체의 멤버 비교 값 리턴 ; } }
  • 224. 224JavaSpecialist.co.kr 제네릭 클래스 (generic class) 3. 제네릭과 형 안정성
  • 225. 225JavaSpecialist.co.kr 제네릭 클래스 (generic class) 3. 제네릭과 형 안정성
  • 230. 230JavaSpecialist.co.kr "Hidden" 정적 메서드 4. Typesafe enum • values() : enum 에 가능한 모든 값의 배열을 반환 • valueOf() : 제공된 문자열에 대한 enum 을 반환
  • 231. 231JavaSpecialist.co.kr 열거데이터의 매핑 4. Typesafe enum 메서드를 갖는 enum enum 추상 메서드 생성자를 갖는 enum
  • 235. 235JavaSpecialist.co.kr 요구사항 고객관리 프로그램 II 고객의 정보는 이름 , 성별 , 이메일 , 출생년도가 있습니다 . 고객의 정보를 입력 받아 리스트 (List) 에 저장해야 합니다 . 이름은 문자열로 저장하며 , 성별은 남자 는 M, 여자는 F 로 저장합니다 . 이메일은 문자열로 저장하며 태어난 연도는 정 수로 저장합니다 . 고객 관리 프로그램은 고객의 정보를 저장 , 조회 , 수정 , 삭제할 수 있는 기능이 있어야 합니다 . 고객 정보를 파일에 저장하는 기능을 구현하지 않아도 됩니다 . I 를 눌러 고객의 정보를 입력 받도록 하며 , 저장된 고객 정보는 P 또는 N 을 눌 러 이전 고객정보 또는 다음 고객정보를 조회할 수 있어야 합니다 . 조회한 고객 정보는 U 를 눌러 새로운 정보로 수정할 수 있어야 합니다 . D 를 누르면 조회한 고객 정보를 배열에서 삭제해야 합니다 . 프로그램의 종료는 Q 를 누릅니다 . 객체지향 개념을 적용하여 확장성을 고려한 애플리케이션이 되도록 해야 합니다 .
  • 236. 236JavaSpecialist.co.kr Customer & CustomerManager 고객관리 프로그램 II Model class View & Controller class
  • 237. 237JavaSpecialist.co.kr ArrayList 를 이용한 데이터 관리 고객관리 프로그램 II static ArrayList<Customer> custList = new ArrayList<>(); 고객정보 추가 : custList.add(cust); 고객정보 삭제 : custList.remove(index); 고객정보 조회 : Customer cust = custList.get(index);
  • 238. 238JavaSpecialist.co.kr 13 IO Programming 1. 스트림 2. 입 / 출력 클래스 3. 입 / 출력과 관련된 클래스들 4. 객체 직렬화 Chapter
  • 242. 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) { … }
  • 243. 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 방금 읽 은 데이 터 직전에 읽은 데이터
  • 244. 244JavaSpecialist.co.kr 필터 스트림 클래스 2. 입 / 출력 클래스 Node streamNode streamNode streamNode stream Filter streamFilter streamFilter streamFilter streamnodenodenodenode readXxx()readXxx()readXxx()readXxx()
  • 247. 247JavaSpecialist.co.kr 3. 입 / 출력 관련 클래스
  • 248. 248JavaSpecialist.co.kr File 클래스 3. 입 / 출력 관련 클래스 File : 로컬의 파일을 파일 참조 할 수 있는 객체
  • 249. 249JavaSpecialist.co.kr URL 3. 입 / 출력 관련 클래스 인터넷상에 있는 주소 (URL) 를 참조 할 수 있는 클래스 // 브라우저가 프락시서버를 사용하는 환경에서 실행 방법은 //Run -> Run Configurations -> Arguments -> //VM Arguments -> -Dhttp.proxyHost=12.26.226.2 -Dhttp.proxyPort=8080
  • 250. 250JavaSpecialist.co.kr RandomAccessFile 3. 입 / 출력 관련 클래스 접근 모드 r 은 읽기 전용 , rw 는 읽기 쓰기 가능 파일의 임의 위치에 접근할 수 있는 클래스
  • 252. 252JavaSpecialist.co.kr 고객의 정보를 파일에 저장하는 방법 4. 객체 직렬화 1. byte 단위로 저장할 것인가 ? char 단위로 저장할 것인가 ? • byte 단위로 저장하려면 FileOutputStream/FileInputStream • char 단위로 저장하려면 FileWriter/FileReader 2. 어떤 형식으로 저장할 것인가 ? 고객의 정보가 이름 , 주소 , 이메일 , 나이 가 있다고 가정했을 때 단순 텍스트로 저장한다 . 홍길동 , 서울 ,hong@test.com,30n 길남 , 부산 ,kil@homg.com,25 저장할 때 필드 구분자와 컬럼 구분자를 추가해야 하고 읽은 정보를 잘라서 형변 환 해야 한다 .  범용적이지만 불편하다 .( 구분자를 이용한 문자열분리와 , 형변 환 ) DataOutputStream 클래스를 이용해서 저장한다 . 필드 구분자와 컬럼 구분자를 추가할 필요가 없다 . 읽은 정보를 형변환 할 필요 없다 . 단점 : Write 했던 순서대로 읽어야 한다 . 자바에서만 사용할 수 있다 . 객체 직렬화를 이용해서 저장한다 . 직렬화 가능한 클래스여야 한다 . 자바에서만 사용할 수 있다 .
  • 253. 253JavaSpecialist.co.kr 단순 텍스트로 쓰기 4. 객체 직렬화 import java.io.FileOutputStream; public class TextWriteApplication { public static void main(String[] args) { String data1 = " 홍길동 , 서울 ,hong@test.com,30"; String data2 = " 길남 , 부산 ,kil@homg.com,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) 필드 구분자 : 콤마 (,)
  • 254. 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) {} } } } 데이터의 행과 필드를 구분해서 읽고 형변환 해 줘야 한다 .
  • 255. 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("hong@test.com"); dos.writeInt(30); dos.writeUTF(" 길남 "); dos.writeUTF(" 부산 "); dos.writeUTF("kil@homg.com"); 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) {} } } } 필드 구분자나 레코드 구분자를 추가 하지 않아도 된다 .
  • 256. 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 해야 한다 .
  • 257. 257JavaSpecialist.co.kr 객체 직렬화 4. 객체 직렬화 • Serializable  직렬화 클래스가 구현해야 할 인터페이스  마커 인터페이스임  객체 단위로 파일에 저장할 수 있도록 함 • 객체 저장  ObjectOutputStream 의 writeObject() 메서드 이용 • 객체 읽기  ObjectInputStream 의 readObject() 메서드 이용 • transient  객체 직렬화에서 제외할 변수에 선언 • serialVersionUID  직렬화 클래스 구조가 변경될 경우 불러오지 못하는 예외를 방지하기 위해 선언  private static final long serialVersionUID = 5296081940199618979L;
  • 258. 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 + "]"; } }
  • 259. 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(" 홍길동 ", " 서울 ", "hong@test.com", 30); Member m2 = new Member(" 길남 ", " 부산 ", "kil@homg.com", 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) {} } } } 엔티티 객체를 직접 파일시스템에 저장할 수 있 다 . 컬렉션 객체에 저장되어 있을 경우에는 컬 렉션 객체를 직렬화 할 수 있다 .
  • 260. 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) {} } } } 엔티티 객체를 직접 파일시스템에 저장할 수 있 다 . 컬렉션 객체에 저장되어 있을 경우에는 컬 렉션 객체를 직렬화 할 수 있다 .
  • 261. 261JavaSpecialist.co.kr 고객 정보 저장하기 고객의 정보를 관리하는 프로그램을 고객의 정보를 저장하도록 수정하겠습니다 . 객체 직렬화를 이용하여 ArrayList 객체를 파일에 저장한 다음 프로그램이 시작되 면 파일에 저장되어 있는 정보를 로드하여 다시 조회 할 수 있도록 합니다 .
  • 262. 262JavaSpecialist.co.kr 14 기본 API 클래스 1. 문자열 클래스 2. 정규 표현식 3. Object 클래스 4. 날짜 클래스 5. 지역과 시간대 클래스 6. 형식화 클래스 7. 수학관련 클래스 Chapter
  • 266. 266JavaSpecialist.co.kr split() 1. 문자열 클래스 • 정규표현식을 이용 하여 문자열을 분리 • JDK 1.4 부터 사용 가능
  • 268. 268JavaSpecialist.co.kr 정규 표현식 기본 개념 2. 정규 표현식
  • 281. 281JavaSpecialist.co.kr SimpleDateFormat 6. 형식화 클래스 Asia/Seoul 타임존에서 한국표준시 2017 년 3 월 13 일 오후 10 시 16 분 55 초
  • 283. 283JavaSpecialist.co.kr ChoiceFormat 6. 형식화 클래스 ChoiceFormat 를 작성할 때는 제한 (limit) 배열과 형식 (format) 배열을 지정
  • 286. 286JavaSpecialist.co.kr Math 7. 수학관련 클래스 지수 , 로그 , 제곱근 및 삼각함수와 같은 기본 숫자 연산을 수행하기 위한 메서드가 포함

Editor's Notes

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