Microsoft PowerPoint 자바-출석수업

Similar documents
Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Microsoft PowerPoint - 2강

JAVA PROGRAMMING 실습 08.다형성

gnu-lee-oop-kor-lec06-3-chap7

PowerPoint Presentation

PowerPoint Presentation

JAVA PROGRAMMING 실습 09. 예외처리

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

슬라이드 1

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint Presentation

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 02. 표준 입출력

Cluster management software

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint - CSharp-10-예외처리

PowerPoint Presentation

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

PowerPoint Presentation

쉽게

Microsoft PowerPoint - chap06-2pointer.ppt

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

PowerPoint 프레젠테이션

10.0pt1height.7depth.3width±â10.0pt1height.7depth.3widthÃÊ10.0pt1height.7depth.3widthÅë10.0pt1height.7depth.3width°è10.0pt1height.7depth.3widthÇÁ10.0pt1height.7depth.3width·Î10.0pt1height.7depth.3width±×10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width¹Ö pt1height.7depth.3widthŬ10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width½º, 10.0pt1height.7depth.3width°´10.0pt1height.7depth.3widthü, 10.0pt1height.7depth.3widthº¯10.0pt1height.7depth.3width¼ö, 10.0pt1height.7depth.3width¸Þ10.0pt1height.7depth.3width¼Ò10.0pt1height.7depth.3widthµå

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

02 C h a p t e r Java

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

Microsoft PowerPoint - C++ 5 .pptx

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

No Slide Title

(Microsoft PowerPoint - java2-lecture3.ppt [\310\243\310\257 \270\360\265\345])

슬라이드 1

제11장 프로세스와 쓰레드

PowerPoint Presentation

PowerPoint Template

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 02. 표준 입출력

OCW_C언어 기초

PowerPoint Presentation

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

JAVA PROGRAMMING 실습 05. 객체의 활용

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

Java ...

Microsoft PowerPoint - lec2.ppt

슬라이드 1

Microsoft PowerPoint - chap03-변수와데이터형.pptx

Microsoft PowerPoint - lec12 [호환 모드]

쉽게 풀어쓴 C 프로그래밍

슬라이드 1

Microsoft PowerPoint - chap11

4장.문장

PowerPoint Presentation

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

Microsoft PowerPoint - [2009] 02.pptx

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

07 자바의 다양한 클래스.key

슬라이드 1

PowerPoint Template

PowerPoint Presentation

Design Issues

JAVA PROGRAMMING 실습 07. 상속

Microsoft PowerPoint - java2 [호환 모드]

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

C++ Programming

Microsoft PowerPoint - Lect04.pptx

Network Programming

PowerPoint Presentation

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Microsoft PowerPoint - 04-UDP Programming.ppt

Semantic Consistency in Information Exchange

PowerPoint 프레젠테이션

Microsoft PowerPoint - ch07 - 포인터 pm0415

PowerPoint 프레젠테이션

예외 예외정의예외발생예외처리예외전파 단정 단정의선언 단정조건검사옵션 2

A Tour of Java V

PowerPoint Presentation

JAVA PROGRAMMING 실습 02. 표준 입출력

PowerPoint 프레젠테이션

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint - chap05-제어문.pptx

TEST BANK & SOLUTION

설계란 무엇인가?

12-file.key

Microsoft PowerPoint 장강의노트.ppt

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

Microsoft PowerPoint - Java7.pptx

쉽게 풀어쓴 C 프로그래밍

Transcription:

Java 프로그램의실행 1 강. Java 와객체지향프로그래밍 Java VM 컴퓨터과학과김희천교수 2017 년 5 월 24 일 501 호김룡 Java 소스프로그램의확장자는.java 바이트코드 Java 소스를컴파일한결과물 확장자는.class 이며클래스파일이라고도함 Java VM 에서실행가능한코드 write once, run anywhere. 애플리케이션과애플릿 Java 플랫폼 애플리케이션 Java 플랫폼에서바로실행되는프로그램 애플릿 HTML 웹페이지에포함되어웹브라우저를통해실행웹브라우저는 Java VM 을포함함 <APPLET CODE="HelloApplet.class" WIDTH=200 HEIGHT=100> </APPLET> 플랫폼 (platform) 프로그램의실행을위한하드웨어와소프트웨어환경 Java 플랫폼은 Java 프로그램의개발과실행을위한환경 운영체제에맞는 Java 플랫폼을설치해야함 C 프로그램 Java 프로그램 Java 플랫폼 운영체제 (Windows, Unix, LINUX 등 ) 컴퓨터시스템 (Hardware)

Java 플랫폼의구성 JDK 의설치 Java VM Java 프로그램의실행환경을제공하는가상기계 Java 프로그램의구동엔진실행에필요한사항을관리메모리정리를자동으로수행 Java API 프로그램의개발에필요한클래스라이브러리패키지 ( 클래스묶음 ) 들이계층구조로분류되어있음 Java 홈페이지에서다운로드받아설치 http://www.oracle.com/technetwork/java/javase/ downloads/index.html Java SE Development Kit(JDK) 8u111 / 8u112 를설치 자신이사용하는운영체제에맞는것을선택환경변수 PATH를수정 C:\Program Files\Java\jdk1.8.0_101\bin 을추가 환경변수 JAVA_HOME 을생성 C:\Program Files\Java\jdk1.8.0_101 를대입 Eclipse 의설치 Eclipse 홈페이지에접속 http://www.eclipse.org/downloads/eclipsepackages/ Eclipse IDE for Java Developers 압축파일을다운받음 eclipse-java-neon-2-win32.zip 적당한곳에압축파일을풀어줌 예 : D:\eclipse 간단한 Java 프로그램 Hello 애플리케이션 대소문자구분 주석, public class, main( ) 메소드, 출력문 /** * The Hello class implements an application that * simply prints Hello, Java Application! to standard output. */ public class Hello { public static void main(string args[ ]) { // main method /* Display the string */ System.out.println("Hello, Java Application!");

Java 프로그램살펴보기 (1) Java 프로그램살펴보기 (2) 주석 /* */ 사이의내용을무시함 /** */ javadoc을이용한 API 문서 만들기 클래스의 // 이후정의내용을무시 출력 System.out 실행 표준출력을담당하는객체 print( ) 또는 println( ) 을수행함 public class Hello { main( ) { public class는파일에최대 1개파일이름은 퍼블릭클래스이름.java main( ) 메소드의형식은 public static void main(string[ ] args) 프로그램작성컴파일 실행 Hello.java로저장함 > javac Hello.java 클래스이름.class 가만들어짐 > java Hello main( ) 메소드가실행됨 객체지향프로그램 Java 프로그램 클래스가프로그램구성의기본단위 데이터 ( 필드 ) 와알고리즘 ( 메소드 ) 이클래스에캡슐화되어있음 객체들이만들어지고객체들간의상호작용으로프로그램이동작함 C 프로그램과 Java 프로그램 (1) 성적처리를위한 C 프로그램 int e[2]; int m[2]; // 영어성적을위한변수 // 수학성적을위한변수 void input_grade( ) { // 영어, 수학성적을입력받는함수 e[0] = 90; // 첫번째학생의영어성적 e[1] = 80; // 두번째학생의영어성적 m[0] = 85; // 첫번째학생의수학성적 m[1] = 80; // 두번째학생의수학성적 void output_grade( ) { // 총점출력하는함수 printf("%d, %d", e[0]+m[0], e[1]+m[1]); void main(void) { input_grade( ); output_grade( );

