177
1 슬라이드 1 Java Programming

Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

1

슬라이드 1

Ja va Progra mming

Page 2: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

2

슬라이드 2

Contents

• Chapter 01 자바 언어의 소개

• Chapter 02 자바 기본 구문

• Chapter 03 객체지향의개요

• Chapter 04 클래스

• Chapter 05 정보은닉

• Chapter 06 상속과 다형성

• Chapter 07 추상클래스및 인터페이스

• Chapter 08 예외처리

• Chapter 09 시스템 API

• Chapter 10 유틸리티 API

• Appendix A Eclipse

Page 3: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

3

슬라이드 3

자바 언어의 소개

Page 4: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

4

슬라이드 4

Ja va 언어의 특징(Ⅰ)

• 단순(simple) 하다.

• 객체지향 (Object-oriented)프로그래밍 언어이다.

• 분산처리(distrubyted)에 용이하다.

단순(simple) 하다.

자바언어는 C++언어의 영향을 많이 받아 C++언어와 C언어와 상당히 유사한

구문을 사용한다. C++에서 혼란스러운 사양(포인터연산자, 다중상속, 구조체 사용,

연산자 중복기능 등)을 자바에서 삭제했고 garbage collection, standard package등

유용한 개념을 도입했다.

객체지향 (Object-oriented)프로그래밍 언어이다.

절차지향 언어에서는 프로그램이 대부분 데이터를 변화시키는 알고리즘

중심으로 구성되지만, 객체지향언어는 프로그램이 객체들의 집합이고, 객체는 자신이

가지는 고유의 데이터와 그 데이터를 처리할 수 있는 메소드를 가지고 있는 하나의

Page 5: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

5

단위이다. 구현에 있어서, 요구에 맞는 객체를 만들어 내기 위해서는 일반적으로

절차지향 언어에 비해서 분석이나 설계를 더 비중 있게 생각해야 한다.

분산처리(distrubyted)에 용이하다.

자바는 인터넷 또는 네트워크와 같은 분산 환경에서 TCP/IP등읠 프로토콜을

통해 효율적으로 실행할 수 있도록 설계된 언어이다. 네트워크에 관련된 많은

라이브러리를 제공한다.

Page 6: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

6

슬라이드 5

Ja va 언어의 특징 (Ⅱ)

• 인터프리터(interpreter)에 의해 실행된다.

• 플랫폼에 독립(architecture neutral, portable)이다.

컴파일러

바이트 코드

자바 프로그램

인터프리터 인터프리터 인터프리터

Sun Ultra Solaris Mac 시스템 PC 호환System Windows NT

개발환경

실행환경JVM JVM JVM

인터프리터(interpreter)에 의해 실행된다.

컴파일러에 의해 바이트코드로 구성된 .class파일이 만들어지고 이 바이트 코드는 Java

Runtime Environment의 인터프리터에 의해 실행된다. 여기서 바이트 코드란 기계어코드처럼 0과

1의 연속이 아니라 기계어와 1:1로 대응되는(어셈블러 같은) 명령들의 집합으로, 이 바이트

코드가 인터프리터를 통해 기계어로 번역되면서 실행된다.

즉, 자바 컴파일러와 자바 런타임 환경을 가지고 자바언어로 작성된 소스파일을 각자의 플랫폼에

독립적인 형태로 컴파일 하고 실행한다.

JVM(Java Virtual Machine)이 이식된 모든 플랫폼에서 수행 가능하다.

Page 7: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

7

슬라이드 6

Ja va 언어의 특징 (Ⅲ)

• 견고(Robust )하다.

• 안전(secure)하다.

[네트워크를 통한 자바 프로그램의 실행과정]

견고(Robust )하다.

하나의 프로그램이 다양한 플랫폼에서 실행되려면 높은 신뢰성을 가져야한다. 자바는

이런 신뢰성을 위해 기존 언어에서 많은 에러의 원인이 되는 요소들을 제거하거나 자동으로

해결한다.

- garbage collection기능을 수행한다.

- 엄격한 데이터형의 검사를 통해 에러를 조기에 발견한다.

- 포인터를 사용한다.

- 예외를 처리한다.

안전(secure)하다.

자바는 분 산 네트워크 환경에서 실행될 수 있도록 설계된 언어이고 네트워크에서

Page 8: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

8

중요한 요소는 보안이다. 자바를 실행하는 인터프리터는 바이트 코드를 불러오고, 검증하고,

수행하는 작업을 단계적으로 수행한다.

바이트 코드는 인터프리터 내의 클래스 로더(Class Loader)에 의해 로드되며, 바이트 코드

검증기에 의해 프로그램 수행 전에 부적절한 클래스 접근이나, 스택 오버플로우, 부적절한 형

변환 등을 검사한다.

Page 9: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

9

슬라이드 7

자바의 플랫폼

자바 플랫폼의 종류

JAVA SE

JAVA EE

JAVA ME

자바 플랫폼의 구조

플랫폼 사용자 정의 자바 프로그램

자바 플랫폼자바 API

자바 가상머신

일반 플랫폼운영체제

하드웨어

플랫폼이란

프로그램이 실행될 수 있는 하드웨어, 소프트웨어 환경을 말한다.

자바 플랫폼

소프트웨어만으로 구성되며 자바 플랫폼은 3가지 영역으로 나뉜다.

-JavaSE : 데스크톱 어플리케이션을 개발하기 위한 플랫폼이다.

-JavaEE : 기업형 플랫폼으로 EJB, SERVLET, JP, CORBA기술용 API를 지원하는

플랫폼이다.

-JavaME : 임베디드 기기 시장을 위한 플랫폼으로 PDA, 셋톱박스, 모바일

프로그램을 위한 플랫폼이다.

Page 10: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

10

자바 가상 머신

컴파일 후 생성된 바이트 코드를 기계어로 실행시켜주는 가상기계를 말한다.

자바 API

자바 개발환경에서 제공되는 거대한 클래스 라이브러이다.

JDK설치후 JDK경로에 추가된 rt.jar파일이 대표 API용 압축파일이다.

Page 11: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

11

슬라이드 8

Ga rba ge Collec tion

프로그래머에 의한 메모리 관리 문제점

할당된 메모리 영역 초과

메모리 부족

메모리 Scope을 벗어남

자바 메모리 관리

JVM(Java Virtual Machin) 내부에서 Garbage Collection기능을 담당하는Garbage Collector의 동작에 의해 가능하다.

가비지 컬렉터가 프로세서의 대기시간에 메모리 상황을 추적하여 더 이상 사용하지 않는 메모리를 찾아 자동으로 해제 시켜 준다.

일반적인 메모리 관리

C언어와 같은 일반 언어의 경우, 필요에 따라 할당하여 사용된 메모리는 프로그래머가

직접 해제해줘야 한다. 하지만 직접 메모리 관리를 하는 경우

-참조형 변수들에 대한 산술연산을 할 때 포인터로 인한 메모리초과,

-잦은 메모리생성및해제작업에 의한 연속메모리공간부족,

-생성후 해제하지 않을 경우 발생하는 메모리 누수등

의 여러 문제가 발생할 수 있다.

자바 메모리 관리

한번 객체가 할당되면, 실행시간에 자바 가상 머신은 객체의 상태 정보를 계속 추적하고, 객체가

더 이상 쓰이지 않으면 자동 메모리를 해제한다.

Page 12: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

12

자바 시스템의 메모리 할당 모델과 가비지 컬렉션 기능은 프로그래머의 부담을 줄여 주는 효과가

있다.

가비지 컬렉터는 객체를 생성할 때 할당된 메모리를 참조하는 참조변수가 하나도 없는 메모리를

찾아 해제시킨다. 즉, 할당된 메모리를 참조하는 변수들을 카운트하는 카운터를 두어 이 카운터의

값이 0이 되는 메모리가 바로 가비지 컬렌션의 대상이 된다.

Page 13: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

13

슬라이드 9

자바 응용 분야

기술 응용분야

APPLET 웹 클라이언트 분야

서블릿과 JSP 웹 서버 분야

EJB 기업형 분산컴포넌트 분야

Page 14: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

14

슬라이드 10

개발 환경 설치 및 설정

2. 설치경로 확인1. JDK 설치

JDK(JavaDevelopementKit)란

썬 마이크로 시스템사는 자바 프로그램 개발을 위한 자바 개발 환경(JDK)를

제공한다. JDK에는 JRE(JavaRuntimeEnvironment), 자바 컴파일러, 디버깅

도구등을 포함한다. jdk1.3이후에는 Java2라는 명칭 사용하고 jdk1.5부터

Java5.0 명칭 사용한다.

JDK 설치

http://java.sun.com/javase/downloads/5u20/jdk사이트에서 J2SE 5.0

Downloads 후 설치한다.

Page 15: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

15

슬라이드 11

개발 환경 설치 및 설정

3. 환경변수설정 4. 환경변수 설정후 cmd창에서javac.exe실행화면

설치경로 확인

설치 후 C:\Program Files\Java\jdk1.5.0_22가 만들어졌는가 확인한다.

컴파일러 응용프로그램은

C:\Program Files\Java\jdk1.5.0_22\bin\javac.exe이고

인터프리터 응용프로그램은

C:\Program Files\Java\jdk1.5.0_22\bin\java.exe이다.

컴파일과 실행하기 위해 매번

C:\Program Files\Java\jdk1.5.0_22\bin\java.exe로 이동하는 것은

번거로운 일이다.

Page 16: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

16

환경변수 설정

환경변수인 시스템 환경변수 path에

C:\Program Files\Java\jdk1.5.0_22\bin경로를 설정하면 어떤 폴더에서도

javac.exe와 java.exe를 실행할 수 있다.

Page 17: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

17

슬라이드 12

개발 환경 설치 및 설정

2.JDK Document사용

1.JDK Document설치

JDK Document 설치

JDK설치가 끝나면 컴퓨터에 JVM과 API가 탑재된다. API는 썬 마이크로

시스템사에서 제공하는 클래스 라이브러리이다. 이 라이브러리는 바이트

코드 상태로 제공하므로, 이 라이브러리를 사용하려면 사용설명서가 필요하다.

이 사용설명서를 HTML문서로 압축해서 제공하는데 이것을 document라 하고

압축파일을 다운로드받아 설치 후 사용하거나,

http://java.sun.com/j2se/1.5.0/docs/api/사이트에서 사용할 수 있다.

Page 18: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

18

슬라이드 13

프로그램의 구조

작업공간 설정

소스파일 작성

자바 소스파일작성법

public class 클래스이름{변수 정의생성자 정의메소드 정의

}

/**c:\myjava\day1\src\HelloWorld.java로 저장한다.*/public class HelloWorld{

public static void main(String[] args){/*new line없이 표준출력스트림에 출력하는 메소드System.out.print("Hello");

*/System.out.println("Hello World!");//표준출력스트림에 출력

} }

c:\myjava\day1\src

c:\myjava\day1\classes

메소드 영역의 시작

클래스 영역의 시작

문장의 끝

프로그램의 구조

자바소스는 반드시 클래스 단위로 구성되어야 한다. 클래스를 먼저 선언하고,

변수, 생성자, 메소드는 모두 클래스 내부에 정의한다.

소스

확장자가 .java인 소스 파일을 작성하고 소스파일이름은 클래스이름과 같게 한다.

자바 Comment 종류

1) // : 단일 라인의 내용을 주석처리

2) /* */ : 여러 라인의 내용을 주석처리

3) /** */ : 도큐먼트용 주석처리.

Page 19: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

19

자바 소스 파일 작성 후 javadoc라는 명령을 실행해서

도큐먼트용 주석문으로 구성된 도큐먼트를 만들 수 있다.

Page 20: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

20

슬라이드 14

사용자클래스용 도큐먼트 만들기도큐먼트 작성법 : javadoc [options] [packagenames] [sourcefiles] [@files]

사용자클래스 도큐먼트

javadoc

JDK를 설치하면 포함되는 API의 사용설명서가 있듯이, 사용자가 작성한

클래스의 사용설명서도 만들 수 있다.

javadoc 실행 예

c:\myjava\day1>javadoc -d doc src\HelloWorld.java

javadoc 실행후 c:\myjava\day1\doc\index.html를 실행해서 도큐먼트를 볼 수 있다.

Page 21: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

21

슬라이드 15

컴파일 / 실행방법

클래스 실행 : java [-options] class [args...]

컴 파 일 : javac <options> <source files>

