제 6 장 패키지 개념과 자바 기본 패키지 java applet awt beans io lang math net nio rmi

Slides:



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

5 장 조건과 반복 ②. Contents Counting and Looping [while 문 사용 ] Powers of 2 [while 문 사용 ] More Guessing [do 문 사용 ] Election Day [do 문 사용 ] Finding Maximum &
명품 JAVA Programming 제 3 장 반복문, 배열, 예외처리.
명품 JAVA Programming 제 6 장 패키지 개념과 자바 기본 패키지.
어서와 Java는 처음이지! 제3장선택과 반복.
11장. 프로토콜 핸들러 AI &HC I LAB 김 성 현.
자바 키워드 & 문자열 다루기 인터넷 프로그래밍 강의자료 3 (1, 3반) 한용재
제 7주 2015년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
IntArray[0] int length 5 intArray 객체 제 3 장 반복문, 배열, 예외처리.
Power Java 제13장 패키지(Package).
객체지향 프로그래밍.
11장. 기본 API 클래스.
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
7장 배열 ②.
어서와 Java는 처음이지! 제4장 배열.
명품 JAVA Programming 제 13 장 스레드와 멀티태스킹.
명품 JAVA Essential.
제 4장 문 장 배정문 혼합문 제어문 표준 입출력.
4부 클래스 라이브러리 “4부에서는 자바 언어의 API인 클래스 라이브러리에 관해 설명합니다
명품 JAVA Programming.
윤 홍 란 제3장 클래스와 객체의 사용-1 윤 홍 란
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
Chapter 02 자바 기본구조 자바 프로그래밍의 기초적인 문법을 소개
표준 API(클래스라이브러리)의 기본 클래스 활용
명품 JAVA Programming 제 7 장 제네릭과 컬렉션.
명품 JAVA Essential.
2강. JAVA 프로그래밍이란?-II & 변수 JAVA 프로그램 환경설정과 실행 방법 변수란?
명품 JAVA Essential.
명품 JAVA Programming.
명품 JAVA Essential.
명품 JAVA Programming 제 4 장 클래스와 객체.
3. 자바에서 지원하는 패키지 자바에서 기본적으로 제공하는 패키지.
[INA470] Java Programming Youn-Hee Han
JAVA 프로그래밍 6장 객체지향프로그래밍의 핵심.
Power Java 제10장 배열.
Choi, Namseok Java 기초 (Java의 제어문과 배열) Choi, Namseok
명품 JAVA Essential.
명품 JAVA Programming 제 8 장 입출력 스트림과 파일 입출력.
명품 Java Programming.
제 11 장 java.lang 패키지 제 12 장 문자열 제 13 장 유틸리티 제 14 장 입출력 제 15 장 네트워킹
최용술 장 Thread 최용술
명품 JAVA Essential.
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
주소록 프로그램.
Power Java 제20장 패키지.
제 4주 2014년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
12장 문자열 12.1 문자열의 개요 12.2 String 클래스 12.3 StringBuffer 클래스.
23강 API - II - 약방의 감초 Random 클래스 - Scanner 및 Sysout - Wrapper 클래스의 이해
5장 조건과 반복 ②.
제2장 데이터 및 수식.
어서와 Java는 처음이지! 제4장 배열 IT응용시스템공학과 김형진 교수.
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
Java의 정석 제 2 장 변수(Variable) Java 정석 남궁성 강의
프로그래밍 원리 Chapter 04 자료 처리와 연산자 신한대학교 IT융합공학부 박 호 균.
[INA470] Java Programming Youn-Hee Han
컴퓨터공학실습(I) 3주 인공지능연구실.
Java의 정석 제 4 장 조건문과 반복문 Java 정석 남궁성 강의
자바 5.0 프로그래밍.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
자바 5.0 프로그래밍.
C# 10장. 참조형.
명품 JAVA Programming.
Choi Younghwan CSE HUFS
Chapter8 : 인터페이스와 패키지 8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용
Presentation transcript:

제 6 장 패키지 개념과 자바 기본 패키지 java applet awt beans io lang math net nio rmi security sql text util beancontext spi color datatransfer dnd event font geom im image print renderable channels charset annotation instrument management ref reflect acl interfaces cert spec activation dgc registry server concurrent jar logging prefs regex zip atomic locks 제 6 장 패키지 개념과 자바 기본 패키지

패키지 개념과 필요성 3명이 분담하여 자바 응용프로그램을 개발하는 경우

샘플의 디렉터리 관리(패키지) 이름은 같지만 경로명이 달라 서도 다른 파일 Project/FileIO/Tools.class WebFile.class FileCopy.class FileRW.class Tools.class Graphic 이름은 같지만 경로명이 달라 서도 다른 파일 DObject.class Line.class Rect.class Project/FileIO/Tools.class Project/UI/Tools.class Circle.class UI Main.class GUI.class EventHandler.class Tools.class

자바의 패키지 (package) 패키지란 하나의 응용프로그램은 여러 개의 패키지로 구성 패키지는 jar 파일로 압축할 수 있음 서로 관련된 클래스와 인터페이스의 컴파일된 파일들을 하나의 디렉터리에 묶어 놓은 것 하나의 응용프로그램은 여러 개의 패키지로 구성 하나의 패키지에 모든 클래스 파일을 넣어 둘 수 있음 패키지는 jar 파일로 압축할 수 있음 예) JDK에서 제공하는 표준 패키지는 rt.jar에 압축

JDK에서 제공되는 클래스의 패키지 java.awt.Color 패키지 명 : java.awt 클래스의 이름(경로명) java.awt.Color 패키지명 패키지 명 : java.awt java.awt 패키지에 속한 클래스