C 프로그램과 Java 프로그램 (2) 성적처리를위한 Java 프로그램 class Grade { int e; // 영어성적을위한변수 int m; // 수학성적을위한변수 void output_grade( ) { // 총점을구하는메소드 System.out.println(e+m); public class GradeOutput { public static void main(string args[ ]) { Grade g1, g2; //2 명의성적을표현하는객체 g1 = new Grade( ); g2 = new Grade( ); // 점수입력 g1.e = 90; g1.m = 85; g2.e = 80; g2.m = 80; 2 강. Java 기본문법 (1) g1.output_grade( ); g2.output_grade( ); 컴퓨터과학과김희천교수 2017 년 5 월 24 일 501 호김룡 Java 프로그램 식별자 (1) 성적처리를위한 Java 프로그램 class Grade { int e; int m; // 영어성적을위한변수 // 수학성적을위한변수 void input_grade(int a, int b) { // 성적입력 e = a; m = b; void output_grade( ) { // 총점출력 System.out.println(e+m); public class GradeOutput { public static void main(string args[ ]) { Grade g1, g2; //2명의성적을표현하는객체 g1 = new Grade( ); // 객체생성 g2 = new Grade( ); g1.input_grade(90, 85); // 성적입력 g2.input_grade(80, 80); g1.output_grade( ); g2.output_grade( ); // 총점출력 클래스, 변수, 메소드, 레이블등의이름 프로그래머가만드는이름 작명규칙 대소문자구분 길이에제한없음 영대소문자, 한글, 숫자, _, $ 를사용 숫자로시작할수없음 키워드, true, false, null은불가 잘못작명된예 2002WorldCup, my#class class, World Cup, lee@knou public class HelloApplication { static String szmsg = "Hello, Java!"; public static void main(string args[]) { int ntest = 0; System.out.println(szMsg);

식별자 (2) 키워드 식별자를만들때의관례 클래스 : 첫자는대문자, 단어의첫글자는대문자, 나머지는소문자 Car, HelloWorld, MyClass, String 메소드, 변수 ( 필드 ) : 위와같으나첫자가소문자 speed, mycar, geararea( ) 상수 : 모든문자를대문자로표기하고, 단어사이에 _ 를넣어구분 static final int NUM_GEARS = 6; 변수의경우자료형을표시하기위한접두어를붙이기도함 int nspeed; String szstr1; 의미가미리정해진단어 프로그램에서정해진의미로만사용해야함 변수와자료형 변수의사용범위 변수를선언할때, 저장되는값의자료형을선언 메소드를선언할때, 반환값의자료형을선언 자료형에따라적용가능한연산이다름변수의종류 지역변수와파라미터 선언된곳부터해당블록이종료될때까지유효함 메소드가실행될때만들어지고끝나면없어짐 지역변수는초기값을지정한후사용해야함 지역변수선언에서접근제어자를사용하지않음 인스턴스변수클래스변수지역변수파라미터 ( 클래스정의에서 static 이아닌필드 ) 객체가소유하는변수 ( 클래스정의에서 static 필드 ) 객체가공유하는변수 메소드내부에서선언된변수 메소드호출시전달하는값을저장하기위한변수 데이터필드 ( 인스턴스변수 or 클래스변수 ) 선언된클래스내부에서사용가능 클래스외부에서의사용여부는접근제어자 (access modifier) 에따라다름 예 : class Circle { protected int radius;

Java 의기본자료형 리터럴 (1) 분류 키워드 길이 (byte) 값의범위 문자 char 2 \u0000 ~ \uffff 논리 boolean 1 true 또는 false byte 1-128~127 정수 short 2-32768~32767 int 4-2 31 ~2 31-1 long 8-2 63 ~2 63-1 실수 float 4 (+/-) 약1.4E-45~3.4E38 double 8 (+/-) 약4.9E-324~1.8E308 상수 리터럴 ( 실제데이터값 ) 또는값이변하지않는변수 final int nconst = 3; // 선언시초기값을지정 정수형리터럴 byte, short, int, long l 이나 L 로끝나면 long 형, 나머지는 int byte 와 short 는허용범위안에서 int 와호환됨 26L, 26, 0b11010, 032, 0x1a 리터럴 (2) 참조형 실수형리터럴 소수점이있는숫자 f 나 F 로끝나면 float 형, 나머지는 double 형 123.4f, 123.4, 1.234e2 문자형리터럴 1 개의문자를표현하고 16 비트 UNICODE 로인코딩됨 단일따옴표를사용하고 Unicode 사용가능 \u0000 ~ \uffff (0~65536) 의수와호환됨 (char)65, A, \u0041, 가, \uac00 기본형을제외한모든자료형 참조값 ( 주소 ) 을가지는자료형 배열, 클래스형등 int anarray[ ]; Circle mycircle; String szstr; 10 Java 참조형변수는저장공간에참조값을저장함 실제데이터는별도의공간에저장됨 기본형변수는저장공간에값자체를저장함 10

형변환 묵시적자료형의변환 작은타입에서큰타입으로는자동형변환 byte > short > int >long > float > double 개발자 > 직원 > 인간 > 포유류 예 double d = 5; // 대입문 System.out.println( j +10); // 수식 double res = Math.sqrt(2); // 메소드호출 명시적자료형의변환 큰타입에서작은타입으로변환할때는명시적형변환이필요 문법은 ( 자료형 ) 피연산자 예 float f = (float)5.5; 연산자의종류 구분 연산자예 산술연산자 + - * / % 단항연산자 + - ++ -- 비교연산자 > >= < <= ==!= instanceof 논리연산자 && 단항! 삼항?: & ^ 비트연산자 비트논리 & ^ ~ 비트이동 << >> >>> 대입연산자 = += -= *= /= %= &= ^= = >>= <<= >>>= 형변환연산자 ( 자료형 ) 기타 [ ] ( ). 명령행매개변수 문장의종류 프로그램을실행할때전달하는인자 main( ) 함수에전달되는인자 문자열로전달됨 > java CommandInputTest Kim 123 public class CommandInputTest { public static void main(string args[ ]) { System.out.println(args[0]); int n = Integer.parseInt(args[1]); System.out.println(n); 수식문변수선언문제어문기타 블록문 { 레이블문 레이블 : 문장 예외처리문 try-catch 문 동기화문 synchronized 문

제어문 프로그램의실행은기본적으로위에서아래로순차실행됨 제어문은실행흐름을바꿈 제어문의종류 선택문 조건에따른문장의선택 if 문, switch 문 선택문 (1) if문 if (boolean-수식) 문장 if-else문 if (boolean-수식) 문장 else 문장 if와 else의짝짓기 else는자기짝이없는가장가까운if와짝을이룸 반복문 점프문 조건에따른문장의반복 for 문, while 문, do-while 문 분기문 return 문, break 문, continue 문 int a = 2; int b = 2; if (a == 1) if (b == 2) System.out.println("a was 1 and b was 2."); else System.out.println("a wasn't 1."); 선택문 (2) 반복문 switch문 다중선택구조 case 조건은정수 (long형제외 ) 와호환되거나 String 값 default는생략가능하며어떤 case에도해당되는않는경우매칭됨 만족되는 case를실행한후, break문을만날때까지계속실행 switch(n) { case 10: System.out.println("10입니다."); break; case 20: case 30: System.out.println("20이거나 30입니다."); break; default: System.out.println(" 모르겠습니다."); break; for-each문 개선된 for문 배열이나컬렉션의원소들을차례로다룰때편리 형식은 for ( 변수선언 : 배열 ) { 문장 public class ForEachDemo { public static void main(string[] args) { int[ ] arrayofints = {32, 87, 3, 589, 12, 1076, 2000, 8; for (int element : arrayofints) { System.out.print(element + " "); System.out.println();

점프문 (1) break 문 break 문을포함하는가장가까운 switch 문, for 문, while 문, do-while 문의실행을끝냄 반복문이나 switch 문을빠져나갈때사용 형식은 break; 레이블을사용하여특정반복문을빠져나갈수있음 중첩 for 문에서바깥 for 문을종료하는경우 이경우형식은 break 레이블 ; 반복문에레이블을지정하려면레이블 : 반복문 점프문 (2) continue 문 반복문안에서사용함 가장가까이있는반복문의다음반복으로즉시제어를이동하기위한것 형식은 continue; 레이블을사용하여특정반복문의다음반복으로이동할수있음 중첩 for문에서바깥 for문의다음반복으로갈때 이경우형식은 continue 레이블 ; 배열 3 강. Java 기본문법 (2) 같은자료형의원소를정해진개수만큼가지고있는객체배열의크기는배열이생성될때정해지고바뀌지않음숫자인덱스 ( 첨자 ) 를사용하여특정원소를다룸 컴퓨터과학과김희천교수 2017 년 5 월 24 일 501 호김룡 배열의선언 선언할때크기를지정할수없음 형식은자료형 [ ] 변수이름 ; 또는자료형변수이름 [ ]; 예 int[ ] a; int b[ ]; int[ ][ ] c; int d[ ][ ];

배열의사용 (1) 배열의선언과초기화 선언과동시에중괄호를이용하여초기값을지정 자동으로메모리공간이확보됨 예 int a[ ] = {2, 3, 5, 7, 11; // 선언과초기화 2 3 5 7 11 a a[0] a[1] a[2] a[3] a[4] int b[ ]; b = {4, 5, 6; // 오류 int anarray3[ ][ ] = {{1, 2, 3, {4, 5, 6; 배열의사용 (2) 배열의선언과메모리공간의생성 new 연산자를이용 배열의크기를정하고메모리공간을확보 메모리의주소값을리턴함 원소가숫자인경우 0, 참조형인경우 null 로자동초기화 예 int a[ ] = new int[3]; // 선언과생성 int b[ ]; b = new int[10]; int anarray4[ ][ ] = new int[3][2]; 배열의크기 배열은크기를가지는내장속성 length를가짐 사용법은배열이름.length public class ArrayTest { public static void main(string args[ ]) { int twoarray[ ][ ] = { {0, 1, {10, 11, 12 ; for(int i = 0;i < twoarray.length;i++) for(int j = 0;j < twoarray[i].length;j++) System.out.println( twoarray[i][j]); twoarray[0].length twoarray.length [0][0] [0][1] [1][0] [1][1] [1][2] twoarray[1].length String 클래스 문자열을표현하고처리하기위한참조형 String 형의변수는기본형변수처럼사용할수있음 문자열리터럴 이중따옴표를사용함 예 String s1 = Java ; String s2 = new String( Java ); null 이라는특별한리터럴이있음 참조형변수의값이될수있음 if ( s1!= null ) { false true

문자열의 + 연산 두문자열을연결하는것 ( 문자열 + 기본형 ) or ( 문자열 + 다른참조형 ) 도가능 기본형과참조형값은문자열로형변환가능 print( ) 나 println( ) 에서자주사용됨 1 개매개변수를문자열로바꾸어출력함 System.out 은화면출력을위한객체 Scanner 클래스 키보드나파일로부터다양한자료를입력받을때사용 기본적으로공백문자로구분되는단어단위로입력됨 클래스에관한설명을보려면아래 API 설명페이지를참조 http://docs.oracle.com/javase/8/docs/api/ 키보드에서입력받을때 System.in 은키보드입력을위한객체 System.in 을이용하여 Scanner 객체를만들고사용함 System.out.println("result=" + " " + result); System.out.println('A'+ 0); //65 System.out.println("A" + 0); Scanner sc = new Scanner(System.in); String name = sc.next( ); Scanner 클래스를사용한입력 (1) Scanner 클래스의입력용메소드 boolean hasnext( ) - 다음단어가있으면 true를반환 String next( ) 단어를읽어문자열로반환 boolean hasnextint( ), int nextint( ) boolean hasnextdouble( ), double nextdouble( ) boolean hasnextline( ), String nextline( ); Scanner s = new Scanner(System.in); String name = s.nextint( ); Scanner 클래스를사용한입력 (1) import java.util.scanner; public class ScannerDemo2{ public static void main(string args[]) { Scanner sc = new Scanner(System.in); while(sc.hasnextint()) { System.out.println(sc.nextInt());

클래스정의 클래스의정의와클래스의사용 클래스정의문법 [ 접근제어자 ] class 클래스이름 [extends 부모클래스이름 ] [implements 인터페이스이름 ] { 데이터필드선언 생성자선언메소드선언 클래스접근제어자 생략, public, protected, private 또는 abstract, final 클래스의정의 데이터필드와메소드를정의 객체가가지는인스탄스변수와인스탄스메소드 클래스가가지는클래스변수와클래스메소드 메소드는저장된데이터를이용해기능을수행 객체의상태는데이터필드로, 행위는메소드로구현됨 클래스의사용 상속받아클래스를정의하거나객체를생성하는경우 클래스는객체의자료형 클래스의접근제어자 (1) 클래스의접근제어자 (2) 클래스를사용할수있는범위를제한하는것 private 과 protected 는특별한경우에만사용함 접근제어자와의미 접근제어자가생략된 class 는같은패키지에있는다른클래스에서사용가능 ( 패키지접근수준 ) public class 는모든클래스즉, 어디서나사용가능 class Circle { private int r; public Circle(int a) { r = a; public double getarea( ) { return r * r * 3.141592; public class CircleArea2 { public static void main(string args[ ]) { Circle c = new Circle(5); //System.out.println(c.r); System.out.println(c.getArea( ));

데이터필드의접근제어자 (1) 데이터필드와접근제어자 (2) 데이터필드를사용할수있는범위를제한하는것 ( 정보은닉 ) 메소드의접근제어자도의미가같음 접근제어자의의미 아래 4 개의클래스에서 Alpha 클래스의어떤멤버를사용할수있는가? 접근제어자가생략된필드는같은패키지에있는다른클래스에서사용가능 private 필드는같은클래스에서만사용가능 protected 필드는같은패키지에서그리고자식클래스에서사용가능 public 필드는모든클래스에서사용가능 Alpha 클래스의 멤버 Alpha Beta ( 같은패키지 ) AlphaSub ( 자식 ) Gamma ( 다른패키지 ) public 사용가능 사용가능 사용가능 사용가능 protected 사용가능 사용가능 사용가능 생략사용가능사용가능 private 사용가능 메소드정의 4 강. 클래스와상속 컴퓨터과학과김희천교수 2017 년 5 월 24 일 501 호김룡 문법 헤더와몸체로구성 [ 접근제어자 ] 반환형메소드이름 ([ 자료형인자 [, 자료형인자 ]]) [throws 예외이름 ] { 문장 public double getarea( ) { return radius * radius * PI; public void setradius(int r) { radius = r;

생성자 (1) 생성자 (2) class Circle { private int r; public Circle(int a) { r = a; public double getarea( ) { return r * r * 3.141592; public class CircleArea2 { public static void main(string args[ ]) { Circle c = new Circle(5); //System.out.println(c.r); System.out.println(c.getArea( )); 객체가생성될때자동으로실행되는메소드 객체의필드값을초기화하거나메모리할당등의작업객체생성방법은 new 클래스이름 ( 인자 ) Circle c = new Circle(5); new 연산자를이용하여객체를생성 ( 메모리할당 ) 하고 생성자가호출 ( 데이터초기화 ) 되면서 객체의참조값을변수에대입 (=) 생성자정의 기본생성자 보통메소드와정의방법이다름 생성자는객체가생성될때자동호출됨 인자가없는생성자를의미 디폴트 (default) 생성자 정의방법 생성자이름은클래스이름과같음 반환형을선언하지않음 여러생성자를정의할수있음 ( 생성자오버로딩 ) 인자의개수와인자의자료형으로구분 접근제어자는보통 public 클래스정의에생성자정의가전혀없으면컴파일러가다음과같은것을자동으로만들어줌 public Cirle( ) { 여기서자동으로부모클래스의생성자를자동호출함 super( ) 부모클래스에서기본생성자의존재를확인해야함

클래스의사용 객체의사용 상속을위해사용하는것 class CSub extends CSuper { 변수를선언하고객체를생성 클래스참조형변수의선언 Circle c; c = new Circle(5); 객체변수와점 (.) 연산자를사용하여멤버에접근 객체가소유하는데이터를읽거나쓰기 객체를이용하여메소드를호출하기 예 c.r = 5; //c 의 r 을변경 c.getarea( ) //c 에게 getarea( ) 실행을요청 public double getarea( ) { return this.r * this.r * 3.141592; static 필드와 static 메소드 (1) static 필드 정적필드 or 클래스변수 클래스의모든객체가공유하는데이터 객체의생성이없어도항상사용가능 어떤객체도값을변경할수있음 사용방법은클래스이름. 정적필드 객체변수. 정적필드도가능 c1 c2 c1.x c1.y c1.radius 0 0 10 Circle.count 2 static 필드와 static 메소드 (2) static 메소드 정적메소드 or 클래스메소드 객체와무관하게호출되고실행됨 메소드몸체에서 this를사용할수없음 static 필드와인자를가지고작업함 사용방법은클래스이름. 정적메소드 ( ) Math.sqrt(2.0); Integer.parseInt( 120 ); 0 0 5

final 필드와 final 메소드 final 필드 상수데이터를선언 선언할때초기값을지정해야함 자주 static과함께사용됨 final static double PI = 3.141592; final 메소드 자식으로의상속은가능하나재정의할수없는메소드 객체초기화 (1) 객체를생성할때, 데이터필드에초기값을지정하는것 클래스변수는프로그램시작시에자동초기화됨 데이터필드는자동으로초기값이주어질수있음 방법 ( 아래의순서대로실행됨 ) 데이터필드의선언문에서초기화 초기화블록 클래스몸체내임의위치에포함 초기값지정을위한코드 생성자실행전에수행됨 static 필드는 static 블록을사용 생성자 class IniTest { int nvalue = 1; { nvalue = 2; public IniTest( ) { nvalue = 3; 객체초기화 (2) 메소드오버로딩 import java.awt.point; class Rectangle { public int width = 0; public int height = 0; public Point origin; public Rectangle( ) { origin = new Point(0, 0); public Rectangle(Point p, int w, int h) { origin = p; width = w; height = h; public class Test { public static void main(string args[ ]) { Point originone = new Point(23, 94); Rectangle rectone = new Rectangle(originOne, 100, 200); Point 객체 x originone 23 y 94 rectone Rectangle 객체 origin width 100 height 200 인자의개수나인자의자료형이다르면같은이름의메소드를한클래스에서중복정의할수있음 인자의개수나인자의자료형으로구분할수있어야함 메소드를호출할때, 가장가까운메소드가호출됨 예 System.out.println( ); // 인자없음 System.out.println( 문자열 "); // 인자는 String System.out.println(241); // 인자는 int System.out.println(34.5); // 인자는 double

클래스와객체의사용예 클래스의재사용 class Cylinder { private Circle c; // 원 private int h; // 높이 public Cylinder(Circle a, int b) { c = a; h = b; public double getvolume( ) { return c.getarea( ) * h; public class CylinderVolume { public static void main(string args[]) { Circle c = new Circle(7); int h = 8; Cylinder cy = new Cylinder(c, h); System.out.println(cy.getVolume( )); 합성 기존클래스를새로운클래스의멤버로사용 has-a 관계 class Line { Point begin, end; 상속 기존클래스 ( 부모 ) 를사용하여새로운클래스 ( 자식 ) 를정의 코드의중복작성을줄이고프로그램의확장성이좋아짐 기존클래스를확장 or 특화 is-a 관계 클래스의상속 (1) 클래스의상속 (2) 상속은부모클래스와자식클래스간의관계 자식클래스가부모클래스의필드와메소드를상속받음 키워드 extends 를사용함 class Manager extends Employee { 자식클래스에서메소드오버라이딩가능 반환형, 이름, 매개변수가일치해야함 접근제어자는일치하거나접근범위가넓어져야함 클래스의상속은단일상속만가능 인터페이스상속의경우는다중상속가능 class CSuper { private int f1; public int f2; public void setprivate( ) { f1 = 10; public void setpublic( ) { f2 = 20; private void mprivate( ) { f1 = 30; class CSub extends CSuper { private int f3; public int f4; public class InheritTest { public static void main(string args[ ]) { CSub sub = new CSub( ); sub.f1 = 40; // 오류 sub.f2 = 50; sub.f3 = 60; // 오류 sub.f4 = 70; sub.setprivate( ); sub.setpublic( ); sub.mprivate( ); // 오류

메소드오버라이딩 (1) 메소드오버라이딩 (2) 부모로부터상속받은메소드의몸체를자식클래스에서재정의하는것 부모와자식에서같은이름의메소드가다른기능을수행하게됨 오버라이딩방법 메소드의이름, 인자의개수와자료형, 반환형이같은메소드를정의 반환형은서브타입 ( 상속관계에서자식클래스 ) 도가능함 접근제어자의가시성 ( 접근범위 ) 은같거나커져야함 public 인경우 public 만가능 class Shape { public double getarea(double h, double w) { return h * w; class Triangle extends Shape { public double getarea(double h, double w) { return h * w * 0.5; public class OverridingTest { public static void main(string args[ ]) { Triangle t = new Triangle( ); System.out.println( t.getarea(3.0, 4.0) ); this 메소드실행시, 현재객체에대한참조값을가지고있음 숨은인자로 this가메소드에전달됨 c1.display( ) 과 c2.display( ) 의결과가다른이유임 인스탄스메소드나생성자에서사용가능 클래스메소드에서사용할수없음 class Circle { public double getarea( ) { return this.radius * this.radius * PI; public void display( ) { System.out.prinln(" 반지름 + this.radius + " 면적 "+ this.getarea( )); super 메소드실행시, 현재객체에대한참조값을가짐 자료형이부모클래스유형임 자식클래스에서인스탄스메소드나생성자에서사용됨 부모클래스에서오버로딩당한메소드를호출하거나상속되었으나감춰진필드에접근할때필요함 super. 메소드 ( 인자 ) super. 필드

this( ) 와 super( ) super 와 super( ) 의사용예 생성자몸체의첫번째문장에서만사용 this( ) 같은클래스의다른생성자를호출하는것 super( ) 부모클래스의생성자를호출하는것 상속받은데이터필드를초기화하기위한것 생성자몸체에서부모클래스생성자의명시적호출이없다면, super( ) 가자동호출됨 public class Cylinder extends Circle { private double height; public Cylinder( ) { super( ); height = 1.0; public Cylinder(double radius, double h) { super(radius); this.height = h; public double getheight( ) { return height; public void setheight(double h) { this.height = h; public double getarea( ) { return 2 * PI*getRadius( ) * height + 2 * super.getarea( ); public double getvolume( ) { return super.getarea( ) * height; public String tostring( ) { return "Cylinder of radius = " + getradius( ) + " height = " + height; 추상메소드 5 강. 인터페이스와다형성 컴퓨터과학과김희천교수 2017 년 5 월 24 일 501 호김룡 몸체의구현이없이형식만존재하는메소드 반환형, 이름, 인자선언만존재함 메소드정의에 abstract 키워드를사용해야함 자식클래스에상속되어몸체의구현이필요함 상반된의미의 final 과함께사용할수없음 abstract public class Shape {... abstract public double getarea( ); // 모양이정해지지않았기때문에면적을계산할수없음

추상클래스 추상클래스의사용 추상메소드를포함하는클래스는반드시추상클래스라야함 물론데이터필드나일반메소드를포함할수있음 객체생성을할수없음 구체적이지못한불완전한클래스라는의미 클래스정의에 abstract 사용해야함 abstract public class Shape { abstract public double getarea( ); Shape s = new Shape( red ); // 컴파일오류 의미적으로유사한클래스를묶고자할때사용 공통으로사용할데이터필드와메소드를정의 추상클래스는불완전한클래스 기능적으로구현하기어려운메소드가존재 추상클래스는자식클래스로상속되어사용됨 자식클래스에서추상메소드를구현 그러면자식클래스는객체생성이가능 자식클래스가추상메소드를구현하지않으면계속해서자식클래스도추상클래스로남음 추상클래스는일반클래스와인터페이스의중간적성격을가짐 Java 의인터페이스 인터페이스정의 100% 추상클래스 모든메소드가추상메소드 (public abstract) 데이터는클래스상수만가능 (public static final) default 메소드와 static 메소드는몸체의구현이필요함 객체생성불가 클래스와마찬가지로참조자료형 인터페이스의이름은보통형용사임 Runnable, Serializable, Comparable 문법은클래스정의와유사함 정의할때키워드 class 대신에 interface 를사용 abstract 는생략하는것이보통임 메소드는자동으로 ( 생략가능 ) public abstract 임 수행할수있는기능의형식만나열한것 default 메소드와 static 메소드도가능 이경우몸체를구현해야함 자동으로 public 임 필드는자동으로 public static final 임 클래스상수만가능함

인터페이스의사용 추상클래스와마찬가지로자식클래스에상속되어사용됨 인터페이스를상속받는자식클래스는모든추상메소드를구현해주어야함 의미적으로는관련이없으나기능적으로유사한클래스들을묶을때사용할수있음 예 : 대소비교가가능한객체들의자료형을묶을때 인터페이스를상속받아자식인터페이스를정의할수있음 인터페이스의확장 인터페이스의상속과구현 여러인터페이스를상속받는다중상속이가능클래스는단일상속만가능 상속 자식인터페이스가부모인터페이스를상속받는경우 extends 를사용 예 interface A extends OtherInterface1 { 구현 (or 상속 ) 자식클래스가부모인터페이스를상속받는경우 자식은부모가나열한기능을구현해야함 implements 를사용 예 class MovablePoint implements Movable { 인터페이스구현예 디폴트메소드 interface Movable { void moveup( ); void movedown( ); void moveleft( ); void moveright( ); public class MovableTest { public static void main(string[] args) { Movable m1 = new MovablePoint(5, 5); System.out.println(m1); m1.moveup( ); System.out.println(m1); m1.moveright( ); System.out.println(m1); class MovablePoint implements Movable { private int x, y; public MovablePoint(int x, int y) { this.x = x; this.y = y; public String tostring( ) { return "Point at (" + x + "," + y + ")"; public void moveup( ) { y++; public void movedown( ) { y--; public void moveleft( ) { x--; public void moveright( ) { x++; Point at (5,5) Point at (5,6) Point at (6,6) 인터페이스에서선언하는메소드에기본구현을넣을수있음 자식클래스에서그대로사용하거나몸체를다시정의해줄수있음 default 를사용하고몸체를구현해줌 인터페이스에나열된기능을확장할때, 기존코드의수정을피하기위함 추상메소드가추가된다면기존인터페이스를구현한클래스를수정해야함 interface DoIt { void dosomething( ); int dosomethingelse(string s); // 아래를새로추가한다면? default boolean diditwork(int i, String s) {

추상클래스 / 인터페이스 / 클래스의형변환 인터페이스와클래스는모두사용자정의형 extends와 implements에따라상위 / 하위자료형관계가설정됨 상위유형의변수는하위객체의참조값을가질수있음 상위유형의변수가가리키는객체의실제유형에따라수행되는메소드가결정됨 ( 동적바인딩 ) 변수의선언유형으로정하지않음 SuperClass super = new SubClass( ); super.method( ); // SubClass에서찾음 다형성과형변환 다형성 하나의객체가다양한형상이나다양한기능을가진다는뜻 하나의클래스에서오버로딩된메소드들은유사하지만조금씩다른기능을수행함 자식클래스에서재정의된메소드는부모유사하지만다른기능을수행함 형변환 상속관계에있는클래스간에는타입변환이가능함 전혀다른두클래스간에는타입변환이금지됨 하위클래스에서상위클래스로의형변환은문제없음 상위유형의변수는하위객체의참조값을가질수있음 다형성과오버라이딩클래스상속과다형성 (1) 클래스의다형성 부모클래스로부터상속받은메소드를자식클래스에서오버라이딩할수있음 부모와자식에서같은이름의메소드가다른기능을수행 같은이름과매개변수및반환형을가지나몸체가다름 인터페이스의다형성 자식클래스들에서상위인터페이스의메소드를다르게구현함 class A { public void func( ) { System.out.println( a ); class B extends A { public void func( ) { System.out.println( b ); class C extends B { public void func( ) { System.out.println( c ); public class PolymorphTest { public static void main(string args[ ]) { A a = new B( ); a.func( ); a = new C( ); a.func( ); b c

클래스상속과다형성 (2) 열거형정의 class Employee { int nsalary; String szdept = null; public void dojob( ) { System.out.println("Do something"); class Sales extends Employee { public Sales( ) { szdept = "Sales Dept"; public void dojob( ) { System.out.println("Do sales"); Do sales Do development class Development extends Employee { public Development( ) { szdept = "Sales Dept"; public void dojob( ) { System.out.println("Do development"); public class Company1 { public static void main(string args[ ]) { Employee emp1, emp2; emp1 = new Sales( ); emp2 = new Development( ); emp1.dojob( ); emp2.dojob( ); 열거형은미리정의된상수값을만들기위한자료형 enum을사용하여정의 열거형으로선언된변수에는미리지정된값만대입가능 상수값을배열로리턴하는 static 메소드로 values( ) 를제공 enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY 열거형의생성자와메소드 열거형정의에필드와메소드를포함할수있음 상수선언이필드나메소드보다먼저정의되어야하며세미콜론 (;) 으로끝나야함 생성자는열거형과같은이름을가지며접근제어자는생략또는 private이어야함 열거형의생성자는상수값을설정 ( 객체생성 ) 할때자동호출됨 열거형에서상수는마치하나의객체와같음 열거형사용예 enum BaseballTeam { LG(40, 30), SS(30, 40), KT(20, 50), SK(35, 35), NC(55, 15); private final int win; private final int lose; private BaseballTeam(int win, int lose) { this.win = win; this.lose = lose; public class EnumTest2 { public static void main(string args[ ]) { BaseballTeam bt = BaseballTeam.LG; System.out.println(bt.winsRate( )); public double winsrate( ) { return (win * 100.0) / (win + lose);

익명클래스 클래스를상속받는익명클래스 일회성으로 1 개의객체를생성하기위한클래스 클래스정의와동시에객체를생성할수있음 슈퍼클래스를상속받거나인터페이스를구현하도록익명클래스를정의 new 클래스 / 인터페이스 ( ) { 중괄호는익명클래스의몸체 public class AnonymousTest { public static void main(string args[ ]) { CSuper sub = new CSuper( ) { public int b = 20; public void method1( ) { System.out.println( sub1 ); public void method3( ) class CSuper { public int a = 10; public void method1( ) { System.out.println( super1 ); public void method2( ) { System.out.println( super2 ); { System.out.println( sub3 ); ; sub.method1( ); sub.method2( ); System.out.println(sub.a);...... sub1 super2 10 인터페이스를구현한익명클래스 public class AnonymousTest { public static void main(string args[]) { MyInterface sub = new MyInterface( ) { public void method( ) { System.out.println( sub1 ); ; 6 강. 제네릭과람다식 ( 교재 5 장 ) sub.method( ); interface MyInterface { public void method( ); 컴퓨터과학과김희천교수 2017 년 5 월 24 일 501 호김룡

제네릭의의미 (1) 제네릭클래스, 제네릭인터페이스, 제네릭메소드 클래스, 인터페이스, 메소드를정의할때타입매개변수 ( 타입파라미터 ) 를선언하고사용할수있음 제네릭을사용하는이유 자료형을한정함으로써컴파일시점에자료형검사가가능 실행오류를찾아고치는것은어려움 캐스트 ( 형변환 ) 연산자의사용이불필요 여러유형에걸쳐동작하는일반화된클래스 / 메소드를정의할수있음 제네릭의의미 (2) ArrayList 클래스는 List 인터페이스를구현한클래스 class ArrayList<E> implements List<E> { boolean add(e e) { E get(int index) { E remove(int index) { List list1 = new ArrayList( ); list1.add("hello"); String s1 = (String)list1.get(0); // 형변환필요 List<String> list2 = new ArrayList<String>( ); list2.add("hello"); String s2 = list2 get(0); // 형변환이필요없 제네릭클래스 클래스정의에서타입파라미터를선언함 클래스를사용할때는타입을명시해야함 필드의자료형, 메소드반환형, 인자의자료형으로사용할수있음 타입파라미터는참조형만가능함 컴파일할때, 명확한타입검사를수행할수있음 메소드호출시인자의유형이맞는지 메소드호출의결과를사용할때유형이맞는지 자료형을매개변수로가지는클래스와인터페이스를제네릭타입이라고함 제네릭클래스정의 (1) 문법 class 클래스이름 <T1, T2, > { 클래스정의에서클래스이름의오른편, 각괄호 < > 안에타입파라미터를표시함 컴마 (,) 로구분하여여러개의타입파라미터를지정할수있음 타입파라미터는타입을전달받기위한것 타입파라미터의이름은관례적으로 E, K, V, N, T 을사용함

제네릭클래스정의 (2) 제네릭클래스의사용 class Data { private Object object; public void set(object object) { this.object = object; public Object get( ) { return object; class Data2<T> { private T t; public void set(t t) { this.t = t; public T get( ) { return t; 제네릭타입과자료형검사 제네릭타입을사용하지않으면컴파일시점에서오류를검출하지못함 의미가명확하면생성자호출시, 괄호만사용할수있음 Data2<String> b3 = new Data2< >( ); public class GenericsTest2 { public static void main(string args[ ]) { Data2<String> data = new Data2<String>( ); Integer i = new Integer(20); data.set(i); // 컴파일오류 String s = (String) data.get( ); 제네릭인터페이스를구현하는제네릭클래스 2 개의타입매개변수 (K 와 V) 를가지는클래스 interface Pair<K, V> { public K getkey(); public V getvalue(); class OrderedPair <K, V> implements Pair <K, V> { private K key; private V value; public OrderedPair(K key, V value) { this.key = key; this.value = value; public K getkey( ) { return key; public V getvalue( ) { return value; public class MultipleType { public static void main(string args[ ]) { Pair <String, Integer> p1; p1 = new OrderedPair <> ("Even", 8); Pair <String, String> p2; p2 = new OrderedPair <> ("hello", "java"); 제네릭타입을상속 / 구현하는일반클래스 제네릭인터페이스를구현하는일반클래스 클래스를정의할때제네릭인터페이스의자료형을지정하면됨 class MyPair implements Pair<String, Integer> { private String key; private Integer value; public MyPair(String key, Integer value) { this.key = key; this.value = value; public String getkey( ) { return key; public Integer getvalue( ) { return value; public class ClassFromGeneric { public static void main(string args[ ]) { MyPair mp = new MyPair("test", 1);

Raw 타입 제네릭타입을일반타입처럼사용하는경우의제네릭타입을지칭하는용어 2 예 Data2 data = new Data2( hello ); 제네릭메소드와타입제한 이때 Data2 는제네릭타입 Data2<T> 의 raw 타입 자료형을 Object 로처리함 제네릭메소드 (1) 자료형을매개변수로가지는메소드 하나의메소드정의로여러유형의데이터를처리할때유용함 메소드정의에서반환형왼편, 각괄호 <> 안에타입매개변수를가짐 타입매개변수를메소드의반환형이나메소드인자의타입으로사용할수있음 지역변수의타입으로사용할수도있음 public static <T> T getlast(t[ ] 제네릭메소드 (2) 인스탄스메소드와 static 메소드모두제네릭메소드로정의가능 제네릭메소드를호출할때, 타입을명시하지않아도인자에의해추론이가능함 class Util { public static <K, V> boolean compare(pair<k, V> p1, Pair<K, V> p2) { return p1.getkey().equals(p2.getkey()) && p1.getvalue().equals(p2.getvalue()); a) { return a[a.length-1]; public class GenericsTest5 { public static void main(string args[]) { Pair<Integer, String> p1 = new Pair<>(1, "apple"); Pair<Integer, String> p2 = new Pair<>(2, "pear"); boolean same = Util.<Integer, String>compare(p1, p2); System.out.println(same);

제네릭의타입제한 자료형을매개변수화하여클래스 / 인터페이스 / 메소드를정의할때, 자료형에제한을두는것 <T extends Number> 와같이하면 T를상한으로정할수있음 타입매개변수는 Number의서브클래스라야함 class Data<T extends Number> { private T t; public Data(T t) { this.t = t; public void set(t t) { this.t = t; public T get( ) { return t; public class BoundedType { public static void main(string args[ ]) { Data<Integer> data = new Data<Integer>(20); System.out.println(data.get( )); 제네릭타입과형변환 상속관계가있어야상위 / 하위자료형의관계가존재함 Integer나 Double은 Number의자식클래스 Data <Number> 와 Data <Integer> 는상하위관계가없음 class Data<T> { class FormattedData<T> extends Data<T> { public class GenericTypeConversion1 { public static void main(string args[ ]) { Data<Number> data = new Data<Number>( ); data.set(new Integer(10)); data.set(new Double(10.1)); Data <Number> data1 = new Data <Integer>( ); // 컴파일오류 Data<Integer> data = new FormattedData<Integer>( ); 제네릭타입사용시유의사항 기본자료형은타입매개변수로지정할수없음 Data<int> d = new Data<>( ); // 오류 타입매개변수로객체생성을할수없음 class Data <T> { private T t1 = new T( ); // 오류 타입매개변수의타입으로 static 필드를선언할수없음 class Data <T> { private static T t2; // 오류 제네릭타입의배열을선언할수없음 Data <Integer>[ ] arrayofdata; // 오류 3 람다식

람다식 인터페이스를구현하는익명클래스의객체생성부분을수식화한것 구현할것이 1개의추상메소드일때간단히표현할수있음 람다식구문 Runnable runnable = new Runnable( ) { public void run( ) {... ; 메소드매개변수의괄호, 화살표, 메소드몸체로표현 인터페이스객체변수 = ( 매개변수목록 ) -> { 실행문목록 Runnable runnable = ( ) -> {... ; 람다식기본문법 (1) 익명구현클래스의객체생성부분만람다식으로표현함 익명서브클래스의객체생성은람다식이될수없음 이때인터페이스에는추상메소드가 1 개만있어야함 2개이상의추상메소드를포함하는인터페이스는사용불가 람다식의결과타입을타깃타입이라고함 1개의추상메소드를포함하는인터페이스를함수적인터페이스라함 메소드가 1개뿐이므로메소드이름을생략할수있음 람다식기본문법 (2) 람다식사용예 (1) 인터페이스객체변수 = ( 매개변수목록 ) -> { 실행문목록 매개변수목록에서자료형은인터페이스정의에서알수있으므로변수이름만사용가능 매개변수가 1개면괄호가생략가능하며변수이름하나만남음 매개변수를가지지않으면괄호만남음 실행문이 1개이면중괄호생략가능 실행문이 return문뿐이라면 retrun과중괄호를동시생략해야함 interface MyInterface1 { public void method(int a, int b); interface MyInterface2 { public void method(int a); public class LambdaTest1 { public static void main(string args[]) { MyInterface1 f1, f2, f3; MyInterface2 f4, f5; b); ; f1 = (int a, int b) -> { System.out.println(a + f1.method(3, 4); f2 = (a, b) -> { System.out.println(a + b); ; f2.method(5, 6); f3 = (a, b) -> System.out.println(a + b); f3.method(7, 8); f4 = (int a) -> { System.out.println(a); ; f4.method(9); f5 = a -> System.out.println(a); f5.method(10);

람다식사용예 (2) 람다식사용예 (3) interface MyInterface3 { public int method(int a, int b); public class LambdaTest2 { public static void main(string args[]) { MyInterface3 f1, f2; // f1 = (a, b) -> return a+b; / 컴파일에러 f1 = (a, b) -> { return a + b; ; System.out.println(f1.method(3, 4)); f2 = (a, b) -> a + b; System.out.println(f2.method(5, 6)); public class RunnableTest4 { public static void main(string args[]) { Thread thd = new Thread(( ) -> System.out.println("my thread")); thd.start( ); import java.util.function.*; public class ConsumerTest{ public static void main(string args[]) { Consumer<String>con = t -> System.out.println("Hello " + t); con.accept("java"); 패키지의미 시스템패키지 관련이있는클래스와인터페이스의묶음 클래스와인터페이스는패키지의멤버로존재 전체적으로계층구조의클래스라이브러리 패키지 ( 폴더와유사 ) 단위로계층적으로분류됨 패키지용도 쉽게찾아사용하기위해 이름충돌을피하기위해 접근제어를위해 Java 가제공하는클래스라이브러리 JDK 와함께설치됨 일반적으로 jar 파일로압축되어있음 예 : C:\Program Files\Java\jdk1.8.0_121\jre\lib\rt.jar 예를들어 java\lang\boolean.class 가존재함

시스템패키지의사용 사용자정의패키지 (1) 가장기본이되는최상위시스템패키지는 java 임 대부분의시스템패키지는 java. 으로시작됨 Java 프로그램에서상위와하위패키지의구분을위해도트 (.) 를사용 예 : java.lang, java.io, java.awt, java.util 등 Java 언어의기본클래스는 java.lang에존재 프로그램에서클래스를사용할때는 java.io.ioexception 과같이사용함 패키지정의문법 package 패키지이름 ; 1 개이상의클래스나인터페이스정의 package 구문은소스코드맨앞에위치해야함 패키지이름은관례상소문자로작명 하위패키지는. 으로구분하여작성 컴파일하면패키지가만들어지고 ( 또는기존패키지에 ) 클래스파일 (.class) 이패키지에저장됨 사용자정의패키지 (2) 사용자정의패키지 (3) 패키지만들기예 컴파일결과로 Car.class 가만들어짐 Car.class 는 com.vehicle 패키지에저장됨 com.vehicle 은어디에? package com.vehicle; public class Car { String sztype = " 승용차 "; 컴파일할때 d 옵션사용하여지정함 예 - javac Car.java d D:\javaClasses 이경우 D:\javaClasses\com\vehicle\Car.class Eclipse를사용한패키지정의 메뉴 [File/New/Package] 를선택 패키지에해당하는폴더가만들어짐 생성된패키지에서클래스를만들면됨 메뉴 [File/New/Class] 를선택하여클래스이름과함께패키지이름을입력함

같은패키지에있거나 public인외부의클래스를사용하려면패키지를포함한완전한클래스이름을사용해야함 예 패키지의사용 (1) graphics.rectangle myrect = new graphics.rectangle( ); java.util.scanner s = new java.util.scanner(system.in); 패키지의사용 (2) import 문 import 패키지이름. 클래스이름 ; import 패키지이름.* ; import 구문은소스코드맨앞에위치함 package 구문이있다면그다음에위치 프로그램에서패키지이름을생략하고클래스나인터페이스를사용할수있게함 Java 프로그램에서 import java.lang.*; 구문은자동포함됨 패키지의사용과접근제어 아래프로그램에서 package 구문이없다면패키지접근수준의 Car 클래스를사용할수없음 // package com.vehicle; import com.vehicle.*; class MyBus extends Bus { public class PackageTest { public static void main(string args[ ]) { Bus bus = new Bus( ); Car car = new Car( ); // 오류 package com.vehicle; class Car { package com.vehicle; public class Bus extends Car { 클래스찾기 (1) 컴파일하거나실행할때, 필요한클래스를찾아야함 컴파일러가 A.class가위치한경로또는 A.class를포함하고있는 jar 파일의존재를알아야함 JVM은다음에서클래스를찾음 Java 기본패키지 [Java설치폴더]\jre\lib\*.jar Java 확장패키지 [Java설치폴더]\jre\lib\ext\*.jar 사용자클래스도찾을수있음 이때방법이필요함

사용자클래스는환경변수 CLASSPATH 에지정된경로또는 jar 파일에서찾음 환경변수 CLASSPATH 컴파일러는 CLASSPATH 에지정된경로에서클래스를찾음 CLASSPATH 의경로는 jar 파일을포함할수있음 예 클래스찾기 (2) 프로그램에서 graphics.circle 클래스를사용하고 CLASSPATH=path1;path2;a.jar 라고가정 이때, path1\graphics\circle.class 또는 path2\graphics\circle.class 또는 a.jar 에 \graphics\circle.class 가있어야함 예외와에러 에러 (Error) 는심각한오류로더이상의실행이불가함 예외 (Exception) 는경미한오류로복구가가능함 예외발생 메소드를수행할때예외가발생하면예외객체를만들어던짐 예외처리코드가없으면, 메시지가출력되면서종료됨 예외처리코드가있으면, 계속수행됨 예외객체 Exception 클래스또는하위클래스로표현됨 예외객체는예외발생정보를가지고있음 예외관련클래스의계층구조 예외처리 (Exception handling) Error Object Throwable Exception RuntimeException IOException unchecked Exception checked Exception 예외처리예외가발생했을때이상황을바로잡아계속수행하도록함 예외발생은 Exception 객체를 throw 함 throw new MyException( ); throw 된예외객체를 catch 하여예외를처리함 checkedexception이발생할수있는경우, 반드시명시적인예외처리가필요함 RuntimeException의경우, 예외처리를안해도됨 잘못작성된프로그램때문에발생됨 ArithmeticException, NullpointException, IndexOutOfBoundsException 등

예외처리방법 예외의직접처리 (1) 직접처리 던져진예외객체를잡아처리하는것 try-catch 구문또는 try-catch-finally 구문을사용하여예외를처리함 일반코드와예외처리가분리되어가독성이좋아짐 간접처리 예외발생가능성이있는메소드의선언에서인자다음에 throws 예외이름을사용 그메소드를호출하는메소드에게예외처리를전달또는위임하는것 try-catch 구문문법 try { catch(exceptiontype1 ex1) { catch(exceptiontype2 ex2) { finally { 예외객체를 throw 하는문장또는예외발생가능성이있는메소드의호출부분을 try 블록에둠 catch 블록은예외유형의 1 개인자를가지는메소드와유사 처리해야하는예외유형이여럿이면 catch 블록도여럿 finally 블록은생략가능 예외의직접처리 (2) 예외의직접처리 (3) try-catch 구문의실행 예외가발생하면 try 블록은즉시종료됨 catch 블록이여럿이면, 가장적합한 ( 발생된예외자료형또는상위유형 ) 하나만실행됨 예외가발생하지않으면 catch 블록은실행되지않음 finally 블록은예외발생과무관하게 try 블록이종료되면항상실행됨 예외발생여부와무관하게 try 블록이종료된후 할당받아사용했던리소스를원상복구하기위해 finally 블록을주로사용함 public class A { public void problem( ) throws RuntimeException { throw new RuntimeException( ); public void trythis( ) { try { problem( ); System.out.print("1"); catch (RuntimeException x) { System.out.print("2"); catch (Exception x) { System.out.print("3"); finally { System.out.print("4"); System.out.print("5"); public static void main(string[ ] args){ A a=new A( ); a.trythis( );

예외의간접처리 (1) 예외를발생시킬수있는메소드를호출하는쪽에예외처리를위임하는것 ( 예외의전파 ) 메소드선언에예외발생가능성을표시 메소드의선언에서괄호다음에 throws 예외유형을사용 public char getinput( ) throws IOException { ninput = System.in.read( ) ; // 예외발생가능 throws 절이있는메소드를호출하는메소드에서예외처리를해야함 try { c = obj.getinput( ); catch(ioexception ex ) { 예외의간접처리 (2) 예외를발생시킬수있는메소드 public FileInputStream(String name) throws FileNotFoundException FileInputStream 클래스의생성자 public int read( ) throws IOException InputStream 클래스 /Reader 클래스의메소드 위와같은메소드를사용할때는반드시예외처리가필요함 예외처리프로그램 (1) import java.io.*; public class ExceptionTest1 { public static void main(string args[ ]) { int b = 0; try { b = System.in.read( ); catch (IOException ex) { System.out.println(ex); System.out.println((char)b); 예외처리프로그램 (2) import java.io.*; class CharInput { int ninput = 0; public char getinput( ) throws IOException { ninput = System.in.read( ); return (char)ninput; public class ExceptionTest4 { public static void main(string args[ ]) { CharInput charinput = new CharInput( ); try { System.out.println(charInput.getInput ( )); catch (IOException ex) { System.out.println(ex);

사용자정의예외 사용자가직접예외클래스를작성할수있음 일반적으로 Exception 클래스를상속받음 필요할때예외객체를 throw 함 class MyException extends Exception{ public MyException( ) { super( ); public String tostring( ) { return "MyException"; class MyExceptionTest { public void testfunc(int x) throws MyException { if (x > 10) throw new MyException( );