where possible options include:-d <directory> Specify where to place generated class files-classpath <path> Specify where to find user class files

where options include-cp <class search path of directories and zip/jar files>

컴파일

javac컴파일러로 바이트코드로 구성된 .class파일을 만든다. 옵션 없이 컴파일

하면 소스가 저장된 경로에 .class가 만들어지고

-d옵션을 사용해서 컴파일 하면 특정폴더에 .class를 만들 수 있다.

아래 두 가지 방법으로 컴파일된 .class가 각각 어느 폴더에 만들어지는가

확인해보자.

1) c:\myjava\day1>javac src\HelloWorld.java

2) c:\myjava\day1>javac -d classes src\HelloWorld.java

클래스 실행

java인터프리터로 바이트코드로 구성된 class를 재해석한다. 인터프리터 내의

Page 22: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

22

클래스 로더(Class Loader)에 의해 로드되며, 바이트 코드 검증기에 의해

프로그램 수행 전에 부적절한 클래스 접근이나, 스택 오버플로우, 부적절한 형

변환 등을 검사한 후 실행된다.

컴파일된 클래스의 경로를 지정해서 클래스를 실행할 수 있다.

컴파일1)번을 사용했다면 실행1)번과 같이 실행 해야 하고, 컴파일2)번을 사용했다면

실행2)번과 같이 실행해야 한다.

실행방법

1) c:\myjava\day1>java -classpath src HelloWorld

2) c:\myjava\day1>java -classpath classes HelloWorld

Page 23: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

23

슬라이드 16

자바 기본 구문

Page 24: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

24

슬라이드 17

식별자

식별자

변수, 메소드, 클래스, 패키지 이름을 정하는데 사용

식별자 규칙

첫 문자가 문자나 _, $ 시작될 수 있다. 숫자로 시작할 수 없다.

첫 문자가 아니라면, 문자나 _, $, 숫자로 구성될 수 있다.

길이에 제한이 없으며, 대소문자 구분한다.

자바 예약어는 식별자로 사용될 수 없다.

식별자의 길이는 제한이 없고 공백은 포함할 수 없다.

명명 관례

클래스 이름은 대문자의 명사로 시작하고, 메소드 이름은 소문자의 동사, 변수는 소문자의 명사, 상수는 대문자의 명사로 하는 것이 일반적이다.

Page 25: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

25

슬라이드 18

Keywords

기본 자료형 boolean byte short int long char float double void

리터럴 true false null

문장 if else switch case default for while do break continue return

클래스 class interface extends implements static abstract final new instanceof this super

접근 제어 public protected private

특수 변수 선언 volatile transient

특수 메소드 선언 synchronized native

패키지 package import

예외 처리 try catch finally throw throws

Page 26: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

26

슬라이드 19

Ja va의 메모리

Method

AreaHeap Stack Registers

Constant

Pool

Runtime Data Area

Class Loader

Execute Engine

메소드 영역( Method area) – static

컴파일된 코드 저장소

프로그램이 수행되는 동안 클래스의 정보를 참조하는 곳 - 로딩된 클래스의 정보,

맴버변수 정보, static 메소드 정보, static 변수(정적 변수)

객체를 만들지 않아도 이영역의 요소 사용 가능

JVM에서 실행되고 있는 모든 프로그램(쓰레드)에 의해 공유

스택 영역(Stack area)

메소드가 호출될 때마다 스택 프레임이라는 데이터 영역이 생성되며, 이것이 쌓여 스택을

구성한다. - 지역변수, 매개변수, 임시변수, 레퍼런스 변수(참조 변수 ex : new class()) 저장

컴파일시 크기 및 life cycle이 정해지는 데이터 저장

자동초기화 되지 않음

힙 영역(Heap area)

Page 27: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

27

프로그램상에서 데이터를 저장하기 위해 동적으로 할당하여 사용할 수 있는 메모리

인스턴스가 생성되는 공간(new 연산자를 사용하여 동적으로 생성된 객체를 저장(배열

포함))

런타임시에 결정될 데이터 저장

자동 초기화 됨

GC(Garbage Collector)의 대상

Native 메소드 스택

native 메소드(자바 언어가 아닌 다른 언어에서 제공되는 메소드 )의 매개변수, 지역변수

등을 저장

PC 레지스터(register)

스레드가 시작할 때 생성되어 JVM이 현재 수행할 명령어의 주소를 저장

Page 28: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

28

슬라이드 20

정적 vs. 동적 클래스 로딩

Language

CPU

(x86,sparc,intel)

Compile time LinkingLoading

• Static Linking & Loading

Java

VM

CPU

Compile Time – Type Exam

Runtime Linking VS Class-Loader

Loading

정적 vs. 동적 클래스 로딩

Page 29: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

29

슬라이드 21

동적 클래스 로딩 아키텍쳐

Java Virtual Machine

Class

Loader

Execute Engine

Host operating System

byte-code

Your

Program’s

Class

File

Java API’s

Clss

File

동적 클래스 로딩 아키텍쳐

Page 30: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

30

슬라이드 22

자바의 자료형

기본형 참조형

Page 31: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

31

슬라이드 23

자바의자료형 – 기본 자료형

자료 형 변환

자동형변환(묵시적형변환) : 더 큰 범위를 나타내는 자료형으로 자동형변환

가능하다.

byte --> short --> int --> long --> float --> double

char -->

예) byte b = 10; int i = b;

강제형변환(명시적형변환) : 더 작은 범위를 나타내는 자료형으로는

cast연산자를 이용해서 강제 형변환 해야 한다.

int i = 10;

byte b1 = i; //컴파일 오류

byte b2 = (byte)i; //정상컴파일,실행

Page 32: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

32

기본형과 참조형사이의 형변환은 할 수 없고,

boolean형은 다른 기본형과 형변환 할 수 없다.

float형에 리터럴을 대입할 때는 f또는 F를 기술해야한다.

ex) float f1 = 32.5; //컴파일 오류

float f2 = 32.5F; //정상컴파일,실행

float f3 = (float)32.5; //정상컴파일,실행

int보다 작은범위의 자료형은 사칙연산(+, -, *, /, %)할때 int로 자동형변환 된다.

ex) byte b1, b2, b3;

b1 = 10; b2=20;

b3 = b1+b2; //컴파일 오류

b3 = (byte)(b1+b2);

Page 33: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

33

슬라이드 24

변수의 종류

지역변수(local variables)

메소드 호출시 스택에 저장되는 변수

자동초기화 안됨

메소드에서만 사용가능한 변수

매개변수(parameters)

메소드 인자값이 전달되는 변수

메소드 호출시 스택에 저장되는 변수

자동초기화 안됨

메소드에서만 사용가능한 변수

인스턴스 변수(instance fields)

클래스 내에서 선언

객체생성 후 자동 초기화되는 변수

스태틱 변수(class fields) -클래스 필드, 정적 변수, 정적 필드라고도 한다.

클래스 내에 선언

클래스로드 작업 후 자동 초기화되는 변수

Page 34: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

34

슬라이드 25

연 산 자(Ⅰ)

연산자 사용법 설명

산술

연산자

++++값

값++

----값

값--

+,-,*, / 값1+값2

% 값1%값2

비교

연산자

>, >=, <, <= 값1 > 값2

== 값1 == 값2

!= 값1 != 값2

instanceof 값1 instanceof 값2

위의 설명 부분을 완성해보시오.

Page 35: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

35

슬라이드 26

연 산 자 (Ⅱ)

연산자 사용법 설명

논리

연산자

&& 값1 && 값2

& 값1 & 값2

|| 값1 || 값2

| 값1 | 값2

비트

연산자

& 값1 & 값2

| 값1 | 값2

^ 값1^값2

~ ~값1

>> 값1 >> 값2

>>> 값1 >>>값2

<< 값1 << 값2

Page 36: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

36

슬라이드 27

연산자 우선순위

전치(prefix) + - ++ -- ~ (자료형) new

승제 * / %

가감 + -

비트 이동 << >> >>>

비교 < <= > >= instanceof

등식 == !=

비트단위 AND &

비트단위 배타합 ^

비트단위 OR |

논리 AND &&

논리 OR ||

삼항 expr ? expr : expr

대입 = *= /= %= += -= <<= >>= >>>= &= ^= |=

Page 37: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

37

슬라이드 28

조건문(if)

if 문 구조

if (조건) { 문장 1; }[ else { 문장 2; } ]

if (조건1) { 문장 1;}else if (조건2){ 문장2; }[ else { 문장2; } ]

if 문

조건평가의 결과가 true일 경우에 문장을 수행한다.

아래실행 결과를 예상해보시오.

• class IfStmt{

• public static void main( String args[] ) {

• f(6);

• }

• static void f(int i) {

• if (i%2 == 0) System.out.println("짝수");

• if (i%3 == 0) {

• System.out.println("3의 배수");

Page 38: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

38

• System.out.println("i = " + i);

• }

• if (i%5 == 0) System.out.println("5의 배수");

• else if (i % 5 == 1) System.out.println("5의 배수 + 1");

• else System.out.println("5의 배수 + 2 혹은 3 혹은 4");

• }

• }

Page 39: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

39

슬라이드 29

조건문(switch)

switch 문 구조