패키지 사용하기, import문 다른 패키지 갖다 쓰기 import 사용 import를 이용하지 않는 경우 소스 내에서 매번 전체 패키지 이름과 클래스명을 써주어야 함 import 키워드 이용하는 경우 소스의 시작 부분에 사용하려는 패키지 명 시 소스 내에서 클래스 명만 명시하면 된다. import 사용 특정 클래스의 경로명만 포함하는 경우 import java.util.Scanner; 패키지 내의 모든 클래스를 포함시키는 경우 import java.util.*; *는 현재 패키지 내의 클래스만을 의미하 며 하위 패키지의 클래스까지 포함하지 않 는다. public class ImportExample { public static void main(String[] args) { java.util.Scanner scanner = new java.util.Scanner(System.in); } import java.util.Scanner; public class ImportExample { public static void main(String[] args) { Scanner scanner = new Scanner(System.in) } import java.util.*; public class ImportExample { public static void main(String[] args) { Scanner scanner = new Scanner(System.in) }

클래스 경로 클래스의 위치(경로) 지정 클래스 탐색 경로를 지정하는 방법 2 가지 클래스 경로의 환경 변수 : 시스템 환경 변수 CLASSPATH java의 옵션 –classpath 실행 시 클래스 파일이 존재하는 패키지 디렉터리 정보를 -classpath 옵션에 지정

CLASSPATH 지정 방법

수동으로 패키지를 만드는 과정 수동으로 패키지를 만드는 과정 패키지에 속한 자바프로그램 실행 1. 패키지로 사용할 디렉터리 생성 2. 자바 소스 내의 패키지 선언 package 패키지 이름; 이 소스 파일이 컴파일되면 생성된 클래스 파일이 속할 패키지 이름 선언 3. 자바 소스를 컴파일한 클래스 파일을 패키지 디렉터리에 저장 패키지에 속한 자바프로그램 실행 main() 메소드를 가진 클래스의 정확한 경로명 지정 패키지가 포함된 디렉터리로 이동하여 경로명을 지정하여 실행하거 나 임의의 디렉터리에서 java -classpath (패키지경로명) 클래스 이름으 로 실행 package 패키지명; class TestClass { ............. }

패키지를 포함하는 응용프로그램 개발 사례 1 패키지 디렉터리 chapter6 생성 소스 파일 내에 패키지 선언 현재 디렉터리 C:\Temp C:\Temp\chapter6 디렉터리 생성 소스 파일 내에 패키지 선언 Hello.java 컴파일 C:\Temp>javac Hello.java 현재 디렉터리에서 컴파일 Hello.class 생성 Hello.class 파일 복사 혹은 이동 Hello.class 파일을 C:\Temp에서 C:\Temp\chapter6로 복사 혹 은 이동 실행 C:\temp>java chapter6.Hello 현재 디렉터리에서 실행 정상적으로 실행됨 package 패키지명; class TestClass { ............. }

패키지를 포함하는 응용프로그램 개발 사례 2 chapter6 디렉터리 생성하지 않음 컴파일 실행 현재 디렉터리 C:\Temp C:\Temp>javac -d . Hello.java 현재 디렉터리에서 컴파일 -d 옵션 : 패키지 디렉터리 자동 생성 . : 현재 디렉터리를 기준으로 클래스 파일을 찾도록 지시 결과 : Hello.class 파일을 C:\Temp\chapter6에 생성 실행 C:\ temp>java chapter6.Hello 현재 디렉터리에서 실행 정상적으로 실행됨

사례 2의 컴파일 과정 및 실행 java -d . Hello.java 로 컴파일 하면 컴파일 결과 자동생성되었음 현재 디렉터리 (.) 밑에 chapter6 디렉터리 자동 생성되고 동시에 컴파일된 클 래스 파일이 생성됨 컴파일 결과 자동생성되었음

이클립스에서 쉽게 패키지 만들기 예제로 사용할 샘플 소스(5장의 예제 5-6) lib 패키지 app 패키지 abstract class Calculator { public abstract int add(int a, int b);// 두 정수의 합을 구하여 리턴 public abstract int subtract(int a, int b);// 두 정수의 차를 구하여 리턴 public abstract double average(int[] a);// 배열에 저장된 정수의 평균을 구해 실수로 리던 } class GoodCalc extends Calculator { public int add(int a, int b) { return a+b; public int subtract(int a, int b) { return a - b; public double average(int[] a) { double sum = 0; for (int i = 0; i < a.length; i++) sum += a[i]; return sum/a.length; public static void main(String [] args) { Calculator c = new GoodCalc(); System.out.println(c.add(2,3)); System.out.println(c.subtract(2,3)); System.out.println(c.average(new int [] {2,3,4 })); lib 패키지 app 패키지

프로젝트 작성(프로젝트 이름 : PackageEx)

File->New->Package 패키지 lib 작성 File->New->Package

File->New->Package 패키지 app 작성 File->New->Package

패키지 작성이 완료된 결과

File->New->Class 클래스 Calculator 만들기 File->New->Class

Calculator 소스 수정 다른 패키지, 즉 app 패키지의 클래스에서 접근할 수 있도록 하기 위해 클래스의 접근 지정자 public을 반드시 삽입.

GoodCalc.java 작성 후 소스 수정 import 문 삽입. Calculator 클래스를 사용하기 위해서는 패키지를 포함하는 정확한 경로명을 컴파일러에게 알려줘야 함.

실행을 위한 Run Configurations 작성

프로젝트 PackageEx 실행 실습 : Slide 13의 프로그램을 이용하여 프로젝트, package lib와 app 작성한 다음 해당 class 작성하고 실행하여 보자!!!!!

패키지의 특징 패키지의 특징 패키지 계층구조 패키지별 접근 제한 동일한 이름의 클래스와 인터페이스의 사용 가능 클래스나 인터페이스가 너무 많아지면 관리의 어려움 관련된 클래스 파일을 하나의 패키지로 계층화하여 관리하면 관리 쉬 움 패키지별 접근 제한 default로 선언된 클래스나 멤버는 동일 패키지 내의 클래스들이 자 유롭게 접근하도록 허용 동일한 이름의 클래스와 인터페이스의 사용 가능 서로 다른 패키지에 이름이 같은 클래스와 인터페이스 존재 가능 높은 소프트웨어 재사용성 오라클에서 제공하는 자바 API는 패키지로 구성되어 있음 java.lang, java.io 등의 패키지들 덕분에 일일이 코딩하지 않고 입출 력 프로그램을 간단히 작성할 수 있음

자바 JDK의 패키지 구조 JDK 패키지 rt.jar 압축 해제 후 디렉터리 구조 자바에서는 관련된 클래스들을 표준 패키지로 묶어 사용자에게 제공 자바에서 제공하는 패키지는 C언어의 표준 라이브러리와 유사 JDK의 표준 패키지는 rt.jar에 담겨 있다. C:\Program Files\Java\jdk1.6.0_16\jre\lib\rt.jar rt.jar 압축 해제 후 디렉터리 구조

자바 패키지 구조 java applet awt beans io lang math net nio rmi security sql text util beancontext spi color datatransfer dnd event font geom im image print spi renderable channels charset spi annotation instrument management ref reflect activation dgc registry server acl interfaces cert spec concurrent jar logging prefs regex spi zip atomic locks

주요 패키지 java.lang java.util java.io java.awt javax.swing 자바 language 패키지 스트링, 수학 함수, 입출력 등 자바 프로그래밍에 필요한 기본적인 클래스 와 인터페이스 자동으로 import 됨 - import 문이 필요없음 java.util 자바 유틸리디 패키지 날짜, 시간, 벡터, 해쉬 테이블 등과 같은 다양한 유틸리티 클래스와 인터 페이스 제공 java.io 키보드, 모니터, 프린터, 디스크 등에 입출력을 할 수 있는 클래스와 인터페이스 제공 java.awt 자바 GUI 프로그래밍을 위한 클래스와 인터페이스 제공 javax.swing 자바 GUI 프로그래밍을 위한 스윙 패키지

자바 API 참조 자바 API의 상세 정보 Oracle Technology Network(http://download- llnw.oracle.com/javase/6/docs/api/)에서 온라인으로 API 규격제공

Java.lang 패키지 Import 문을 사용할 필요가 없이 기본적으로 포함된다. Object 클래스: 기초적인 메소드를 제공하는 모든 클래스의 조상 클래스 Math 클래스: 각종 수학 함수들을 포함하는 클래스 Wrapper 클래스: Integer와 같이 기초 자료형을 감싸서 제공하는 랩퍼 클래스들(Double, Character, Boolean …) String 클래스, StringBuffer 클래스: 문자열을 다루는 클래스 System 클래스: 시스템 정보를 제공하거나 입출력을 제공하는 클래스 Thread 클래스: 스레드 기능을 제공하는 클래스 Class 클래스: 클래스에 대한 정보를 얻기 위한 클래스

Object 클래스 특징 주요 메소드 java.lang 패키지에 포함 자바 클래스 계층 구조의 최상위에 위치 모든 클래스의 수퍼 클래스 주요 메소드 메소드 설명 protected Object clone() 현 객체와 똑같은 객체를 만들어 반환. 오버라이딩 필요 boolean equals(Object obj) obj가 가리키는 객체와 현재 객체가 비교하여 같으면 true 반환 Class getClass() 현 객체의 런타임 클래스를 반환 int hashCode() 현 객체에 대한 해쉬 코드 값 반환 String toString() 현 객체에 대한 스트링 표현을 반환 void notify() 현 객체에 대해 대기하고 있는 하나의 쓰레드를 깨운다. void notifyAll() 현 객체에 대해 대기하고 있는 모든 쓰레드를 깨운다. void wait() 현 객체의 다른 쓰레드가 notify() 또는 notifyAll() 메소드를 호출할 때까지 현 쓰레드를 대기하게 한다.

객체 속성 class Point { int x, y; public Point(int x, int y) { this.x = x; this.y = y; } public class ObjectProperty { public static void main(String [] args) { Point p = new Point(2,3); System.out.println(p.getClass().getName()); System.out.println(p.hashCode()); System.out.println(p.toString()); System.out.println(p); Point 12677476 Point@c17164

객체를 문자열로 변환 String toString() 객체를 텍스트 형태로 표현한 문자열로 반환 반환되는 문자열 : 클래스 이름@객체의 hash code 객체와 문자열이 + 연산이 되는 경우 객체의 toString() 메소드를 호출 Point a = new Point(2,3); String s = a + “점”; System.out.println(s); Point a = new Point(2,3); String s = a.toString()+ “점”; System.out.println(s); 변환 Point@c17164점

새로운 toString() 만들기 class Point { int x, y; public Point(int x, int y) { this.x = x; this.y = y; } public String toString() { return "Point(" + x + "," + y+ ")"; public class ObjectProperty { public static void main(String [] args) { Point a = new Point(2,3); System.out.println(a.toString()); Point(2,3)

객체 비교 a==c a is equal to b 객체 레퍼런스의 동일성 비교 : = 연산자 이용 객체 내용 비교 서로 다른 두 객체가 같은 내용물인지 비교 boolean equals(Object obj) 이용 class Point { int x, y; public Point(int x, int y) { this.x = x; this.y = y; } Point a = new Point(2,3); Point b = new Point(2,3); Point c = a; if(a == b) // false System.out.println("a==b"); if(a == c) // true System.out.println("a==c"); c x=2 y=3 a Point x=2 y=3 b Point a==c class Point { int x, y; public Point(int x, int y) { this.x = x; this.y = y; } public boolean equals(Point p) { if(x == p.x && y == p.y) return true; else return false; Point a = new Point(2,3); Point b = new Point(2,3); Point c = new Point(3,4); if(a == b) // false System.out.println("a==b"); if(a.equals(b)) // true System.out.println("a is equal to b"); if(a.equals(c)) // false System.out.println("a is equal to c"); x=2 y=3 a Point x=2 y=3 b Point x=3 y=4 c Point a is equal to b

예제 6-1 : Rect 클래스 만들고 equals() 만들기 int 타입의 width, height의 필드를 가지는 Rect 클래스를 작성하고, 두 Rect 객체의 width, height 필드에 의해 구성되는 면적이 같으면 두 객체가 같은 것으로 판별하도록 equals()를 작성하라. Rect 생성자에서 width, height 필드를 인자로 받아 초기화한다. class Rect { int width; int height; public Rect(int width, int height) { this.width = width; this.height = height; } public boolean equals(Rect p) { if (width*height == p.width*p.height) return true; else return false; public class EqualsEx { public static void main(String[] args) { Rect a = new Rect(2,3); Rect b = new Rect(3,2); Rect c = new Rect(3,4); if(a.equals(b)) System.out.println("a is equal to b"); if(a.equals(c)) System.out.println("a is equal to c"); if(b.equals(c)) System.out.println("b is equal to c"); } a is equal to b

Wrapper 클래스 자바 기본 데이터 타입을 클래스화한 8개 클래스 용도 기초 자료형을 객체로 포장시켜주는 클래스 Java.lang 패키지 Wrapper 클래스 자바 기본 데이터 타입을 클래스화한 8개 클래스 용도 기본 데이터 타입을 사용할 수 없고 객체만 사용하는 컬렉션에 기 본 데이터 타입을 Wrapper 클래스로 만들어 사용 기초 자료형을 객체로 포장시켜주는 클래스 (예) Integer obj = new Integer(10); 기본 데이터 타입 byte short int long char float double boolean Wrapper 클래스 Byte Short Integer Long Character Float Double Boolean

Wrapper 객체 생성 기본 데이터 값을 인자로 Wrapper 클래스 생성자 호출 해당 데이터 값을 나타내는 문자열을 생성자 인자로 사 용 가능 Boolean, Short, Byte, Integer, Long, Double, Float 경우 Float는 double 타입의 값을 생성자의 인자로 사용 가능 Integer i = new Integer(10); Character c = new Character(‘c’); Float f = new Float(3.14); Boolean b = new Boolean(true); Boolean b = new Boolean(“false”); Integer I = new Integer(“10”); Double d = new Double(“3.14”); Float f = new Float((double) 3.14);

주요 메소드 가장 많이 사용하는 Integer 클래스의 주요 메소드 메소드 설명 static int bitCount(int i) 이진수 표현에서 1을 개수를 반환 float floatValue() float 타입으로 변환된 값 반환 int intValue() int 타입으로 변환된 값 반환 long longValue() long 타입으로 변환된 값 반환 short shortValue() short 타입으로 변환된 값 반환 static int parseInt(String s) 스트링을 10진 정수로 변환된 값 반환 static int parseInt(String s, int radix) 스트링을 지정된 진법의 정수로 변환된 값 반환 static Sting toBinaryString(int i) 이진수 표현으로 변환된 스트링 반환 static Sting toHexString(int i) 16진수 표현으로 변환된 스트링 반환 static Sting toOctalString(int i) 8진수 표현으로 변환된 스트링 반환 static Sting toString(int i) 정수를 스트링으로 변환하여 반환

Wrapper 활용 Wrapper 객체로부터 기본 데이터 타입 알아내기 문자열을 기본 데이터 타입으로 변환 기본 데이터 타입을 문자열로 변환 Integer i = new Integer(10); int ii = i.intValue(); // ii = 10 Character c = new Character(‘c’ ); char cc = c.charValue(); // cc = ’c’ Float f = new Float(3.14); float ff = f.floatValue(); // ff = 3.14 Boolean b = new Boolean(true); boolean bb = b.booleanValue(); // bb = true int i = Integer.parseInt(“123”); // i = 123 boolean b = Boolean.parseBoolean(“ true”); // b = true float f = Float.parseFloat(“ 3.141592” ); // f = 3.141592 String s1 = Integer.toString(123); // 정수 123을 문자열 “123” 으로 변환 String s2 = Integer.toHexString(123); // 정수 123을 16진수의 문자열 “7b”로 변환 String s3 = Float.toString(3.141592f); // 실수 3.141592를 문자열 “3.141592”로 변환 String s4 = Charater.toString( a ); // 문자 ‘a’를 문자열 “a”로 변환 String s5 = Boolean.toString(true); // 불린 값 true를 문자열 “true”로 변환

예제 6-2 : Wrapper 클래스 활용 다음은 Wrapper 클래스를 활용하는 예이다. 다음 프로그램의 결과는 무엇인가? public class WrapperClassEx { public static void main(String[] args) { Integer i = new Integer(10); char c = '4'; Double d = new Double(3.1234566); System.out.println(Character.toLowerCase('A')); if (Character.isDigit(c)) System.out.println(Character.getNumericValue(c)); System.out.println(Integer.parseInt(“-123”)); System.out.println(Integer.parseInt(“10“,16)); System.out.println(Integer.toBinaryString(28)); System.out.println(Integer.bitCount(28)); System.out.println(Integer.toHexString(28)); System.out.println(i.doubleValue()); System.out.println(d.toString()); System.out.println(Double.parseDouble("44.13e-6")); } a 4 -123 16 11100 3 1c 10.0 3.1234566 4.413E-5

박싱과 언박싱 박싱(boxing) 언박싱(unboxing) 기본 데이터 타입을 Wrapper 클래스로 변환하는 것 반대의 경우를 언박싱이라고 한다. 박싱 (boxing) Integer 객체 10 int Integer ten = new Integer(10); 10 언박싱 (boxing) int i = ten.intValue();

Auto boxing & unboxing(자동 포장&비포장) JDK 5.0 이상부터 지원 Auto boxing 기본 데이터 타입을 자동으로 Wrapper 클래스로 변환 Auto unboxing Wrapper 클래스를 자동으로 기본 데이터 타입으로 변환 // JDK5.0이상에서 Integer ten = 10; // 자동 박싱 int i = ten; // 자동 언박싱

예제 6-3 : 박싱 언박싱의 예 다음 코드에 대한 결과는 무엇인가? public class AutoBoxingUnBoxing { public static void main(String[] args) { int i = 10; Integer intObject = i; // auto boxing System.out.println("intObject = " + intObject); i = intObject + 10; // auto unboxing System.out.println("i = " + i); } intObject = 10 i = 20

String의 생성과 특징 String - java.lang.String String 생성자 // 스트링 리터럴로 스트링 객체 생성 String str1 = "abcd"; // String 클래스의 생성자를 이용하여 스트링 생성 char data[] = {'a', 'b', 'c', 'd'}; String str2 = new String(data); String str3 = new String("abcd"); // str2와 str3은 모두 “abcd” 스트링임 생성자 설명 String() 빈 스트링 객체 생성 String(byte[] bytes) 플랫폼의 기본 문자집합을 이용하여 바이트 배열을 디코딩하여 스트링 객체 생성 String(String original) 인자로 주어진 스트링과 똑같은 스트링 객체를 생성 String(StringBuffer buffer) 스트링 버퍼에 포함된 일련의 문자들을 나타내는 스트링 객체 생성

스트링 리터럴과 new String() 스트링 생성 단순 리터럴로 생성, String s = "Hello"; JVM이 리터럴 관리, 응용프로그램 내에서 공유됨 String 객체로 생성, String t = new String("Hello"); 힙에 String 객체 생성 a “Hello” String a = “Hello”; String b = “Java”; String c = “Hello”; String d = new String("Hello"); String e = new String("Java"); String f = new String("Java"); b “Java” 자바 가상 기계의 스트링 리터럴 테이블 c d “Hello” e “Java” f “Java” 힙 메모리

스트링 객체의 주요 특징 스트링 객체는 수정 불가능 ==과 equals() == 참조만을 비교 s “Hello” s.concat("Java")의 실행 결과 스트링 s는 변경되지않음 String s = new String("Hello"); String t = s.concat("Java"); t “HelloJava”

주요 메소드 메소드 설명 char charAt(int index) 지정된 인덱스에 있는 문자값을 반환 int indexOf(int ch) ch 문자가 있는 인덱스 리턴. 없으면 -1리턴 in indexOf(int ch, int fromIndex) fromIndex 위치부터 끝까지 문자 ch 탐색. 인덱스 리턴. 없으면 -1리턴 String concat(String str) 지정된 스트링을 현재 스트링 뒤에 덧붙인 스트링 반환 boolean contains(CharSequence s) 지정된 일련의 문자들을 포함하고 있으면 true 반환 int length() 스트링의 길이 반환 String replace(Charsequece target, Charsequence replacement) target 지정하는 일련의 문자들을 replacement가 지정하는 문자들로 변경한 스트링 반환 String[] split(String regex) 정규식에 일치하는 부분을 중심으로 스트링 분리하여 스트링 배열로 반환 String subString(int beginIndex) 지정된 인덱스부터 시작하는 서브 스트링 반환 String toLowerCase() 스트링을 소문자로 변경한 스트링 반환 String toUpperCase() 스트링을 대문자로 변경한 스트링 반환 String trim() 스트링 앞뒤의 공백문자들을 제거한 스트링 반환

문자열 비교 int compareTo(String anotherString) 문자열이 같으면 0을 리턴 비교 연산자 ==는 레퍼런스를 비교하므로 문자열 비교에는 사용 할 수 없다. String a = "java"; String b = "jasa"; int res = a.compareTo(b); if(res == 0) System.out.println("the same"); else if(res < 0) System.out.println(a +"<"+b); else System.out.println(a +">"+b); java>jasa

문자열 연결 String concat(String str) 자바에서 스트링 연결 연산자 + 지원 + 연산에서 문자열이 인자로 포함되어 있으면 산술 연산이 아닌 문자열 연결 연산으로 간주. 객체가 문자열 연결 연산에 포함되어 있는 경우 toString() 메소드를 호출하여 객체를 문자열로 변환한 후 문자열 연결 기본 데이터 타입 그대로 문자열로 변환된 후에 문자열 연결 String 클래스의 concat(String str) 메소드를 이용하여 스트링 연결 기존 String 객체에 연결되지 않고 새로운 스트링 객체를 생성하여 리턴 System.out.print(“abcd“ + 1 + true + 3.13e-2 + ‘E‘+ ”fgh“ ); // abcd1true0.0313Efgh 출력 “abcd”.concat(“efgh”); // “abcdefg” 리턴

concat()은 새로운 문자열을 생성 s1 s1 s2 s2 String s1 = “abcd”; String s2 = “efgh”; s1 = s1.concat(s2); abcdefgh abcd s1 s1 efgh abcd s2 efgh s2

문자열 내의 공백 제거, 문자열의 각 문자 접근 공백 제거 문자열의 문자 String trim() 스트링 앞 뒤 공백 문자(tab, enter, space) 제거한 스트링 리턴 문자열의 문자 char charAt(int index) 스트링에 포함된 각 문자 접근 String a = " abcd def "; String b = "\txyz\t"; String c = a.trim(); // c = "abcd def" String d = b.trim(); // d = "xyz" // “class”에 몇 개의 ‘s’가 포함되었는지 알아내는 코드 int count = 0; String a = "class"; for(int i=0; i<a.length(); i++) { // a.length()는 5 if(a.charAt(i) == 's') count++; } System.out.println(count); // 2 출력 String a = "class"; char c = a.charAt(2); // c = ’a’

예제 6-4 : String 클래스 메소드 활용 String 클래스의 다양한 메소드를 활용하는 예를 보여라. 뒷 페이지 설명! public class StringEx { public static void main(String[] args) { String a = new String(" abcd"); String b = new String(",efg"); // 문자열 연결 a = a.concat(b); System.out.println(a); // 공백 제거 a = a.trim(); // 문자열 대치 a = a.replace("ab","12"); // 문자열 분리 String s[] = a.split(","); for (int i=0; i<s.length; i++) System.out.println("분리된 " + i + "번 문자열: " + s[i]); // 서브 스트링 a = a.substring(3); System.out.println(a); // 문자열의 문자 char c = a.charAt(2); System.out.println(c); } abcd,efg 12cd,efg 분리된 0번 문자열: 12cd 분리된 1번 문자열: efg d,efg e 뒷 페이지 설명!

예제 실행 과정 a a b c d b , e f g a a b c d , e f g a a b c d , e f g a 1 2 a = new String(“ abcd”); b , e f g b = new String(“,efg”); a a b c d , e f g a = a.concat(b); a = a.trim(); a a b c d , e f g a = a.replace(“ab”,”12”; a 1 2 c d , e f g String s[] = a.split(","); s[0] 1 2 c d s[1] e f g a = a.substring(3); a d , e f g char c = a.charAt(2); a d , e f g c e

StringBuffer 클래스 java.lang.StringBuffer 생성자 스트링과 달리 객체 생성 후 스트링 값 변경 가능 append와 insert 메소드를 통해 스트링 조작 StringBuffer 객체의 크기는 스트링 길이에 따라 가변적 생성자 StringBuffer sb = new StringBuffer("java"); 생성자 설명 StringBuffer() 문자를 포함하고 있지 않고 초기 크기가 16인 스트링 버퍼 생성 StringBuffer(charSequence seq) seq가 지정하는 일련의 문자들을 포함하는 스트링 버퍼 생성 StringBuffer(int capacity) 문자를 포함하고 있지 않고 지정된 초기 크기를 갖는 스트링 버퍼 생성 StringBuffer(String str) 지정된 스트링으로 초기화된 스트링 버퍼 생성

주요 메소드 메소드 설명 StringBuffer append(String str) 지정된 스트링을 스트링 버퍼에 덧붙인다. StringBuffer append(StringBuffer sb) 지정된 스트링 버퍼를 스트링 버퍼에 덧붙인다. int capacity() 현재 스트링 버퍼의 크기 반환 StringBuffer delete(int start, int end) 지정된 서브 스트링을 스트링 버퍼에서 제거 StringBuffer insert(int offset, String str) 지정된 스트링을 스트링 버퍼의 특정 위치에 삽입 StringBuffer replace(int start, int end, String str) 스트링 버퍼 내의 서브 스트링을 지정된 스트링으로 대치 StringBuffer reverse() 스트링 버퍼 내의 문자들을 반대 순서로 변경 void setLength() 스트링 버퍼 내 저장된 문자열 길이를 설정. 현재 길이보다 큰 경우 널 문자로 채우며 작은 경우는 문자열이 잘린다.

StringBuffer의 메소드 활용 예 a a p e n c i l a n i c e p e n c i l 6 앞까지 a b StringBuffer sb = new StringBuffer(“a”); sb sb a p e n c i l sb.append(“ pencil”); sb sb.insert(2, “nice ”); a n i c e p e n c i l 인덱스 2 인덱스 6 6 앞까지 sb.replace(2, 6, “bad”); sb a b a d p e n c i l 인덱스 0 인덱스 2 2 앞까지 sb.delete(0, 2); sb b a d p e n c i l sb.reverse(); sb l i c n e p d a b int n = sb.length(); n = 10 sb l i c n e p d a b char c = sb.charAt(3); c n

예제 6-5 : StringBuffer 클래스 메소드 활용 public class StringBufferEx { public static void main(String[] args) { StringBuffer sb = new StringBuffer("This"); System.out.println(sb.hashCode()); sb.append(" is pencil"); // 문자열 덧붙이기 System.out.println(sb); sb.insert(7, " my"); // 문자열 삽입 sb.replace(8, 10, "your"); // 문자열 대치 sb.setLength(5); // 스트링 버퍼 내 문자열 길이 설정 } sb.capacity()  20 16+ 4 sb.length() -> 4 같은 객체임 14576877 This is pencil This is my pencil This is your pencil This

java.util 패키지 여러 가지 유틸리티 클래스 들을 제공한다. 자바에서 정수 10과 Integer(10)은 어떻게 다른가? 2. StringBuffer와 String은 어떻게 다른가?

StringTokenizer 클래스 java.util.StringTokenizer 하나의 스트링을 구분자로 분리하여 토큰 형태로 파싱 스트링을 구분할 때 사용되는 문자들을 구분 문자(delimeter)라고 함 위의 예에서 ‘&’가 구분 문자 토큰(token) 구분 문자로 분리된 스트링 String 클래스의 split 메소드를 이용하여 동일한 구현 가능 String query = "name=kitae&addr=seoul&age=21"; StringTokenizer st = new StringTokenizer(query, "&");

생성자와 주요 메소드 생성자 주요 메소드 메소드 설명 int countTokens() 스트링에남아 토큰 수 반환 StringTokenizer(String str) 지정된 스트링으로 초기화된 스트링 토크나이저 생성 StringTokenizer(String str, String delim) 지정된 스트링과 구분 문자로 초기화된 스트링 토크나이저 생성 StringTokenizer(String str, String delim, boolean returnDelims) 지정된 스트링과 구분 문자로 초기화된 스트링 토크나이저 생성. returnDelims가 true이면 구분 문자로 지정된 문자도 분리된 토큰에 포함된다. 메소드 설명 int countTokens() 스트링에남아 토큰 수 반환 boolean hasMoreTokens() 스트링에 토큰이 남아 있으면 true 반환 String nextToken() 다음 토큰 반환 String nextToken(String delim) 지정된 분리자에 대한 다음 토큰 반환

StringTokenizer 객체 생성과 문자열 파싱 String query = "name=kitae&addr=seoul&age=21"; StringTokenizer st = new StringTokenizer(query, "&"); "name=kitae" 토큰 1 "addr=seoul" 토큰 2 토큰 3 "age=21" st "name" 토큰 1 "kitae" 토큰 2 StringTokenizer st = new StringTokenizer(query, "&="); 토큰 3 "addr" "seoul" 토큰 4 "age" 토큰 5 토큰 6 "21" StringTokenizer 객체

예제 6-6 : StringTokenizer 클래스 메소드 활용 “홍길동/장화/홍련/콩쥐/팥쥐”문자열을‘/’를 구분 문자로 하여 토큰을 분리하여 각 토큰을 출력하라. import java.util.StringTokenizer; public class StringTokenizerEx { public static void main(String[] args) { StringTokenizer st = new StringTokenizer("홍길동/장화/홍련/콩쥐/팥쥐", "/"); while (st.hasMoreTokens()) System.out.println(st.nextToken()); } 홍길동 장화 홍련 콩쥐 팥쥐

Math 클래스 java.lang.Math 기본적인 산술 연산을 수행하는 메소드 제공 모든 멤버 메소드는 static으로 정의됨 객체를 만들어서 사용할 필요 없음

주요 메소드 double 타입에 대한 주요 메소드 메소드 설명 static double abs(double a) 절대값 반환 static double cos(double a) cosine 값 반환 static double sin(double a) sine 값 반환 static double tan(double a) tangent 값 반환 static double exp(double a) 값 반환 static double ceil(double a) 지정된 실수보다 크거나 같은 수 중에서 가장 작은 정수를 실수 타입으로 반환 static double floor(double a) 지정된 실수보다 작거나 같은 수 중에서 가장 큰 정수를 실수 타입으로 반환 static double max(double a, double b) 두 수 중에서 큰 수 반환 static double min(double a, double b) 두 수 중에서 작은 수 반환 static double random() 0.0보다 크거나 같고 1.0보다 작은 임의의 수 반환 static double rint(double a) 지정된 실수와 가장 근접한 정수를 실수 타입으로 반환 static double round(double a) 지정된 실수를 소수 첫째 자리에서 반올림한 정수를 실수 타입으로 반환 static double sqrt(double a) 제곱근을 반환

Math 클래스를 활용한 난수 발생 난수 발생 static double random() 위의 코드에서 round() 메소드는 Math. round(55.3)은 55.0을 리턴 하며, Math. round(55.9)는 56.0을 리턴 java.util의 Random 클래스를 이용하면 좀 더 다양한 형태로 난 수 발생 가능 (뒷 페이지 참조) for(int x=0; x<10; x++) { double d = Math.random()*100; // [0.0 ~ 99.9999] 실수 발생 int n = (int)(Math.round(d)); // Math.round(d)는 d에 가장 가까운 정수를 리턴 System.out.println(n); }

Random 클래스

예제 Random rand = new Random(System.currentTimeMillis()); // seed값을 배정하여 생성

java.util.Random 클래스로 난수를 만드는 법: Foo.java import java.util.Random; class Foo {   public static void main(String args[]) {     Random oRandom = new Random();     // 1~10까지의 정수를 랜덤하게 출력     int i = oRandom.nextInt(10) + 1;     System.out.println(i);     // 0.0f 에서 1.0f 까지의 실수를 랜덤하게 출력     // 3.7670135E-5 라는 값이 나올 수도 있는데 이것은     // 0.000037670135 입니다.     float f = oRandom.nextFloat();     System.out.println(f);     // true(참), false(거짓) 중의 하나를 랜덤하게 출력     Boolean b = oRandom.nextBoolean();     System.out.println(b);   } } 3 0.40327173 true

예제 6-7 : Math 클래스 메소드 활용 Math 클래스의 다양한 메소드 활용 예를 보여라. Java.lang 패키지 public class MathEx { public static void main(String[] args) { double a = -2.78987434; // 절대값 구하기 System.out.println(Math.abs(a)); System.out.println(Math.ceil(a)); // ceil System.out.println(Math.floor(a)); // floor System.out.println(Math.sqrt(9.0)); // 제곱근 System.out.println(Math.exp(1.5)); // exp System.out.println(Math.rint(3.141592)); // rint // [1,45] 사이의 난수 발생 System.out.print("이번주 행운의 번호는"); for (int i=0; i<5; i++) System.out.print(Math.round(1 + Math.random() * 44) + " "); System.out.println("입니다."); } 2.78987434 -2.0 -3.0 3.0 4.4816890703380645 이번주 행운의 번호는 35 42 18 31 33

예제

Class 클래스 Class 객체는 실행 중인 클래스를 나타낸다. Java.lang 패키지 Class 클래스 Class 객체는 실행 중인 클래스를 나타낸다. Class 객체는 자바 가상 기계에 의하여 자동적으로 생성 된다. Class 객체를 이용하면 객체의 클래스 이름을 출력할 수 있다.

Java.lang 패키지 System 클래스 System 클래스는 실행 시스템과 관련된 속성과 메소드 를 제공

System 클래스

Arrays 클래스(정수배열, 실수배열, …,객체배열) Java.util 패키지

예제

Java.util 패키지 Date 클래스 현재 시각을 나타낸다.

Calendar 클래스 Java.util 패키지 추상 클래스로 날짜와 시간에 대한 정보를 가진다.

예제

Open Challenge 입력 It is rather for us to be here dedicated to the great task remaining before us—that from these honored dead we take increased devotion to that cause for which they gave the last full measure of devotion—that we here highly resolve that these dead shall not have died in vain—that this nation, under God, shall have a new birth of freedom—and that government of the people, by the people, for the people, shall not perish from the earth. 히스토그램을 그립니다. A----------------------------- B---- C---- D----------------- E-------------------------------------------------------- F----------- G------ H-------------------------------- I----------------- 출력

Open Challenge J K-- L-------------- M------ N----------------- Q R---------------------- S---------------- T---------------------------------------- U------ V-------- W---- X Y--- Z

AlphabetHistogramApp.java import java.io.IOException; import java.io.InputStreamReader; public class AlphabetHistogramApp { int histoData [] = new int [26]; // 영어 알파벳 26자를 카운팅하는 정수형 배열 StringBuffer sb = new StringBuffer(); // 키 입력을 받을 스트링 버퍼 public AlphabetHistogramApp() { for(int i=0; i<histoData.length; i++) histoData[i] = 0; // 초기에 카운팅 값을 모두 0으로 설정 } // 키보드로부터 알파벳 문자를 읽고 히스토그램을 그리는 핵심 메소드 public void run() { readString(); makeHistogram(); drawHistogram();

AlphabetHistogramApp.java // 입력받은 문자들로부터 히스토그램의 데이타를 만든다. public void makeHistogram() { String s = sb.toString(); // 스트링 버퍼의 문자열을 스트링으로 리턴 s = s.toUpperCase(); // 스트링을 모두 소문자로 변경 // 입력된 모든 문자를 비교하여 히스토 데이타를 만든다. for(int i=0; i<s.length(); i++) { char c = s.charAt(i); if(c >= 'A' && c <= 'Z') { // 알파벳 문자만 카운팅 int index = c - 'A'; histoData[index]++; }

AlphabetHistogramApp.java // 히스토그램을 그린다. public void drawHistogram() { System.out.println("\n히스토그램을 그립니다."); for(int i =0; i<histoData.length; i++) { System.out.print((char)('A'+ i)); //대문자를 출력한다. for(int j=0; j<histoData[i]; j++) System.out.print('-'); // 히스토데이타 개수만큼 -를 출력한다. System.out.println(); }

AlphabetHistogramApp.java // 키보드로부터 문자열을 읽어 스트링 버퍼에 저장한다. public void readString() { InputStreamReader rd = new InputStreamReader(System.in); try { while (true) { int c = rd.read(); //Ctrl-z가 입력되면 -1을 리턴한다. if (c == -1) break; sb.append((char)c); // 읽은 문자를 스트링 버퍼에 추가한다. } catch (IOException e) { System.out.println("입력 에러 발생");

AlphabetHistogramApp.java public static void main(String[] args) { AlphabetHistogramApp app = new AlphabetHistogramApp(); app.run(); }

실습 #1: 7. CTRL-Z가 입력될 때까지 키보드로부터 문자를 읽고 사용자가 입력한 문자열에서 단어를 분리하여 단어의 개수를 출력하는 프로그램을 작성하라. 단어는 공백으로 분리한다. import java.util.*; public class WordCount { public static void main (String[] args) { … while(sin.hasNext()) { str = sin.nextLine(); StringTokenizer st = new StringTokenizer(str); n += st.countTokens(); // 단어 개수 누적 } Scanner 객체

Another Sol. import java.util.Scanner; public class WordCount { public static void main (String[] args) { Scanner sin = new Scanner(System.in); String str; System.out.print("문자열을 입력하세요>>"); int n = 0; while(sin.hasNext()) { str = sin.next(); n++; } System.out.println("단어의 개수는 " + n); // 누적 단어 갯수 출력

실습 #2: 8. CTRL-Z가 입력될 때까지 키보드로부터 문자를 읽고 사용자가 입력한 문자열에서 제일 긴 단어를 출력하는 프로그램을 작성하라. 단어는 공백으로 분리한다. import java.util.*; public class LongWordCount { public static void main (String[] args) { … while(sin.hasNext()) { str = sin.nextLine(); StringTokenizer st = new StringTokenizer(str); } Scanner 객체

프로그램 을 실행하여 보고 이상한 점을 살펴보자. 필요하면 debug를 사용하여 보자 import java.util.*; public class LongWordCount { public static void main (String[] args) { Scanner sin = new Scanner(System.in); String str; System.out.print("문자열을 입력하세요>>"); String longestWord = null; while(sin.hasNext()) { str = sin.nextLine(); StringTokenizer st = new StringTokenizer(str); for (int i=0; i<st.countTokens(); i++) { String token = st.nextToken(); if (longestWord == null || token.length() > longestWord.length()) // 첫 단어이거나 현재 단어가 지금까지 가장 긴 단어보다 긴 경우 longestWord = token; } System.out.println("가장 긴 단어는 " + longestWord); // 누적 단어 갯수 출력 프로그램 을 실행하여 보고 이상한 점을 살펴보자. 필요하면 debug를 사용하여 보자

i<st.countTokens(); ?????  어떻게 동작하나???

StringTokenizer 클래스의hasMoreTokens() 메소드를 사용하여 수정하여보자!!! 한글 자료를 입력하여 보자!!!

실습 #3: 키보드로부터 한 행을 읽고 사용자가 입력한 단어를 정렬하고 그 결과를 출력하는 프로그램을 작성하라. import java.util.*; public class WordSort { public static void main (String[] args) { … str = sin.nextLine(); StringTokenizer st = new StringTokenizer(str); } 단어들을 입력하시요 : 김막동 박성규 이인수 주영훈 서인재 오성식 모두 6개의 단어가 있습니다. 김막동 박성규 서인재 오성식 이인수 주영훈