switch(int 자료형의 수식){case 값1: 수행할 문장들

[break;]case 값2: 수행할 문장들

[break;]

[default : 수행할 문장들[break;]

]

switch

switch문은 우선 수식이 평가되고 평가된 값에 적합한 case절이 수행된다. 적합한

case를 만나지 못하면 default절이 수행된다. 각각의 case는 switch문에서 유일한 값을

가져야 하고, 수식부분은 byte, short, char, int형만 올 수 있다.

적합한 절을 수행한 후 break를 만나면 switch문을 종료한다.

아래실행 결과를 예상해보시오.

• class SwitchStmt{

• public static void main( String args[] ) {

• f(5); f(6); f(7); f(8);

• }

Page 40: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

40

• static void f(int i) {

• switch( i % 5 )

• {

• case 0: case 1:

• System.out.println( "5의 배수 혹은 + 1" );

• break;

• case 2:

• System.out.println( "5의 배수 + 2" );

• default:

• System.out.println( "default" );

• }

• }

• }

Page 41: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

41

슬라이드 30

반복문

for문

while문

do~while문

for (초기값; 조건; 증감){반복수행할 문장들

}

while ( 조건 ){반복수행할 문장들

}

do{반복수행할 문장들

} while ( 조건 );

아래실행 결과를 예상해보시오.

• class IterStmt{

• public static void main( String args[] ) {

• int n = 10, sum = 0;

• for( int i = 1; i <= n; i++ ){

• sum += i;

• }

• int i;

• i = 1;

• while(i <= n) {

• sum += i;

Page 42: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

42

• i++;

• }

• i = 1;

• do {

• sum += i;

• i++;

• } while (i <= n);

• }

• }

Page 43: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

43

슬라이드 31

제어문

break 문

해당 블럭을 빠져나올 때 사용된다.

switch 블록 빠져나올때

for, while, dowhile 블록 빠져나올때

for, while, dowhile 중첩반복문에서 레이블이 있는 반복문을 빠져나올때

continue 문

반복문 내에서 해당 반복문의 처음 위치로 제어를 이동할 때 사용된다.

return 문

수행중인 메소드의 수행을 중단하고 메소드를 호출한 곳으로 제어를 반환한다.

Page 44: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

44

슬라이드 32

자바배열은 참조형이다.

배열도 객체이다

배열 선언

int[] a; (혹은 int a[];)

배열 생성

a = new int[3];

배열 초기화

int[] a1 = {1, 2, 3, 4};

배열 길이

a.length

Stacka

a1

Heap

배열

0 0 0

1 2 3 4

2차원 배열

배열 선언은 int[][]a; , int[]a[]; , int[][]a; 로 선언가능하고

배열 생성은 a = new int[3][2]; 으로 생성한다.

이때 a.length는 행의 개수인 3을 반환한다. 열의 개수를 알고싶다면

a[0].length라고 해야한다.

행별 열수를 다르게 줄 수 있는 2차원 배열

아래와 같이 배열생성시 행수만 지정할 수 있다.

int [][]b = new int[3][];

그 다음 행별 열수를 각각 다르게 지정하면 메모리를 좀 더 효율적

으로 관리할 수 있다.

Page 45: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

45

b[0] = new int[100];

b[1] = new int[2];

b[2] = new int[5];

Page 46: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

46

슬라이드 33

배열의 안전한 접근

1. class ArrayExceptionTest

2. {

3. public static void main( String[] args )

4. {

5. int a[] = {1, 2};

6. System.out.println( a[-1] );

7. // throw ArrayIndexOutOfBoundsException

8. System.out.println( a[2] );

9. // throw ArrayIndexOutOfBoundsException

10. a = null;

11. a[0] = 3; // throw NullPointerException

12. }

13. }

Page 47: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

47

슬라이드 34

실 행 매 개 변 수

1. class ArgsTest

2. {

3. public static void main (String[] args)

4. {

5. for(int i = 0; i < args.length; ++i)

6. System.out.println( "args[" + i + "] = " + args[i] );

7. }

8. }

java ArgsTest 1000 test.txt

Page 48: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

48

슬라이드 35

객체 지향의 개요

Page 49: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

49

슬라이드 36

객체지향 소프트웨어 방법론

이전 소프트웨어 방법론의 문제점

스파게티 코드(spaghetti code)

구조적 분석과 설계

데이터 중심 분석과 설계

객체지향 소프트웨어 방법론

어떠한 기존의 방법도 데이터와 함수를 함께 다루지 않는다

데이타(자료구조; 상태변수)와 오퍼레이터(함수)가 하나로 묶여있는 형태인 객체를 기반으로 객체들간의 상호작용으로 메시지를 주고받도록 설계한다.

스파게티 코드 생성

1960년대에는 작고 간단한 응용 시스템을 만들어 제한된 시스템 자원 하에서

최대한의 효과를 보고자 노력했다.

그러나 수많은 GOTO 구문은 소프트웨어 시스템을 보수/관리하기 어렵게 함

구조적 분석과 설계의 문제

높은 결합도(coupling)와 낮은 응집도(cohesion)에 의한 시스템의 복잡도 증가

데이터 중심 분석과 설계의 문제

데이터 모델링 기법은 시스템의 기능을 표현하는데 도움을 주지 못하고

추가적인 방법을 필요로 함

Page 50: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

50

객체지향 소프트웨어 방법론

실세계의 모의실험을 목전으로 만들어진 시뮬라라는 언어의 등장에서

소개되었다.

높은 응집도와 낮은 결합도를 제공해 주어, 기존의 방법론에서

나타났던 문제점들을 상당부분 해소시켜 줄 수 있는 방법론으로

등장하게 되었다.

Page 51: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

51

슬라이드 37

객체지향의 주요개념

1. 추상화 (Abstraction) 및 추상화 자료형 (ADT : Abstract Data Type)

실세계 문제 개념 추상화 자료형

추상화 인간두뇌 프로그래밍 컴퓨터

객체지향의주요개념

1. 추상화 (Abstraction)2. 객체3. 클래스4. 상속5. 메시지6. 정보은닉7. 다형성

객체지향언어 : 절차지향 언어에서는 프로그램이 대부분 데이터를 변화시키는

알고리즘 중심으로 구성되지만, 객체지향언어는 프로그램이 객체들의 집합이고, 객체는

자신이 가지는 고유의 데이터와 그 데이터를 처리할 수 있는 메소드를 가지고 있는

하나의 단위이다.

1.추상화 : 실세계의 문제를 단순, 개념화하는 과정.

개념 : 다른 것과 구별되어 특징을 갖는 현실의 개체들을 일반화하여 생각 속에

저장한 것.

추상화 자료형 : 추상화를 통해 정의된 개념을 컴퓨터 체계 속에 표현한 것.

클래스를 말한다.

Page 52: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

52

2. 객체 : 추상화한 개념을 프로그램 요소로 정의한 것으로 데이터(상태변수)와

오퍼레이터(메소드)로 구성된다.

3. 클래스 : 객체를 만들기 위한 틀이며, 객체의 자료형으로 쓰인다.

클래스에서 객체가 만들어지는 과정을 인스턴화라고 하고 생성된 객체는

인스턴스라고 한다. 앞으로 객체와 인스턴스는 같은 의미로 사용한다.

Page 53: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

53

슬라이드 38

객체지향의 주요개념

4. 상속 :

5. 메시지 (Message) : 객체 간의 통신. 객체에게 메소드 수행을 요청하는자극. 즉, 메소드 호출을 의미하며 내용을 명확히 하기 위해 파라미터를정보로 같이 전달한다.

6. 정보은닉 (Data Hiding, Encapsulation) : 클래스를 일종의 시스템 블랙박스로 생각하고 내부는 알 필요 없이 블랙박스의 입출력 방법만 알면접근할 수 있도록 지원하는 방법.

7. 다형성 (Polymorphism) : 동일한 기능에 대하여 상황(문맥)에 따라 서로다르게 동작하도록 하여 프로그램을 쉽게 확장시키는 방법

Page 54: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

54

슬라이드 39

클래스

Page 55: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

55

슬라이드 40

클래스의 구조와 객체생성

클래스의 구조

클래스의 인스턴스(instance)화

참조변수에 대입

ex) Circle c = new Circle();

인스턴스의 속성과 기능을 호출하기위해 .연산자 사용

ex) c.setRadius(10);

public class 클래스이름{변수 정의생성자 정의메소드 정의

}

new 클래스명()

• class Circle{

• private double radius = 0;

• public void setRadius( double r ){

• radius = r;

• }

• public double getArea(){

• return Math.PI * radius * radius;

• }

• public void display(){

• System.out.println("Areas of circle with radius " +

• radius + " = " + getArea() );

• }

Page 56: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

56

• }

• class CircleTest{

• public static void main( String args[] ) {

• Circle circle1 = new Circle(), circle2 = new Circle();

• circle1.setRadius( 2 );

• circle2.setRadius( 3 );

• circle1.display();

• circle2.display();

• double sumAreas = circle1.getArea() + circle2.getArea();

• System.out.println( "Sum of areas of circle1 and circle2 = "

• + sumAreas );

• }

• }

Page 57: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

57

슬라이드 41

멤버변수

변수의 구조

멤버변수의 종류

- 인스턴스 변수(instance fields)

클래스 영역내에서 선언

객체생성 후 자동 초기화되는 변수

- 스태틱 변수(class fields) -클래스 필드, 정적 변수, 정적 필드라고도 한다.

클래스 내에 선언

Runtime시 자동 초기화되는 변수

[modifier] 자료형 변수이름;

메소드 영역에 선언하는 지역변수와 달리 클래스영역에 선언하는 변수를 멤버변수(member

field)라고 한다.

인스턴스변수는 객체생성시 heap메모리영역에 탑재되는 변수로 객체 별 다른 값을 가질 수

있다. 따라서 인스턴스변수는 객체를 생성 후에만 사용가능 하다. 사용법은 객체를 참조하는

참조변수.인스턴스변수로 접근할 수 있다.

객체별 다른 값을 갖는 변수가 아닌 동일클래스형의 객체들 사이의 공유 값을 가질 수는 없을까?

스태틱변수는 객체생성과 무관하게 static메모리영역에 탑재되는 변수로 객체들 사이의

공유값을 가질 수 있고 객체생성과 무관하게 사용 가능하다. 이렇게 객체생성없이 사용하는

스태틱변수는 클래스이름.스태틱변수로 접근할 수 있다.

Page 58: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

58

Page 59: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

59

슬라이드 42

insta nce fie ld 와 sta tic fie ld

1. public class StaticTest {

2. public static void main(String[] args) {

3. A a1, a2;

4. System.out.println(A.si); //

5. System.out.println(A.i); //

6. a1 = new A();

7. a1.si++;

8. a1.i++;

9. a2 = new A();

10. System.out.println(a2.si); //

11. System.out.println(a2.i); //

12. System.out.println(Math.PI); //

1. class A{2. int i; //인스턴스변수3. static int si; //static변수4. }

• StaticTest.java를 컴파일 할 경우 오류가 발생되는 위치를 찾아보자.

• 오류를 해결하고 실행했을 경우 //부분의 결과를 예상해보자.

• StaticTest클래스 Runtime시 메모리할당영역을 그림으로 그려보자

• instance변수와 static변수가 어떤 값으로 자동초기화 될까?

Page 60: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

60

슬라이드 43

객체의 생성자(construc tor)

객체생성순서

Employee e = new Employee( );

1) 참조변수 e할당

2) new키워드로 heap메모리할당

3) Employee클래스타입의 객체생성

4) 인스턴스 변수 초기화

5) 생성자 호출

생성자란

객체가 생성될 때 자동적으로 호출되는 특수한 메소드 이다.

객체의 초기화를 담당한다.

메소드와 같이 직접 호출할 수 없으며, new에 의해 간접적으로 호출된다.

생성자 작성 규칙

생생자이름은 클래스이름과 같아야 한다.

반환자료형이 없다.

Heap

name

no

dept

e

Employee형 인스턴스

null

null

null

• public class Employee {

• String name;

• String no;

• String dept;

• public Employee(){

• name = "이름없음"; no = "임시사번"; dept = "임시부서";

• System.out.println("인자없는 생성자 호출됨!!!");

• }

• public Employee(String na, String n, String d) {

• name = na; no = n; dept = d;

• }

• public void print(){

Page 61: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

61

• System.out.println(name + "," + no + "," + dept);

• }

• } 아래 실행 결과를 확인해보자.

• public class EmployeeUser {

• public static void main(String[] args) {

• Employee e1 = new Employee();

• Employee e2 = new Employee("홍길동", "101", "기획");

• }

Page 62: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

62

슬라이드 44

객체의 생성자(construc tor)

디폴트 생성자

개발자가 생성자를 기술하지 않으면 컴파일러에의해 디폴트생성자가 자동 추가된다.

디폴트 생성자의 형태

public 클래스이름( ){ }

this( )

현재객체의 다른 생성자를 호출한다.

생성자에서 사용가능하지만 메소드에서 사용할 수 없다.

생성자의 first statement에 위치해야한다.

아래소스에서 생성자와 메소드를 구별해본다.

A클래스용 default생성자가 추가될까?

B클래스용 default생성자가 추가될까?

• class A{

• public void A(){}

• }

• class B{

• public B(){}

• }

this( ) 예제

• public class Employee {

Page 63: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

63

• String name; String no; String dept;

• public Employee(){

• //name = "이름없음"; no = "임시사번"; dept = "임시부서";

• this("이름없음", "임시사번", "임시부서");

• System.out.println("인자없는 생성자 호출됨!!!");

• }

• public Employee(String na, String n, String d) {

• name = na; no = n; dept = d;

• }

• public void print(){

• System.out.println(name + "," + no + "," + dept);

• }

• }

Page 64: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

64

슬라이드 45

메소드

메소드는 클래스 내에서 객체의 동적인 특징, 즉 행위를 정의한 부분이다.

메소드 구조

메시지

객체간의 통신수단이다.

연결된 객체들 사이의 메시지를 전달하여 오퍼레이션을 수행하게 한다.

메소드

startbreak

car객체

car.start( key );

[modifier] 반환형 메소드이름 ([자료형 매개변수이름1, ...])[throws exceptionName, ...]{

기능구현}

메시지를 전달할 대상 객체 : car

전달하고 싶은 메시지 : start

메시지를 통해 전달하고 싶은 정보 : key

위의 요소를 조합해서 메시지를 생성해보면 car.start(key);와 같은 형태가 된다.

Page 65: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

65

슬라이드 46

메소드 다중 정의(overloa d ing)

1. class OverloadTest{

2. public static void main (String args[]) {

3. f('c'); // f(char) 호출

4. byte i = 2;

5. f(i); // f(int) 호출

6. short j = 2;

7. f(j); // f(int) 호출

8. f(2); // f(int) 호출

9. f(2L); // f(long) 호출

10. // f(2.0); // 오류: 묵시적 형변환 불가능

11. }

12. static void f(char c) { System.out.println("f(char)"); }

13. static void f(int i) { System.out.println("f(int)"); }

14. static void f(long i) { System.out.println("f(long)"); }

15.}

메소드 오버로딩

메소드이름 동일하고 메소드 매개변수리스트(개수또는 자료형)이 달라야한다.

Page 66: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

66

슬라이드 47

1. public class CallByTest {

2. public static void m(){ }

3. public static void m(int i){ i = 99; }

4. public static void m(int []arr){ arr[0] = 99; }

5. public static void main(String[] args) {

6. m();

7. int i=10;

8. m(i);

9. System.out.println(i); //결과예상

10.

11. int[]arr = {10, 20, 30};

12. m(arr);

13. System.out.println(arr[0]); // 결과예상

14. }

15.}

Ca llByVa lue

Page 67: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

67

슬라이드 48

sta tic method

static method란

객체생성과 무관하게 호출할 수 있는 메소드를 말한다.

메소드 선언 앞부분에 static 예약어를 사용한다.

ex) class A{

static void sm(){ }

}

클래스이름.스태틱메소드호출이 가능하다.

ex) A.sm();

• 아래 소스의 오류부분을 찾고 설명해보자.

• class A{

• int i;

• static int si;

• void m(){

• System.out.println(si);

• System.out.println(i);

• System.out.println(this.si);

• System.out.println(this.i);

• }

• static void sm(){

• System.out.println(si);

Page 68: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

68

• System.out.println(i);

• System.out.println(this.si);

• System.out.println(this.i);

• m();

• }

• }

• public class StaticTest {

• public static void main(String[] args) {

• A a1, a2;

• a1 = new A(); a2 = new A();

• A.sm();

• A.m();

• a1.sm();

• a1.m(); a2.m();

• } }

Page 69: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

69

슬라이드 49

this

this

메소드가 속하는 객체의 참조 값을 나타내는 예약어이다.

메소드 내에서만 사용 가능하다.

용도

현재객체의 인스턴스변수와 메소드를 정확히 지칭할 때 사용한다.

ex) double radius;

public void setRadius( double radius ){

this.radius = radius;

}

자신의 참조값을 다른 객체의 메소드에 전달할 때 사용한다.

ex) obj.someOtherMethod( this );

자신의 참조값을 반환

ex) return this;

• class Circle{

• private double radius = 0;

• public Circle setRadius( double radius ) {

• this.radius = radius;

• return this;

• }

• public double getArea() {

• return Math.PI * radius * radius;

• }

• public Circle display() {

• System.out.println("Areas of circle with radius " +

• radius + " = " + getArea() );

Page 70: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

70

• return this;

• }

• }

• class ThisTest{

• public static void main( String args[] )

• {

• Circle circle1 = new Circle();

• (((circle1.setRadius(3)).display()).setRadius(5)).display();

• circle1.setRadius(3).display().setRadius(5).display();

• }

• }

Page 71: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

71

슬라이드 50

정보은닉

Page 72: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

72

슬라이드 51

패키지

패키지 정의 목적

이름 충돌 방지

name space 부여

import

package

클래스의 이름

Package 이름 + 클래스 이름

Page 73: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

73

슬라이드 52

표준 패키지

java.lang

java.math

java.util

java.text

java.io

java.awt

java.applet

java.swing

java.net

java.sql

java.beans

java.rmi

org.omg

java.security

Page 74: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

74

슬라이드 53

1. import java.util.Date;

2. import java.util.Random;

3. // import java.util.*; // 위 2 import문 대신 사용할 수 있다.

4. // import java.lang.*; // 컴파일러에 의해 자동 삽입.

5. class ImplicitPack {

6. public static void main(String[] args) {

7. java.lang.System.out.println(new java.util.Date() );

8. System.out.println( new Date() );

9. System.out.println( new Random().nextInt() );

10. }

11.}

패키지클래스 사용방법

Page 75: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

75

슬라이드 54

54

패키지 선언

패키지선언 방법

패키지클래스 컴파일 방법

default package

1. package world.asia;

2. public class Korea{

3. private int population; //인구

4. String capital; //수도

5. private String[] special ={"진주실크", "대구사과", "천안호도과자"};

6. }

패키지선언 방법

클래스 선언보다 먼저 선언한다.

패키지는 한번만 선언할 수 있다.

패키지이름은 주로 회사 도메인명을 거꾸로 해서 다른 클래스와 중복을 피한다.

ex) com.ibm.util;

package은 import보다 먼저 선언한다.

패키지클래스 컴파일 방법

반드시 -d옵션을 이용한 컴파일이 필요하다.

Page 76: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

76

패키지를 기술하지 않으면 default package라고 한다.

아래 클래스는 default package상태의 클래스이다.

• import shape.*;

• class MyApplication{

• public static void main( String[] args ) {

• new Rectangle().draw();

• new Circle().draw();

• }

• }

Page 77: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

77

슬라이드 55

접근 제어자

자바는 객체지향의 특성인 캡슐화(encapsulation)와 정보 은닉(information hiding)를 제공하기 위해 접근제어자를 사용

접근 제어범위

(약) public < protected < friendly(package) < private (강)

동일클래스 동일패키지 자손클래스 다른패키지

public 사용가능 사용가능 사용가능 사용가능

protected 사용가능 사용가능 사용가능

package 사용가능 사용가능

private 사용가능

아래 KoreaUser소스에서 컴파일오류가 나타날 위치를 찾고 그 이유를 설명해보자.

• package world.test;

• import world.asia.Korea;

• public class KoreaUser{

• public static void main(String[] args){

• Korea k;

• k = new Korea();

• k.population= 10; //k가 참조하는 객체의 인구값을 10으로 설정

• k.setPopulation(0);

• k.setPopulation(10);

• int p = k.getPopulation();

• System.out.println("인구:" + p);

Page 78: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

78

• k.capital = "서울"; //k가 참조하는 객체의 수도를 "서울"로 설정

• System.out.println(k.specialList);

• String[] list = k.getList();

• System.out.println(list[0]);

• }

• }

Page 79: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

79

슬라이드 56

접근 제어자

1. package world.asia;

2. public class Korea{

3. private int population; //인구

4. String capital; //수도

5. private String[] specialList={"진주실크", "대구사과", "천안호도과자"};

6. public String[] getList(){ return specialList; }

7. public void setPopulation(int p){

8. if(p < 1 ){

9. System.out.println("인구는 1이상으로 설정하세요.");

10. return;

11. }

12. population = p;

13. }

14. public int getPopulation(){ return population; }

15.}

아래 KoreaUser소스에서 컴파일오류가 나타날 위치를 찾고 그 이유를 설명해보자.

• package world.test;

• import world.asia.Korea;

• public class KoreaUser{

• public static void main(String[] args){

• Korea k;

• k = new Korea();

• k.population= 10; //k가 참조하는 객체의 인구값을 10으로 설정

• k.setPopulation(0);

• k.setPopulation(10);

• int p = k.getPopulation();

• System.out.println("인구:" + p);

Page 80: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

80

• k.capital = "서울"; //k가 참조하는 객체의 수도를 "서울"로 설정

• System.out.println(k.specialList);

• String[] list = k.getList();

• System.out.println(list[0]);

• }

• }

Page 81: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

81

슬라이드 57

접근 제어자

java.lang.System클래스, java.lang.Math클래스 API를 살펴보면 Constructor Summary가 존재하지 않는다.

어떻게 구성되어있을지 예상해본다.

Page 82: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

82

슬라이드 58

상속과 다형성

Page 83: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

83

슬라이드 59

상속(inherita nce)

상속이란

상위 클래스의 멤버필드와 메소드를 하위 클래스가 계승

확장성 증가

클래스 사이에 하위자료형/상위자료형 관계 정의

JAVA : 단일상속

C++ : 다중상속

장점

상위클래스를 사용하는 기존 코드의 재사용

논리적 상속 관계에 의한 가독성높임

상위클래스 자체 및 변수, 메소드의 재사용

자바 최상위 클래스

java.lang.Object

상속을 나타내기 위한 자바 예약어는 extends이다.

ex) public class Circle extends Shape{ }

자바의 최상위 클래스는 java.lang.Object클래스이다.

클래스 선언할때 extends 를 생략하면 컴파일러가 extends java.lang.Object를 포함한다.

하위클래스는 상위클래스의 멤버필드와 메소드를 상속받지만, 상위클래스의

private멤버에는 접근할 수 없다.

단일상속만 가능하다.

Page 84: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

84

슬라이드 60

1. class A{2. int f;3. void m() {} 4. }5. class B extends A{6. int f; //상위클래스의 멤버변수명과 동일한 경우7. int f2; 8. void m2(); { }9. public static void main(String[] args){10. A a = new A();11. a.f++; //A클래스의 f를 접근한것일까? B클래스의 f를 접근한 것일까?12. a.m();13. a.f2++; //오류. 하위클래스의 변수를 상위클래스객체에서 사용할 수 없다.14. a.m2(); //오류. 하위클래스의 변수를 상위클래스객체에서 사용할 수 없다.

15. B b = new B();16. b.f2++;17. b.m2();18. b.f++; //상위클래스의 변수는 하위클래스객체에 상속되었으므로 실행가능.19. b.m();20. }21. }

상속(inherita nce) 예제

상속과 변수

위의 예제에서 부모 A의 f변수와 자식 B의 f변수명이 동일할 경우

12line의 구문은 A클래스의 f를 접근한 것일까? B클래스의 f를 접근한 것일까?

• A a = new A();

• a.f++;

18line의 구문은 A클래스의 f를 접근한 것일까? B클래스의 f를 접근한 것일까?

• B b = new B();

• b.f++;

super

Page 85: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

85

메소드가 속하는 객체의 부모영역을 나타내는 예약어이다.

ex) class B extends A{

int f;

void m3() { super.f++; }

}

Page 86: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

86

슬라이드 61

상속 이전의 클래스 설계

Circle

-radius : double

-area : double

-circum : double

+Circle()

+Circle(double)

+makeArea(): void

+makeCircum(): void

+display(): void

+getArea() : double

+getCircum() : double

+getRadius() : double

Rectangle

-width : double

-height : double

-area : double

-circum : double

+Rectangle()

+ Rectangle(double, double)

+makeArea(): void

+makeCircum(): void

+display(): void

+getArea() : double

+getCircum() : double

+getWidth() : double

+getHeight() : double

Page 87: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

87

슬라이드 62

상속 관계의 클래스 설계

Circle

-radius : double

+Circle()

+Circle(double)

+getRadius() : double

Rectangle

-width : double

-height : double

+Rectangle()

+ Rectangle(double, double)

+getWidth() : double

+getHeight() : double

Shape

+Shape()

+makeArea(): void

+makeCircum(): void

+display(): void

+getArea() : double

+getCircum() : double

#area : double#circum : double

Page 88: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

88

슬라이드 63

다형성(Po lymorphism)

open( )

envelop

Windows

Newsletter

Behavior

봉투를 열다

창문을 열다

신문을 열다

다형성의 의미는 메시지를 전달하는 객체가 메시지를 전달 받는 객체를 알아야

할 필요가 없다는 것이다. 메시지를 전달받는 객체는 임의의 클래스에 속한다.

행위의 대상 객체가 모두 다르기 때문에 동일 오퍼레이션을 호출하여도 각각의

대상객체의 행위는 모두 다르게 반응한다.

메소드의 호출과 실행에서 동적결합을 지원해야 실제적인 다형성이 구현 될 수

있다.

Page 89: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

89

슬라이드 64

객체의 형변환

IS-A 관계

객체들의 형 변환

IS-A관계(상속관계)의 객체들에 한함

Upcasting

묵시적으로 가능(묵시적 형변화)

전체 메모리(하위클래스) 부분 메모리(상속되어있는 상위클래스부분)

Downcasting

부분 메모리(상위클래스) 전체 메모리(하위클래스)

묵시적으로 불가능(명시적 형변환)

Casting 연산자인 ()를 사용해서 형을 명시해야 함

Page 90: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

90

슬라이드 65

stack 영역 heap 영역

Circle영역

Shape영역

Upca sting

Shape s

Circle cCircle형 객체

아래 예제에서 Circle c = new Circle();와 Shape s = new Circle(); 는 어떤 차이가 있을까?

참조변수의 자료형에 따라 접근할 수 있는 영역이 다르다.

• class Shape {}

• class Circle extends Shape {}

• public class InheritanceTest {

• public static void main(String[] args) {

• Shape s = new Circle(); //Upcasting

Page 91: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

91

• Circle c = new Circle() ;

• }

Page 92: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

92

슬라이드 66

명시적 형변환(Downca sting)

stack 영역 heap 영역

Circle영역j

Shape영역i

Shape s

Circle c

Circle c1

Shape영역i

Circle형 객체

Shape형 객체

??

하위클래스로의 형 변환

상위클래스(Super Class) 하위클래스(Sub Class)

원칙적으로 불가능

Downcasting의 기법을 제공

아래는 잘못된 명시적형변환 예제이다.

8번line이 컴파일될지, 실행될지 예상해보자.

• class Shape { int i; }

• class Circle extends Shape { int j; }

Page 93: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

93

• public class InheritanceTest {

• public static void main(String[] args){

• Shape s = new Shape();

• Circle c = new Circle();

• //Downcasting

• Circle c1 = (Circle)s;

• }

Page 94: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

94

슬라이드 67

명시적 형변환(Downca sting)

stack 영역 heap 영역

Circle영역j

Shape영역i

Shape s

Circle c

Circle형 객체

Downcasting(객체의 복구)

• class Shape { int i; }

• class Circle extends Shape { int j; }

• public class InheritanceTest {

• public static void main(String[] args) {

• Shape s = new Circle();

• Circle c = (Circle)s; // 객체의 복구

• }

Page 95: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

95

슬라이드 68

Overrid ing(재정의)

Overriding이란

객체 지향 언어에서는 모든 문제의 해결 관점

자료의 재정의와 메소드의 재정의

메소드 Overriding 규칙

Overriding이란

상속에 의하여 물려받은 자료나 메소드를 그대로 사용하지 않고 새롭게 정의 하는 것을

말한다.

객체 지향 언어에서는 모든 문제의 해결을 자기 중심적인 입장에서 해결하고자 한다.선조가

물려준 메소드와 똑같은 메소드를 자신이 재정의 한 경우에는 우선적으로 자신의 메소드를

사용함이 원칙이다.

자료의 재정의와 메소드의 재정의

자료의 재정의는 프로그램의 가독성을 떨어뜨리는 결과를 발생시키기 쉽기 때문에 피하는

것이 좋다.

Page 96: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

96

메소드 Overriding 규칙

• 상속관계 클래스사이의 메소드의 이름이 같아야 한다.

• 매개변수 리스트도 완전히 같아야 한다.

• 반환형도 같아야한다.

• 상위메소드 접근범위 <= 자식메소드 접근범위

접근범위

(강)private < (friendly) < protected < public(약)

Page 97: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

97

슬라이드 69

Overrid ing(재정의)안 한 경우

1. public class ShapeTest {

2. public void m(Shape s){

3. //s가 Circle타입의 객체라면

4. if(s instanceof Circle){

5. Circle c = (Circle)s;

6. c.makeAC();

7. } //s 가 Rectangle타입의 객체라면

8. else if(s instanceof Rectangle){

9. Rectangle r = (Rectangle)s;

10. r.makeAR();

11. }

12. s.display();

13. }

14. public static void main(String[] args){

15. ShapeTest t = new ShapeTest();

16. t.m( new Shape() );

17. t.m( new Circle(6));

18. t.m( new Rectangle(4, 5));

19. }

20. }

• public class Shape {

• protected double area;

• public void display(){ System.out.println("면적은 " + this.area+ "입니다."); }

• public double getArea(){ return area; }

• }

• public class Circle extends Shape{

• private double radius;

• public Circle(int radius) { this.radius = radius;}

• public void makeAC() { area = Math.PI * Math.pow(radius, 2); }

• public double getRadius() {return radius;}

Page 98: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

98

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

• }

• public class Rectangle extends Shape{

• private double width;

• private double height;

• public Rectangle(double width, double height){

• this.width = width; this.height = height;

• }

• public void makeAR(){ area = width * height;}

• public double getWidth() {return width;}

• public void setWidth(double width) {this.width = width;}

• public double getHeight() {return height;}

• public void setHeight(double height) { this.height = height;}

• }

Page 99: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

99

슬라이드 70

Overrid ing(재정의)한 경우

1. public class ShapeTest {

2. public void m(Shape s){

3. s.makeArea();

4. s.display();

5. }

6. public static void main(String[] args) {

7. ShapeTest t = new ShapeTest();

8. t.m( new Shape() );

9. t.m( new Circle(6));

10. t.m( new Rectangle(4, 5));

11. }

12. }

• public class Shape {

• protected double area;

• public void display(){ System.out.println("면적은 " + this.area+ "입니다."); }

• public void makeArea(){}

• public double getArea(){ return area; }

• }

• public class Circle extends Shape{

• private double radius;

• public Circle(int radius) { this.radius = radius;}

• public void makeArea() { area = Math.PI * Math.pow(radius, 2); }

Page 100: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

100

• public double getRadius() {return radius;}

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

• }

• public class Rectangle extends Shape{

• private double width;

• private double height;

• public Rectangle(double width, double height){

• this.width = width; this.height = height;

• }

• public void makeArea(){ area = width * height;}

• public double getWidth() {return width;}

• public void setWidth(double width) {this.width = width;}

• public double getHeight() {return height;}

• public void setHeight(double height) { this.height = height;}

• }

Page 101: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

101

슬라이드 71

Overrid ing vs. Overloa d ing

Overriding Overloading

관계 상속관계 동일 클래스

메소드 이름 일치 일치

매개변수 개수 일치 다르다

매개변수자료형 일치 다르다

메소드 리턴형 일치 다르다

static인스턴스메소드 즉,static

사용못함사용가능

접근지정자 약화되는 순서로 일치

Page 102: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

102

슬라이드 72

상속과 생성자

생성자는 상속되지 않는다

메모리 할당 방법

상위 클래스의 메모리 영역을 합한 메모리 영역을 힙에 할당

생성자는 단지 할당된 메모리를 초기화하는 역할

생성자 호출 순서

1. 힙메모리에 객체 생성

2. 인스턴스 변수 디폴트 값으로 초기화

3. 상위 클래스의 생성자부터 차례로 호출

4. 현재클래스의 생성자 호출

super( )

하위클래스의 특정 생성자를 호출할 수 있다.

생성자에서 사용가능하지만 메소드에서 사용할 수 없다.

생성자의 first statement에 위치해야한다.

아래 ConsTest2의 실행 결과를 예상해보자.

• class A{

• static int print( String msg ){

• System.out.println( msg );

• return 0;

• }

• public A(){

• print( "생성자 A() 실행" );

• }

• public A(int i){

• print( "생성자 A(int) 실행" );

Page 103: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

103

• }

• }

• class B extends A {

• public B() {

• print( "생성자 B() 실행" );

• }

• public B(String s){

• super( Integer.parseInt(s) );

• print( "생성자 B(String) 실행" );

• }

• class ConsTest2{

• public static void main( String[] args ) {

• new B();

• }

• }

Page 104: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

104

슬라이드 73

this / super

this this() super super()

자기자신을 참조하는레퍼런스

생성자안에서만존재

선조객체 참조하는 레퍼런스

선조의 생성자를호출

자신의 클래스의 멤버변수와 멤버메소드를참조한다.

오버로딩 되어 있는 다른 형태의 생성자를 호출

선조클래스의 멤버변수와 멤버메소드를 참조한다.

선조클래스의 오버로딩이된 생성자를 호출한다.

this.width;

this.height;

this(2,3);

this(i);

super.width;

super.height;

super(3,4);

super(3);

this.calcVolume();

this.toString();

first statement에위치해야한다.

super.restADay();

super.checker();

first statement에위치해야한다.

Page 105: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

105

슬라이드 74

추상클래스와 인터페이스

Page 106: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

106

슬라이드 75

Abstra c t 클래스

클래스의 용도

인스턴스화 용도

하위클래스의 공통 속성과 기능을 갖는 용도

추상클래스 형식 정의

abstract [modifier] class 클래스명{ }

인스턴스화할 수 없다.

예) Shape s = new Shape(); //컴파일 오류 발생

하위클래스의 공통 속성과 기능을 갖는 용도로만 쓰일 클래스이면서 인스턴스화 용도가 아닌

클래스가 필요하다면 abstract class로 선언한다.

추상클래스 형식 정의

abstract class는 new예약어로 인스턴스를 만들 수 없다.

도형은 실세계에 존재할 수 없는 객체이기 때문에 아래 Shape클래스는 인스턴스화

용도가 아니다.

• public class Shape {

• protected double area;

• public void display(){ System.out.println("면적은 " + this.area+ "입니다."); }

Page 107: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

107

• public void makeArea(){}

• public double getArea(){ return area; }

• }

이럴 경우 Shape클래스는 추상클래스가 되어야 한다.

• abstract public class Shape {

• protected double area;

• public void display(){ System.out.println("면적은 " + this.area+ "입니다."); }

• public void makeArea(){}

• public double getArea(){ return area; }

• }

Page 108: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

108

슬라이드 76

Abstra c t 메소드

추상 메소드

하위클래스들의 공통기능이지만 반드시 재정의해야할 메소드

형식 정의

abstract [modifier] 반환형 메소드명([자료형 매개변수,…]);

추상메소드를 포함하는 클래스는 반드시 추상클래스가 되어야 한다.

하위클래스에서 overriding하지 않으면 하위클래스도 추상클래스가 되어야 한다.

아래 Shape클래스의 makeArea()는 하위클래스들의 공통 기능이지만 반드시 재정의할 메소드이다.

• public class Shape {

• protected double area;

• public void display(){ System.out.println("면적은 " + this.area+ "입니다."); }

• public void makeArea(){}

• public double getArea(){ return area; }

• }

이럴 경우 클래스의 makeArea()는 추상메소드가 되어야 한다.

추상메소드를 포함하는 클래스는 반드시 추상클래스가 되어야 한다.

• abstract public class Shape {

• protected double area;

Page 109: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

109

• public void display(){ System.out.println("면적은 " + this.area+ "입니다."); }

• abstract public void makeArea();

• public double getArea(){ return area; }

• }

Page 110: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

110

슬라이드 77

자바는 다중상속을 지원하지 않는다.

인터페이스

인터페이스 구조

[modifier] interface 인터페이스이름{

[static final] 자료형 상수이름 = 상수값;

[public abstract] 반환형 추상메소드명([자료형 매개변수1,…] );

}

추상클래스는 일반메소드도 존재 할 수 있다.

추상클래스의 제약을 더욱더 확대시켜 오직 추상메소드만 존재하는interface라는 새로운 형태의 클래스를 java에서 제공

interface용도

기능의 통일을 위한 용도

다중상속의 보완으로 사용되는 용도

interfa ce

자바는 다중상속을 지원하지 않는다. 즉,다음과 같이 쓸 수 없다.

public class A extends B, C{}

그러나, 현실세계를 프로그래밍하기 위해서는 다중상속이 필요한데 이때, interface를 사용하여

다중상속 기능을 쓸 수 있다.

interface C{}

Interface D{}

Interface E{}

인터페이스사이에서 다중상속이 가능하고,이때 extends 키워들 사용한다.

interface A extends B,C,D{

Page 111: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

111

// 여기서 B,C,D 모두가 interface 이다.

……

}

interface로 다중상속받기 위해 implements라는 예약어를 사용한다.

public class A extends B implements C,D,E,….{}

Page 112: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

112

슬라이드 78

interfa ce의 특징과 규칙

abstract 클래스 interface

멤버변수 일반클래스와 같음모든변수는 static final(상수)묵시적

메소드 1개이상의 abstract 메소드 존재모든 메소드가 abstract 메소드(abstract 키워드를 붙이지는 않는다.)

상속선조클래스의

역할기능

상속과는 달리 구현이라고 표현(implements)

객체 생성 불가능 불가능

※모든 메소드는 public이란 키워드를 붙이지 않아도 묵시적으로public이다.

Page 113: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

113

슬라이드 79

fina l

final class

상속을 금지하는 클래스

public final class String{}

class MyString extends String // 오류

final method

재정의를 금지하는 메소드

class A{ final void m(){} }

class B extends A{ void m(){} // 오류

}

final variable

변경할 수 없는 변수 (상수로 쓰임)

abstract메소드와 final메소드는 반대 개념의 메소드이다.

Page 114: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

114

슬라이드 80

예외처리

Page 115: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

115

슬라이드 81

예외 (Excep tion )

오류의 종류

문법 오류

실행 오류

치명적인 오류

예외(경미한 오류)

예외가 발생할 경우 JVM의 처리과정

프로그램 실행 시 예외발생

JVM이 예외객체생성해서 프로그램에게 넘겨줌

오류메시지를 표준콘솔에 출력

프로세스 종료

예외처리

예외처리구문 수행

정상 실행

NOYES

문법 오류

오타와 같은 자바구문에 어긋난 코드때문에 발생하고, 컴파일할 때 발생하는 오류

실행 오류

프로그램 실행할 때 발생하는 오류

치명적 오류

메모리가 부족해서 발생하거나 JVM자체에 발생하는 오류들

경미한 오류

개발자의 노력으로 처리할 수 있는 오류

경미한 오류를 예외라고 한다.

Page 116: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

116

슬라이드 82

예외처리를 하지 않은 경우

1. public class ExceptionTest {

2. public void m(int i){

3. int j = 99 / i;

4. System.out.println("99를 " + i +"로 나눈 몫은" + j + "입니다.");

5. }

6. public static void main(String[] args) {

7. i = Integer.parseInt(args[0]);

8. ExceptionTest t = new ExceptionTest();

9. t.m(i);

10. System.out.println("end of main!");

11. }

12. }

ExceptionTest.java컴파일은 제대로 되지만 실행할 때 아래와 같은 방법으로 실행한다면 어떤

결과가 나타날지 예상해보자.

• java ExceptionTest

• java ExceptionTest hello

• java ExceptionTest 0

• java ExceptionTest 7

결과를 보면 실행 시 예외가 발생하는 경우도 있고 정상 실행되는 경우도 있다. 표준출력콘솔에

Page 117: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

117

출력되는 예외내용에 사용자가 당황스러워할 것이고 프로세스가 중지되어 프로그램의

신뢰도는 떨어질 것이다.

Page 118: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

118

슬라이드 83

예외 클래스의 종류

Throwable

Error Exception

OutofmemoryError RuntimeException IOException

ArithmeticException

......

NullPointerException

IndexOutOfBoundsException

NumberFormatException

개발자가 예외 발생을 예측하지 못할 경우 컴파일러가 예측해주는 예외(checked

exception)이 있고, 컴파일러가 예측해주지 못하는 예외(unchecked exception)이

있다.

unchecked exception : RuntimeException계열의 예외들

checked exception : RuntimeException계열 이외의 예외들

Page 119: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

119

슬라이드 84

예외 처리의 기본 문법

try{ // . . . . 예외가 직접 발생 . . .

f () ; // . . . 예외가 간접적으로 발생 . . .}catch(Type1 e) //Type1 예외 처리기{ // . . .}catch(Type2 e) //Type2 예외 처리기{ // . . .}

void f (){ // . . . 예외 발생 . . .}

Page 120: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

120

슬라이드 85

예외 처리의 기본 문법

예외가 발생하면

1. 해당 예외 처리기가 있는 가장 가까운 try 블럭의 예외 처리기로 프로그램

의 제어가 넘어간다.

2. try 블럭에 catch가 여러 개 존재할 경우, 발생된 예외 객체의 상위 자료형

을 처리하는 첫 번째 catch가 선택된다.

3. 예외가 발생한 곳과 해당 catch 사이의 프로그램 코드는 무시된다. (실행

되지 않는다.)

4. 해당 catch가 없으면, 디폴트 예외 처리기가 처리한다. (보통, 발생된 예

외에 관한 정보를 출력하고, 쓰레드의 실행을 끝낸다.)

• 앞서 공부한 ExceptionTest 소스에 예외처리를 해보자.

Page 121: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

121

슬라이드 86

fina lly

finally 부분은 연관된 try 블럭이 어떠한 이유로 실행이 끝나더라도 반드시실행된다.(예외가 발생하는 경우 포함)

목적try 블럭 내에서 접근했던 자료 구조 및 시스템 자원의 안전한 자원해제

문법try{ // . . . 예외 발생 . . . 혹은

// . . . 점프문 (break, continue, return)}//이 부분에서 catch가 올 수 있다. catch가 있으면 finally 부분보다 먼저 실행된다.finally{ // . . .. . .}

• class FinallyTest{

• public static void main( String args[] )

• {

• java.io.FileInputStream infile = null;

• try

• {

• infile = new java.io.FileInputStream( args[0] );

• int count = 0;

• int ch = -1;

• while((ch = infile.read() != -1)

• count++;

• System.out.println(args[0] + " 화일의 바이트 수: " + count );

Page 122: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

122

• }

• catch (java.io.FileNotFoundException e)

• {

• System.err.println( args[0] + " 화일이 없습니다." );

• }

• finally

• {

• if (infile != null)

• infile.close();

• System.out.println( "finally 부분 실행" );

• }

• }

• }

Page 123: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

123

슬라이드 87

예외 발생시키기

예외 발생의 원인

– 자바 인터프리터, 브라우저 등)에 의해 오류가 검출된 경우 발생

– throw 문장 실행에 의해 발생

문법 : throw 예외객체

예) throw new MyException();

Page 124: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

124

슬라이드 88

예외 발생시키기

throws절 선언

메소드 내에서 발생할 수 있는 예외 중 ‘처리해야 하는 예외’를 처리

하지 않을 경우에는 throws절에서 선언해야 한다.

호출한 곳으로 예외 처리를 떠 넘기는 효과를 갖는다.

문법

[modifier] 반환형 메소드이름 ([자료형 매개변수1,…])

throws 예외클래스1, 예외클래스2, … {

}

unchecked exception은 throws절 생략이 가능하다.

메소드가 재정의될 때, throws절은 상속되지 않는다.

그러나, 재정의하는 메소드는 재정의 당하는 메소드의 throws절에 선언된 예외 클래스 혹은 그

하위 클래스의 예외만을 throws절에 선언할 수 있다.

Page 125: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

125

슬라이드 89

Throwa b le 클래스

모든 예외 클래스의 최상위 클래스

생성자를 이용해서 예외 객체에 message설정가능

new Throwable(String message)

메소드

String getMessage() : 예외 message얻기.

printStackTrace()

:디폴트 예외 처리기가 출력하는 것과 동일한 형태로 출력한다. 디

버깅에 유용.

Page 126: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

126

슬라이드 90

사용자 정의 Excep tion

사용자 정의 Exception

Exception클래스로 상속받는다.

1. public class FindException extends Exception {

2. public FindException() {

3. super();

4. }

5. public FindException(String message) {

6. super(message);

7. }

8. }

9.

Page 127: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

127

슬라이드 91

시스템 API

Page 128: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

128

슬라이드 92

ja va .la ng .Ob jec t

모든 클래스 및 배열 자료형의 최상위 클래스

주요 메소드

메소드 이름 설명

public boolean equals(Object obj)현재객체와 인자객체의 레퍼런스 값을 비교하여 레퍼런스값이 같으면 true, 레퍼런스값이 다르면 false반환

public String toString()"현재객체의 클래스형이름@해시코드"값을 반환

protected Object clone() 객체복제해서 반환

protected void finalize( ) Garbage collection직전에 호출

public Class getClass( ) 현재객체의 Class객체를 반환

public int hashCode( ) 객체의 해시코드값을 반환

Page 129: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

129

슬라이드 93

toString(), equa ls()

1. public class InheritanceTest {

2. public static void print(Object o){

3. System.out.println(o);

4. }

5. public static void equalsTest(Object o1, Object o2){

6. System.out.println(o==o1);

7. System.out.println(o.equals(o1));

8. }

9. public static void main(String[] args) {

10. B b1 = new B(10); B b2 = new B(10);

11. Object o1 = new Object(); Object o2 = new Object();

12. print(b1); print(b2); print(o1);

13. equalsTest(b1, b2); equalsTest(o1, o2); equalsTest(b1, o1);

14. o1 = b1;

15. print(b1); print(b2); print(o1);

16. equalsTest(b1, b2); equalsTest(o1, o2); equalsTest(b1, o1);

17. }

18. }

아래 와 같이 클래스에 toString()가 없으면 상위클래스(Object)에서 상속받은 toString()가

자동호출된다.

InheritanceTest의 12line, 15line결과가 어떻게 출력될지 예상해보자.

• class B{

• int i;

• B(){}

• B(int i){this.i = i; }

• }

아래와 같이 클래스에 toString()가 Overriding된 경우 InheritanceTest의 12line, 15line결과가

어떻게 출력될지 예상해보자.

Page 130: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

130

• class B{

• int i;

• B(){}

• B(int i){this.i = i; }

• @Override

• public String toString() {

• return String.valueOf(i);

• }

• }

13line의 equalsTest(b1, b2); 결과가 true가 되고, equalsTest(b1, o1); 결과가 false가 되도록

B.java를 변경해보자.

Page 131: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

131

슬라이드 94

객체복제

Shallow Copy

Deep Copy

Object의 clone()

• class A{

• private int i = 1;

• private int []arr = {1, 2, 3};

• public A(int i){ set(i); }

• public void set(int i){ this.i = i; this.arr[0] = i; }

• public int getI(){ return i; }

• public int[] getArr(int index){ return arr; }

• public void print(){ System.out.println("i=" + i + ", arr[0]=" + arr[0]); }

• }

아래 4line의 구문이 정상 수행될 수 있으려면 A클래스가 변경되어야한다.

A클래스에서 Shallow Copy가 지원되도록 변경해보자. 단, 기존 메소드는 수정하지 않는다.

Page 132: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

132

• public class CloneTest{

• public static void main(String []args){

• A a = new A(10);

• A aCopy = a.clone();

• a.print(); //i=10, arr[0]=10

• aCopy.print(); //i=10, arr[0]=10

• a.set(20);

• a.print(); //i=10, arr[0]=10

• aCopy.print();

• }

위의 9번line결과는 ShallowCopy일 경우 i=10, arr[0]=20 DeepCopy일 경우 i=10,

arr[0]=10이어야한다.

DeepCopy가 지원되도록 A클래스를 변경해보자.

Page 133: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

133

슬라이드 95

ja va .la ng .System

JVM은 OS위에 탑재된 소프트웨어이기 때문에 직접 OS자원(현재시간, 표준입출력장치등…)을 사용할 수 없다.

OS자원을 사용하기 위한 API가 System클래스이다.

System클래스는 static 필드와 static메소드로 구성된다.

그 이유가 무엇일까 생각해보자.

Page 134: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

134

슬라이드 96

ja va .la ng .Cla ss

클래스정보를 알 수 있는 class이다.

public static Class forName(String className)

public String getName()

public java.lang.reflect.Field[] getFields()

public java.lang.reflect.Method[] getMethods()

public Object newInstance()

Page 135: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

135

슬라이드 97

ja va .la ng .String

문자열은 한번 생성된 이후에는 변경되지 않는다. 즉 한번 메모리에String 객체를 만들고 나면 그 값을 바꿀 수 없다.

문자를 변경하거나 문자열의 길이를 바꾸는 연산을 하면 원본에서 필요한 부분을 복사한 새로운 String 객체를 리턴한다.

Page 136: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

136

슬라이드 98

ja va .la ng .String

문자열을 생성하는 두 가지 방법

따옴표로 둘러싼 상수를 String 값에 대입해 문자열을 만드는 방법

new 연산자를 사용하여 String 객체를 생성하는 방법

문자열 생성자

문자열을 생성하는 데에는 두 가지 방법이 있다.

따옴표로 둘러싼 상수를 String 값에 대입하여 문자열을 만든다.

String quote = “To be or not to be”;

new 연산자를 사용하여 String 객체를 생성하는 방법이 있다.

String s = new String(“To be or not to be”);

위의 문자열 생성에는 차이점이 있다.

첫번째 문자열 객체의 생성은 자바 런타임 시스템에서 공유 문자열 풀(shared-string pool)에 같은

클래스로 통합하여 관리를 한다. 따라서 똑 같은 문자열의 경우에는 같은 객체를 객체

참조자가 공유하도록 한다.

두 번째 문자열 객체의 경우는 new라는 키워드를 사용하여 생성하였으므로 공유 문자열 풀이

아닌 힙(heap) 영역에 새로운 문자열 객체로 생성을 한다. 따라서 같은 내용을 갖는 문자열의

Page 137: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

137

경우에도 서로 다른 객체를 참조하도록 힙 메모리 영역에 객체를 생성하고 참조자를 갖도록

한다.

C나 C++ 프로그래머라면 문자열의 마지막이 null 문자로 끝나는지 궁금할 것이다. 하지만 자바

문자열에서는 이러한 질문 자체가 무의미하다. String 객체는 내부적으로 자바 문자 배열을

사용한다. 하지만 그 배열은 private으로 선언되어 있기 때문에 직접 보거나 바꿀 수 없다.

(자바에서는 실제 배열을 사용하며 그 배열은 자신의 길이를 알고 있기 때문에 String 객체에

특별한 종료문자가 필요 없다.)

Page 138: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

138

슬라이드 99

ja va .la ng .String

length() : String 클래스 내의 메소드로서 String 객체의 길이를 알 수 있게함

+ 연산자 : 자바 연산자 중 유일하게 오버로드 된 연산자로 문자열 통합 기능을 함

Page 139: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

139

슬라이드 100

문자열의 비교

C와 동일하게 레퍼런스로 문자열을 액세스하므로 == 연산자로 문자열 비교 불가능

자바에서는 레퍼런스를 정수로 변환하지 않기 때문에 <, >, <=, >= 연산자를 이용한 문자열 비교 불가능

문자열 비교를 위한 메소드boolean equals( Object obj )boolean equalsIgnoreCase( String another ) int compareTo( String another ) boolean regionMatches(boolean ignoreCase, int start, String other,

int ostart, int len)

문자열의 비교

C와 마찬가지로 레퍼런스로 문자열을 액세스하기 때문에 == 연산자로 문자열을 비교할 수

없다. 자바 컴파일러에서 우연히 여러 개의 같은 문자열 인스턴스를 같은 문자열 풀 아이템에

집어넣지 않는 이상 “foo” == “foo” 라는 구문도 거짓으로 판정된다. <, >, <=, >= 연산자를

이용한 문자열 비교도 전혀 할 수 없다. 자바에서는 레퍼런스를 정수로 변환하지 않기

때문이다.

문자열내용의 비교는 equals()를 이용한다.

예)

String one = “Foo”;

char [] c = { ‘F’, ‘o’, ‘o’ };

String two = new String ( c );

Page 140: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

140

System.out.println (one.equals( two ) ); //true

그 외에 문자열 비교를 위한 메소드는 다음과 같다.

boolean equalsIgnoreCase( String another ) : 대소문자를 구분하지 않고 문자열을 비교할 때 사용

예)

String one = “FOO”;

String two = “foo”;

System.out.println (one.equalsIgnoreCase( two ) ); //true

Page 141: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

141

슬라이드 101

문자열의 비교

class EqualsTest{public static void main(String[] args){

String s1 = new String("Hello");String s2 = new String("Hello");String s3 = "Hello";String s4 = "Hello";

System.out.println(s1 == s2);System.out.println(s1 == s3);System.out.println(s3 == s4);

System.out.println(s1.equals(s2));System.out.println(s1.equals(s3));System.out.println(s3.equals(s4));

}}

Page 142: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

142

슬라이드 102

문자열 메소드편집

문자열 편집을 위한 메소드

char charAt( int index ) String substring( int start, int end = this.length() )String trim( )String toUpperCase(), String toLowerCase() String replace( char old, char new )

문자열 탐색을 위한 메소드boolean startsWith()boolean endsWith()int indexOf()int lastIndexOf()

String s = new String("Hello");

System.out.println( s.toUpperCase() );

System.out.println( s );

Page 143: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

143

슬라이드 103

기본 자료형과 문자열사이의 변환

Integer (Wrapper Class)

String -> Integer

new Integer(String str)

Integer.valueOf(String srt)

Integer.valueOf(String str, int radix)

Integer -> String

toString()

String.valueOf(Object obj)

Primitive type

String -> int

int Integer.parseInt(String str)

int Integer.parseInt(String str, int radix)

int -> String

String Integer.toString(int value)

String Integer.toString(int value, int radix)

Page 144: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

144

슬라이드 104

ja va .la ng .StringBuffer 클래스

java.lang.StringBuffer 클래스는 변경이 가능하고 버퍼의 크기가 자동적으로조절되는 문자 버퍼임

String 클래스는 한 번 만들어진 객체의 내용은 변경이 불가능하므로 변경이 아주 잦은 문자열의 경우 StringBuffer 객체와 그 객체의 append() 메소드를이용해 더욱 효율적인 코드 생성 가능 (속도 향상)

StringBuffer 클래스는 다양한 타입의 데이터를 버퍼에 덧붙일 수 있는 여러 개의 오버로드된 append() 메소드를 제공

toString() : 이 메소드를 이용해 StringBuffer 객체를 String 객체로 만들 수 있음

substring() : 이 메소드를 이용하여서도 StringBuffer 객체의 일부를 String 객체로 만들 수 있음

• class StringBufferTest{

• public static void main (String[] args)

• {

• StringBuffer sb = new StringBuffer("abc");

• sb.append(12).append('d');

• System.out.println(sb); // abc12d

• sb.setCharAt(0, 'x');

• System.out.println(sb); // xbc12d

• sb.insert(1, 3.14);

• System.out.println(sb); // x3.14bc12d

• char[] ca = new char[sb.length()];

Page 145: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

145

• sb.getChars(0, sb.length(), ca, 0);

• for(int i = 0; i < ca.length; i++)

• System.out.print( ca[i] );

• System.out.println(); // x3.14bc12d

• }

• }

Page 146: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

146

슬라이드 105

ja va .util.StringTokenizer 클래스

java.util.StringTokenizer 클래스는 텍스트 문자열을 구획문자(delimiter)로구분하는 단어나 ‘토큰(token)’으로 파싱하는 기능을 처리

String 객체로부터 새로운 StringTokenizer 객체를 생성한 후hasMoreTokens()와 nextToken() 메소드를 호출하여 문자열에 있는 단어에 대해 루프를 돌림. 공백문자 (캐리지 리턴, 줄바꿈 문자, 탭, 스페이스 등)를 기본적인 구획문자로 사용.

StringTokenizer는 java.util.Enumeration 인터페이스를 구현하므로 원소를액세스하는 범용 메소드인 hasMoreElements()와 nextElement()도 함께 구현

nextElement() : Object를 리턴nextToken() : String을 리턴(장점)StringTokenizer 생성자에는 구획문자를 지정할 수 있도록 지원을 하는 생

성자가 존재

다음과 같은 예처럼 사용할 수 있다.

String text = “Now is the time for all good men (and women)…”;

StringTokenizer st = new StringTokenizer( text );

While(st.hasMoreTokens()) {

String word = st.nextToken();

. . .

}

String 객체로부터 새로운 StringTokenizer 객체를 생성한다. 그리고 나서 hasMoreTokens()와

nextToken() 메소드를 호출하여 문자열에 있는 단어에 대해 루프를 돌린다. 공백문자 (캐리지

리턴, 줄바꿈 문자, 탭, 스페이스 등)를 기본적인 구획문자로 사용한다.

StringTokenizer는 java.util.Enumeration 인터페이스를 구현하므로 원소를 액세스하는 범용

Page 147: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

147

메소드인 hasMoreElements()와 nextElement()도 함께 구현한다.

nextElement()는 Object를 리턴하는 반면, nextToken()은 String을 리턴하므로 장점을 지닌다.

StringTokenizer 생성자에는 구획문자를 지정할 수 있도록 지원을 하는 생성자가 있다.

text = http://foo.bar.com/;

tok = new StringTokenizer(text, “/:”);

while(tok.hasMoreTokens()) {

String word = tok .nextToken(); // “http” “foo.bar.com”

. . .

}

Page 148: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

148

슬라이드 106

Wra pper Cla ss

모든 기본 자료형에 대응하는 클래스 존재

[클래스]

Byte

Integer

Float

Short

Long

Double

Character

Boolean

Void

목적

기본 자료형을 조작하기 위한 클래스 메쏘드 혹은 상수 제공

예) char c = Character.toUpper(‘a’);

기본 자료형을 객체로 사용해야 할 때 사용

[기본형]

byte

short

int

long

float

double

char

boolean

void

• class WrapperPrimTest{

• public static void main(String[] args) {

• byte b = 3;

• int i = 257;

• Byte b2 = new Byte(b);

• Integer i2 = new Integer(i);

• print( b2 ); // 3

• print( i2 ); // 257

• byte b3 = b2.byteValue();

• int i3 = i2.intValue();

• int i4 = i2.byteValue();

Page 149: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

149

• System.out.println( "b3 = " + b3 ); // b3 = 3

• System.out.println( "i3 = " + i3 ); // i3 = 257

• System.out.println( "i4 = " + i4 ); // i4 = 1

• }

• static void print(Number n) {

• System.out.println( n.intValue() );

• }

• }

Page 150: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

150

슬라이드 107

유틸리티 API

Page 151: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

151

슬라이드 108

자료구조

기존의 프로그래밍 언어들에서는 프로그램을 개발하는데 가장 중요한 것이알고리즘이었다.

알고리즘은 데이터를 얼마나 빠르게 탐색하고, 어떻게 요소들을 정렬된 순서로 만들며 이 순서 중간에 어떻게 요소들을 삽입하고 삭제하느냐에 대한 방법 등을 제공한다.

이 장에서는 프로그래밍을 위한 기본적인 자료 구조인 스택, 큐, 리스트 등을 설명하면서 자바에서 기본적으로 제공되고 있는 여러 가지 종류의 컬렉션들을 다루고자 한다.

Page 152: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

152

슬라이드 109

스택과 큐

스택(Stack)

스택 : 탑(top)이라고 한 끝에서 모든 삽입과 삭제가 일어나는 순서 리스트

스택의 구조 : 후입 선출(Last-In-First-Out: LIFO)

자바에서는 스택이 표준 API로 구현되어 제공됨

큐(Queue)

큐 : 한 쪽 끝에서 데이터가 삽입되고 반대쪽 끝에서 삭제가 일어나는순서 리스트

큐의 구조 : 선입 선출(First-In-First-Out: FIFO)

Page 153: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

153

슬라이드 110

연결 리스트(Linked List)

크기가 변하는(삽입, 삭제) 순차 리스트를 요구할 때 각각의 노드들의 연결로 이루어져 있는 리스트의 구조가 필요함

연결 리스트의 노드들은 메모리의 순차적 위치에 존재하지 않음

이러한 연결은 다음 노드를 가리키기 위한 연결자를 가지고 연결되고 노드들의 위치는 실행 시마다 바뀔 수 있음

연결 리스트의 구조 :

데이터부(data field)와 연결부(linked field)로 구성되며 각각은 여러 개의 서브부로 나누어짐

Page 154: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

154

슬라이드 111

컬렉션 인터페이스와 Itera tor 인터페이스

자바 2 플랫폼이 발표되기 전에 표준 라이브러리는 가장 유용한 몇몇 클래스만을 제공해 옴

⇒Vector, Stack, Hashtable, BitSet, Enumeration 인터페이스

자바 2 플랫폼이 발표되어 완전한 자료구조 클래스들을 제공하면서 목표로둔 점

작고, 쉽게 배울 수 있도록 만든 라이브러리

C++의 STL(Standard Template Library)에서 나오는 일반화된 알고리즘이 주는 효과 보유

Page 155: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

155

슬라이드 112

컬렉션 인터페이스

‘객체의 모임’을 저장하기 위한 클래스의 최상위 자료형으로 List 인터페이스와 Set 인터페이스로부터 유도

컬렉션 내에 adding, clearing, comparing, retaining와 같은 동작을 모든컬렉션들이 포함

컬렉션은 각각의 요소에 접근할 수 있도록 Iterator(반복자)라고 불리우는인터페이스와 객체를 얻을 수 있는 메소드 제공

컬렉션 인터페이스는 이외에도 컬렉션에 사이즈, 컬렉션의 해쉬코드, 컬렉션이 비었는지 검사하는 동작들을 제공

객체를 더하기 위한 메소드

public boolean add(Object obj) : 컬렉션에 요소를 추가한다. 만일 호출 후 컬렉션이

변하면 true를 반환한다.

public boolean addAll(Collection c) : 다른 컬렉션의 모든 요소를 해당 컬렉션에 추가한다.

만일 호출 후 컬렉션이 변하면 true를 반환한다.

내용을 조사하기 위한 메소드

public boolean contains(Object obj) : 만일 컬렉션이 obj와 동일한 객체를 포함하고

있다면 true를 반환한다.

public boolean containsAll(Collection c) : 해당 컬렉션이 다른 컬렉션 내의 모든 요소를

포함하고 있다면 true를 반환한다.

public boolean isEmpty() : 만일 컬렉션이 요소를 담고 있지 않다면 true를 반환한다.

Page 156: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

156

public int size() : 현재 컬렉션 내에 저장되어 있는 요소들의 수를 반환한다.

반복자

public Iterator iterator() : 컬렉션 내의 요소들을 방문할 때 사용되어 지는 반복자를

반환한다.

객체 제거를 위한 메소드

public void clear() : 해당 컬렉션의 모든 요소들을 제거한다.

public boolean remove(Object obj) : 해당 컬렉션에서 obj와 동일한 객체를 제거한다.

만일 일치하는 객체가 제거되면 true를 반환한다. (교집합)

public boolean removeAll(Collection c) : 해당 컬렉션에서 다른 컬렉션의 모든 요소를

제거한다. 만일 호출 후 컬렉션이 변하면 true를 반환한다. (교집합)

public boolean retainAll(Collection c) : 다른 컬렉션 상의 요소들 중 하나와 동일하지

않는 해당 컬렉션의 모든 요소를 제거한다. 만일 호출 후 컬렉션이 변하면 true를

반환한다. (차집합)

배열로 전환을 위한 메소드

public Object[] toArray() : 컬렉션 내의 객체들의 배열을 반환한다.

public Object[] toArray(Object[] array)

Page 157: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

157

슬라이드 113

Itera tor(반복자) 인터페이스

임의의 컬렉션 클래스에서 구성원 객체를 차례로 검색하며 경우에 따라 제거할 수 있게 함

반복자에 관련된 인터페이스의 각각의 특징

Iterator : 단방향 방문 및 제거

ListIterator : 양방향 방문 및 추가, 대치, 제거

Iterator(반복자) 인터페이스는 임의의 컬렉션 클래스에서 구성원 객체를 차례로 검색하며 경우에

따라 제거할 수 있게 한다.

반복자에 관련된 인터페이스는 위의 그림과 같고 각각의 특징을 보면 다음과 같다.

Iterator : 단방향 방문 및 제거

ListIterator : 양방향 방문 및 추가, 대치, 제거

반복자에는 다음과 같은 메소드가 마련되어 있다.

public boolean hasNext() : 방문해야 할 다른 요소가 있다면 true를 반환한다.

public Object next() throws NoSuchElementException : 방문할 다음 객체를 반환한다. 만일

컬렉션의 끝에 도달하면 NoSuchElementException을 던진다.

public void remove() throws UnsupportedOperationException, NoSuchElementException :

Page 158: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

158

마지막으로 방문한 객체를 반환하고 제거한다. 이 메소드는 반드시 요소에 대한 방문(next

호출)을 선행해야 한다. 만일 컬렉션이 마지막으로 방문한 이후에 변경되었다면

IllegalStateException을 던진다.

Page 159: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

159

슬라이드 114

Enumera tion 인터페이스

Iterator 인터페이스와 거의 동작이 유사하나 단 방향 방문만 허용 (1.0, 1.1과의 호환성을 위해 제공되고 있으나 Iterator 인터페이스를 사용하기를권장함)

여러 클래스에서 Enumeration을 반환하거나 매개변수로 하는 메소드 제공⇒Vector, Hashtable, Applet 등등

제공되는 메소드public boolean hasMoreElement()public Object nextElement()

Page 160: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

160

슬라이드 115

Collec tion, Ma p

Collection

Map

List Set

Dictionary AbstractMap

ArrayList Vector

AbstractSet SortedSet

Properties

AbstractCollection

TreeSetHashSet

AbstractList

Hashtable HashMap

Page 161: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

161

슬라이드 116

Collec tion 과 Ma p 차이점

1. public class DataStructTest {

2. public void test(Collection c){

3. c.add( new String("first"));

4. c.add( new Integer(3));

5. c.add( new String("second"));

6. c.add( new Integer(3));

7. c.add( new Boolean(false));

8. System.out.println(c);

9. }

10. public void test(Map m){

11. m.put("1", new String("first"));

12. m.put("2", new Integer(3));

13. m.put("3", new String("second"));

14. m.put("4", new Integer(3));

15. System.out.println(m);

16. }

17. public static void main(String[] args) {

18. Collection c;

19. c = new Vector();

20. c = new HashSet();

21. DataStructTest t =

22. new DataStructTest();

23. t.test( c );

24. Map m = new Hashtable();

25. t.test( m );

26. }

27. }

[116]

Page 162: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

162

슬라이드 117

Ha shSet 클래스

해쉬 테이블을 기반으로 하여 셋을 구현한 클래스

해쉬셋의 장점 : 구성원의 객체와 상관없이 실행시간이 평균적으로 일정하다는 것 (큰 크기의 집합에 적당)

구성원 객체로 null을 허용하지 않음.

Page 163: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

163

슬라이드 118

TreeSet 클래스

하나의 추가된 기능 강화를 가진 클래스로 해쉬 셋과 유사

정렬된 컬렉션(sorted collection)항목을 원하는 순서로 컬렉션 내에 추가할 수 있으며, 컬렉션을 반복

(Iterator)할 때 값들은 자동적으로 정렬된 순서로 제공됨

정렬은 트리 데이터 구조에 의해서 이루어짐

항목이 트리에 추가될 때마다 적당히 정렬된 곳에 위치하므로 iterator는 항상 정렬된 순서로 항목들을 방문

Page 164: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

164

슬라이드 119

트리 셋 : 객체 비교

트리 셋에서는 정렬을 위하여 객체를 비교하므로 이를 위해 트리 셋에 추가되는 항목들은 Comparable 인터페이스를 구현하였다고 가정함

compareTo(Object obj) 메소드– 객체가 정확한 타입이 아니면 ClassCastException이 발생

Comparable 인터페이스를 구현하지 않은 클래스의 객체를 정렬할 필요가있을 경우

– TreeSet 생성자에 Comparator 객체를 전달함으로서 다른 비교 메소드를 사용하도록 트리 셋에게 지시– Comparator 인터페이스는 극명한 전달인자를 갖는 단일 메소드 보유

Page 165: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

165

슬라이드 120

Arra yList 클래스

List의 크기 변경이 가능한 배열의 구현

내부적인 동작은 Vector 클래스와 유사

Page 166: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

166

슬라이드 121

LinkedList 클래스

AbstractList 추상 클래스로부터 AbstractSequentialList 추상클래스를 거쳐상속된 하위 클래스

연결 리스트를 구현하도록 제공되는 클래스로 이 클래스를 이용하여 스택, 큐, 디큐를 구현하여 사용할 수 있는 여러 가지 메소드 제공 가능

제공되는 메소드는 다음과 같다.

public void add (int index, Object obj)

public void add (Object obj)

public boolean addAll(int index, Collection c)

public boolean addAll(Collection c)

public void addFirst(Object obj) : 리스트의 시작 부분에 항목을 추가한다.

public void addLast(Object obj) : 리스트의 마지막 부분에 항목을 추가한다.

public Object remove(int index)

public boolean remove(Object obj)

public Object removeFirst() : 리스트의 시작 부분의 항목을 제거하고 반환한다.

public Object removeLast() : 리스트의 마지막 부분의 항목을 제거하고 반환한다.

Page 167: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

167

public void clear()

public Object get(int index)

public Object getFirst() : 리스트의 시작 부분의 항목을 반환한다.

public Object getLast() : 리스트의 마지막 부분의 항목을 반환한다.

public Objedt set(int index, Object obj)

Page 168: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

168

슬라이드 122

Ma p 인터페이스

맵 자료구조는 키/값 쌍을 저장하고 있으며 키를 가지고 있으면 이에 해당하는 값을 찾을 수 있도록 구성됨 (셋의 장단점과 비교)

맵을 위한 일반 목적의 클래스HashMap : 키들을 해쉬 함수를 사용하여 해쉬함

TreeMap : 탐색 트리 내에서 키들에 대한 전체적인 정렬을 comparable 또는comparator 기능을 이용하여 정렬

셋은 존재하는 항목을 빠르게 발견할 수 있게 해주지만, 항목을 찾기 위해서는 항목에 대한

정확한 복사본을 가지고 있어야 한다. 이것은 자바에서 사용하고 있는 일반적인 참조가 아니다.

간혹 개발자들은 몇몇 키 정보를 가지고 연관된 항목을 참조하길 원한다. 이것의 가장 좋은 예는

데이터베이스일 것이다. 맵 자료구조는 이러한 기능을 제공하기 위하여 키/값 쌍을 저장하고

있으며 키를 가지고 있으면 이에 해당하는 값을 찾을 수 있도록 구성되어 있다. 예를 들면,

우리들이 대부분의 데이터베이스에서 고용자 ID를 가지고 이에 해당하는 고용자의 신상정보를

자료에 대한 레코드를 사용할 수 있는 것과 같다.

자바에서는 맵을 위한 두개의 일반 목적의 클래스인 HashMap과 TreeMap을 제공한다. 해쉬 맵은

키들을 해쉬 함수를 사용하여 해쉬하고, 트리 맵은 탐색 트리 내에서 키들에 대한 전체적인

정렬을 comparable 또는 comparator 기능을 이용하여 정렬한다. 해쉬 또는 비교 함수는 오직

키들에게만 적용된다..

Page 169: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

169

슬라이드 123

Ha shTa b le 클래스

자바 1.0과 자바 1.1과의 호환성을 위해 제공됨

HashMap과 유사하므로 HashMap 클래스를 사용하는 것이 더 바람직함

key와 value 모두 null값을 허용하지 않음

제공되는 생성자는 HashMap 클래스의 생성자와 동일한 인자를 가짐Hashtable()Hashtable(int initialCapacity)Hashtable(int initialCapacity, float loadFactor)Hashtable(Map t)

HashMap 클래스에서 제공되는 메소드Enumeration keys()Enumeration elements()boolean contains(Object value)

Page 170: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

170

슬라이드 124

Properties 클래스

문자열을 위한 HashTable임.

환경 변수 및 속성값을 Properties 객체로 저장하여 쉽게 접근할 수 있음.

java.lang.System 클래스를 통해서 시스템의 환경 정보를 Properties 객체로 얻을 수 있다.

제공되는 메소드

String getProperty(String key)

String getProperty(String key, String defaultValue)

void list(PrintStream out)

void list(PrintWriter out)

void load(InputStream inStream)

Enumeration propertyNames()

Object setProperty(String key, String value)

void store(OutputStream out, String header)

Page 171: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

171

슬라이드 125

Vec tor 클래스

자바 1.0과 자바 1.1과의 호환성을 위해 제공됨ArrayList와 유사하므로 ArrayList 클래스를 사용하는 것이 더 바람

직함쓰레드에 안전함ArrayList 클래스에서 제공되는 메소드와 자바 1.0과 자바 1.1과의

호환성을 위한 메소드Object elementAt(int index) Enumeration elements()void insertElementAt(Object obj, int index)void setElementAt(Object obj, int index)void removeElementAt(int index)void copyInto(Object[] anArray)

Page 172: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

172

슬라이드 126

날짜 관련 클래스

java.util.Calendar클래스날짜와 시간에 관한 정보

추상클래스날짜,시간에 관련된 다양한 상수를 제공

import java.util.*;class CalendarTest{

public static void main(String[]args){Calendar c = Calendar.getInstance();int y = c.get(Calendar.YEAR);int m = c.get(Calendar.MONTH) + 1;int d = c.get(Calendar.DAY_OF_MONTH);

System.out.println("현재 날짜 : " + y + "년 " + m + "월" + d + "일");}

}

java.util.Date클래스

날짜와 시간에 관한 정보

JDK1.1이후 많은 기능이 deprecated되었다.

import java.util.*;

class DateTest{

public static void main(String[]args){

Date d = new Date();

String s = d.toLocaleString();

System.out.println("현재시각 : " + s);

}

}

Page 173: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

173

슬라이드 127

Eclipse설치

Page 174: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

174

슬라이드 128

128

Ec lip se 설치및 사용

2. 압축해제후 사용

1.Eclipse다운로드

Eclipse설치

www.eclipse.org/downloads사이트에서 "Eclipse IDE for JAVA EE Developers"를 다운로드

받아 c:\에 압축해제한다.

Eclipse사용

c:\eclipse\eclipse.exe응용프로그램을 실행한다.

Page 175: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

175

슬라이드 129

Ec lip se사용

[129]

1. workspace 설정

2. Java Project 생성

• 작업공간을 설정한다.

• JavaProject를 생성한다.

왼편 Project Exproler에서 오른쪽마우스버튼 -> New -> Java Project

Project name 지정 -> Next -> Java BuildSet

3. Java BuildSet

소스 저장경로 : src

Output Folder (컴파일된 class 저장경로) : bin

4. Finish

Page 176: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

176

슬라이드 130

Ec lip se로 클래스 작성

[130]

Name부분에 클래스명을 입력한다.

Page 177: Java Programming - ita.kaist.ac.krEC%9E%90%EB%B0%94-1.pdfChapter 04 \ - z ... 자바는 인터넷또는네트워크와같은분산환경에서TCP/IP ... 즉, 자바 컴파일러와

177

슬라이드 131

클래스 실행

[131]

Run메뉴 -> Run As -> Java Application을 선택하면 하단 탭의 콘솔에 실행결과가 나타난다.