3. 클래스의구현 한동일dasan.sejong.ac.kr/~dihan/java/lec03_020304.pdf · 2013-09-28 ·...

46
JAVA 프로그래밍 JAVA 프로그래밍 3. 클래스의 구현 학습 목표 학습 목표 To learn about the concepts of OOP To understand the concepts of classes and To understand the concepts of classes and objects T b bl ll hd To be able to call methods To understand the purpose and use of constructors To realize the difference between objects and To realize the difference between objects and object references To be able to use keyboard input and formatted monitor output 2/92 monitor output

Upload: lamque

Post on 06-Sep-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

JAVA 프로그래밍JAVA 프로그래밍

3. 클래스의 구현

한 동 일한 동 일

학습 목표학습 목표

To learn about the concepts of OOP

To understand the concepts of classes and To understand the concepts of classes and objects

T b bl ll h d To be able to call methods

To understand the purpose and use of To understand the purpose and use ofconstructors

To realize the difference between objects and To realize the difference between objects and object references

To be able to use keyboard input and formatted monitor output

2/92

monitor output

객체 지향이란?객체 지향이란?

객체 지향의 배경

소프트웨어 모듈의 재사용과 독립성을 강조

객체 지향적 관점에서 프로그램 객체 지향적 관점에서 프로그램

객체들을 생성하고 객체들이 메시지를 서로 주고받음으로써 원하는 일을 하게 함음으로써 원하는 일을 하게 함

각 객체는 단위 데이터 구조와 그의 상태를 변경시키는 메소드들로 구성키는 메소드들로 구성

상호 독립적인 위치에서 상호 호출하는 형식

3/92

객체 지향 vs 절차 지향객체 지향 vs. 절차 지향

함수함수메

메소드

함수함수

객체

메시지

소드데이터

공유데이터

객체

메시지

메소드

메소

메소드

공유데이터메시지

메메소드

소드

메소드

데이터

함수메시지

소드데이터객체

객체함수

객체지향 절차지향

메소드 객체

4/92

절차 지향(Procedure Oriented)절차 지향(Procedure-Oriented)

전통적인 관점에서의 프로그램

데이터 구조

데이터를 변화시키는 알고리즘으로 구성

객체지향프로그램

Obj t O i t d P Object-Oriented Program

C, Pascal 과 같은 절차형 언어(Procedure-)Oriented Program)의 크고 복잡한 문제의 구축 문제

의 해결을 위해 도입

5/92

객체 지향 vs 절차 지향객체 지향 vs. 절차 지향

동전 입력

시작 자판기의 구현 과정 예

돈통 커피통 물통 프림통 컵통

동전 입력

돈이 충아니오돈통 커피통 물통 프림통 컵통 돈이 충

분한가?

자판기 엔진

디스플레이 버튼1 버튼2 버튼3

상품 선택

디스플레이 버튼1 버튼2 버튼3

객체지향적 프로그래밍의 객체들의 상호 관련성

상품재고있나?

아니오

객체지향적 래밍의 객체들의 상 관련성

상품 인도

6/92

절차지향적 프로그래밍의 실행 절차

S/W 프로그래밍 언어들의 계보S/W 프로그래밍 언어들의 계보

LISP ALGOL

SIMULA

1960

PascalSmalltalk C1970

Loops

Flavors

Objective C

C++

Objective-C

Eiffel1980

Object Pascal C++CLOS

Actor

Object Pascal

1990

전 언어

JAVA

7/92

전통언어객체지향전통및객체지향

객체 지향의 주요 개념객체 지향의 주요 개념

객체(Object)

클래스(Class)

상속(Inheritance)

메시지(Message) 메시지(Message)

캡슐화(Encapsulation)

다형성(P l hi ) 다형성(Polymorphism)

8/92

객체(Object)객체(Object)

객체

효율적으로 정보를 관리하기 위하여 사람들이 의미를 효율적으로 정보를 관리하기 위하여, 사람들이 의미를부여하고 분류하는 논리적인(개념적인) 단위

실 세계에 존재하는 하나의 단위에 대한 소프트웨어적 실 세계에 존재하는 하나의 단위에 대한 소프트웨어적표현

객체의 구성

( ) 속성의 값을 나타내는 데이터(data)

데이터를 변경하거나 조작할 수 있는 메소드로 구성

객체의 공개된 인터페이스를 통하여 객체의 속성이나메소드를 접근

9/92

객체의 구조객체의 구조Animal 객체

부모String name;int age;

Animal 객체

데이터 구조a1, a2, . . . , an

void eat();void sleep();void love();

i1i2

m1;m2; 부모String name;

Human 객체

2

.

.

.

m2;...

.

.

.

부모String name;int age;void eat ();

id l ()ikmr;void sleep();void love();String hobby;

a: 속성 변수, m: 메소드, i: 공개 인터페이스 자식void work();void cry();

id l h()

String job;

10/92

void laugh();

클래스(Class)클래스(Class)

클래스란 공통적인 속성을 갖는 객체들의 집합

생물, 동물, 식물

원, 사각형, 컴퓨터공학과 학생

클래스는 필드(field)와 메소드(method)로 구성

필드는 클래스나 객체에 관련된 속성을 나타내는 변수

메소드는 클래스나 객체의 기능을 표현하는 일종의 함수

클래스는 객체를 생성하는 틀( ) 클래스는 객체를 생성하는 틀(template)

한 클래스에 속한 객체들은 동일한 속성을 가짐

하나의 클래스 틀에서 만들어진 실질적이고 구체적인 속성 값을 하나의 클래스 틀에서 만들어진 실질적이고 구체적인 속성 값을갖는 객체 = 인스턴스(Instance)

11/92

클래스(Class)객체지향 프로그래밍의 시작은 클래스의 생성

클래스(Class) 객체지향 프로그래밍의 시작은 클래스의 생성

정보처리의 주체는 클래스가 아니라 객체

클래스로부터 객체의 생성 예 클래스로부터 객체의 생성 예

Class WorkerJohn Mary

char *name[];

t () { }

getname()exchangename()

getname()exchangename()

getname() { . . .}; exchangename() {. . . };

Paul

getname()exchangename()

Worker의 인스턴스

exchangename()

Worker worker1 = new Worker(“john”, “male”, 30, “java program”)

객체 객체생성 클래스 매개변수

12/92

객체 객체생성 클래스 매개변수이름 명령어 이름 데이터

클래스와 객체 인스턴스클래스와 객체, 인스턴스클래스(Class) 클래스(Class) 객체를 정의하는 템플릿

하나의 사용자 정의 자료형(User defined data type) 하나의 사용자 정의 자료형(User-defined data type)

자료 추상화(data abstraction)의 방법

객체(Object) 클래스의 인스턴스로 변수와 같은 역할

객체를 정의하기 위해서는 해당하는 클래스를 정의

인스턴스(instance) 실행시간에 특정 시간에 존재하는 객체

따라서, 데이터에 정확한 값을 가지고 있음

보통 객체와 인스턴스를 혼용해서 사용

13/92

클래스로부터 생성된 개별 객체

클래스와 객체클래스와 객체

Dog

age하나의 클래스

age

breed

namename

bark() 여러 객체

클래스는 객체에 대한 청사진입니다.가상 머신에 그 유형의 객체를 만드는 방법을 알려주는 역할을 합니다법을 알려주는 역할을 합니다.각 객체는 서로 다른 인스턴스 변수 값을가질 수 있습니다.

14/92

상속(Inheritance)상속(Inheritance)

클래스는 새로운 속성이나 메소드를 추가함으로써 확장

하위 계층의 클래스는 상위 계층의 모든 요소를 상속 받고 하위 계층의 클래스는 상위 계층의 모든 요소를 상속 받고새로운 자료구조와 메소드를 추가하여 사용

상속관계의 클래스들은 계층구조를 구성

하위 클래스(Sub Class)는 상위 클래스 (Super Class) 를확장한 개념확장한 개념

상속의 개념을 이용하여 소프트웨어의 재사용(reusing)을 상속의 개념을 이용하여 소프트웨어의 재사용(reusing)을지원

15/92

상속의 예상속의 예객체

부모String name;int age;

Animal 객체 class Animal {String name;int age;g ;

void eat();void sleep();void love();

g ;void eat() {...}void sleep() {...}void love() {...}void love();

Human 객체

}

상속

부모String name;int age;void eat (); class Human extends Animal {

상속

void eat ();void sleep();void love();St i h bb

class Human extends Animal {String hobby;String job;void work() {...}

자식void work();

id ()

String hobby;String job;

void work() {...}void cry() {...}void laugh() {...}

}

16/92

void cry();void laugh();

}

메시지(Message)메시지(Message)메시지는 객체들이 서로 통신하기 위한 방법 메시지는 객체들이 서로 통신하기 위한 방법

한 객체는 다른 객체에 메시지를 보냄으로써 그 객체를 호출

객체 지향 프로그램은 객체 통신 시스템 객체 지향 프로그램은 객체 통신 시스템

메시지의 3가지 구성 요소 메시지의 3가지 구성 요소

메시지를 받는 수신 객체

송신객체가 실행을 원하는 수신객체의 메소드 이름 송신객체가 실행을 원하는 수신객체의 메소드 이름

수신 객체의 메소드에서 필요로 하는 값을 전달하여 주는 인수

수신객체 송신객체객체이름.메소드(인수들)

메시지

송신객체( )

x = pt hmove(5);

17/92

x pt.hmove(5);

캡슐화(Encapsulation)캡슐화(Encapsulation)

객체에서 보여줄 필요가 없는 내부의 상태 또는 내부 프로시저를 객체 외부에서는 보이지 않게 하는 것을 캡슐화

객체에서 숨겨야 하는 정보(private)와 공개해야 하는 정보(public)를 구분하여 작성

객체의 사용자는 기능만 알고 사용하며 어떻게 처리되는지는 은폐(Information Hiding)( g)

18/92

실세계에서의 캡슐화

캡슐화의 장점캡슐화의 장점

객체에 포함된 정보의 손상과 오용 방지 객체에 포함된 정보의 손상과 오용 방지

객체 구성 방법이 바뀌어도 사용방법은 바뀌지 않는다.

내부 구성이 바뀌어도 다른 객체에 영향을 주지 않아 독립성이 유지된다.

처리된 결과만 사용하므로 객체의 이식성이 좋다.

객체를 부품화 할 수 있어 새로운 시스템의 구성에 부품 객체를 부품화 할 수 있어 새로운 시스템의 구성에 부품처럼 사용할 수 있다.

private int XPositionprivate int YPosition숨겨진

데이터와

public int hmove() hmove()

공개된인터페이스

객체

데이터와메소드들

19/92

public int hmove()public int vmove()

hmove()

vmove()

객체

다형성(Polymorphism)다형성(Polymorphism)

Polymorphism = 다양한(poly) + 변신(morphism)

“one interface, multiple implementation”

하나의 인터페이스를 사용하여 다양한 구현 방법을 제공

같은 메소드에서 객체에 따라서 다른 동작 구현 같은 메소드에서 객체에 따라서 다른 동작 구현

동물도형

상속

소리내기draw()

멍멍! 야옹! 꼬꼬댁!타원 사각형 삼각형

draw(){ 타원을그린다 }

draw(){ 사각형을

draw(){ 삼각형을그린다 }

20/92

그린다 } 그린다 } 그린다 }

자바 프로그램 구조자바 프로그램 구조자바 프로그램이 속할 패키지 이름package packageName1; // 자바 프로그램이 속할 패키지 이름

import packageName2; // 자바 프로그램에서 사용할 클래스가 정의되어// 있는 패키지 이름 예 i t j i *: // 있는 패키지 이름, 예: import java.io.*;

[accessSpecifier] class ClassName { // 클래스 헤더부분

변수 선언 // 속성 변수 부분:

메소드 선언 또는 정의 // 사용자가 정의하거나 상위 클래스에서메소드 선언 또는 정의 // 사용자가 정의하거나 상위 클래스에서: // 상속받은 메소드를 구현

} :

[public] interface InterfaceName {

상수 정의 // 상수만 정의 가능상수 정의 // 상수만 정의 가능:

메소드 선언 // 메소드의 선언만 가능하며 구현은 불가:

21/92

:} :

패키지(Package)패키지(Package)

단일 목적을 위한 클래스들의 모임

패키지는 클래스들과 인터페이스들을 하나의 패키지 이 패키지는 클래스들과 인터페이스들을 하나의 패키지 이름으로 포장

클래스 이름의 충돌 클래스 이름의 충돌

패키지 이름을 클래스 이름 앞에 붙여줌으로써 해결

예: java.util.Timer newTimer = new java.util.Timer();

자바의 패키지는 java lang java awt java io java util 자바의 패키지는 java.lang, java.awt, java.io, java.util,java.net 등

프로그래머는 독자적으로 단일 목적을 위한 패키지를 만 프로그래머는 독자적으로 단일 목적을 위한 패키지를 만들어 사용할 수 있음

22/92

자바의 기본 패키지자바의 기본 패키지

java.lang

자바 컴파일러에 의해 자동으로 importp

java.io

스트림 입출력 파일 입출력에 관련된 클래스 스트림 입출력, 파일 입출력에 관련된 클래스

java.util

D t Cl 벡터 스택 해쉬테이블 등 Date Class, 벡터, 스택 , 해쉬테이블 등..

java.applet – applet 프로그램에 필요한 클래스 제공

java.awt - Abstract Window Toolkit, GUI 환경 제공

java.netj

소켓, 텔넷 인터페이스, URL

23/92

. . .

클래스의 구성클래스의 구성

클래스

클래스 헤더 속성 변수

클래스 멤버 구 성 자

메 소 드

내부클래스내부클래스

24/92

클래스 선언클래스 선언클래스 선언 형식 클래스 선언 형식

객체의 구조를 기술하는자료 부분(변수, 상수)

[accessSpecifier] class ClassName {field declarations[constructor declarations]

자료 부분(변수, 상수)

public final [constructor declarations][method declarations]

}

public, final, abstract 객체의 초기화

객체의 행위를 정의하는메소드 부분

public

다른 패키지에서 사용 가능

하나의 소스 파일에는 한 개 이하의 public 클래스

소스 파일의 이름은 반드시 public 클래스 이름

25/92

과 동일

클래스 선언 예클래스 선언 예

class SampleClass { static int num;

class SampleClass { // 클래스 헤더부분static int num;

int a, b; int c;

;int a, b; // 속성 변수 부분(정적 필드와 실체 필드)int c;

public SampleClass(int x, int y, int z) {

a = x;

public SampleClass(int x, int y, int z) {// 구성자 부분. 이름이 클래스 명과 같음a = x;a = x;b = y; c = z; }

a = x;b = y; // b: 속성 변수, y: 매개 변수c = z; // 매개변수는 메소드 내부에서만 사용}}public int sum() { int d;

}public int sum() { // 메소드 부분int d; // d: 지역 변수d = a + b + c ; return d;

}

d = a + b + c ; // b: 속성 변수, d: 지역 변수return d; // 지역변수도 메소드 내부에서만 사용

}

26/92

}}

}}

클래스 해더의 선언클래스 해더의 선언

[public/final/abstract] class ClassName { //클래스 헤더 부분

//클래스 멤버 부분......... //클래스 멤버 부분

}}

클래스 생성시 클래스의 성격을 지정하는 한정자 사용 클래스 생성시 클래스의 성격을 지정하는 한정자 사용

public : public은 다른 어떤 클래스에서도 이 클래스를 사용(클래스의 객체를 생성하는 것)할 수 있음을 의미의 객체를 생성하는 것)할 수 있음을 의미

final : final은 서브 클래스를 가질 수 없는 클래스, 보안 유지 목적

abstract : 추상 메소드를 가지는 추상(abstract) 클래스를 의미

한정자를 지정하지 않으면 같은 패키지내의 클래스들만 접근 가능

27/92

변수의 분류변수의 분류

변수의 분류

정적 필드(static field, 클래스 변수)

실체 필드(instance field, 실체 변수)

지역 변수(local variable) 지역 변수(local variable)

매개 변수(parameter variable)

정적 필드

객체에 소속되지 않고 클래스에 소속되는 필드

객체 외부에 값을 저장하는 용도

28/92

변수의 분류변수의 분류

실체 필드

객체에 소속되어 객체를 사용하는 메소드가 없어질 때 객체에 소속되어 객체를 사용하는 메소드가 없어질 때까지 존재

초기화 문장 없을 경우 default 값으로 초기화 됨 초기화 문장 없을 경우 default 값으로 초기화 됨

지역 변수 매개변수 지역 변수, 매개변수

메소드에 소속되어 메소드 실행이 끝나면 없어짐

반드시 초기화 해야 함

속성 변수

정적 필드와 실체 필드를 통합하여 속성 변수라 총칭

29/92

정적 필드와 실체 필드를 통합하여 속성 변수라 총칭

속성 변수의 초기값속성 변수의 초기값속성 변수에 대한 초기값 속성 변수에 대한 초기값

초기값(initial value)이 명시되지 않으면, 해당하는field type에 따라 default 초기값을 할당

Field Type Initial valueField Type Initial value

byte (byte)0

short (short)0short (short)0int 0long 0Lfloat 0.0fdouble 0.0dboolean falsechar ‘\u0000’

30/92

속성 변수 선언속성 변수 선언

[public/private/protected] [static/final] 변수형 변수명;[public/private/protected] [static/final] 변수형 변수명;

static : 클래스 변수의 선언 static : 클래스 변수의 선언

final : 상수 변수의 선언

static과 final이 붙지 않은 변수 : 실체 필드

접근 한정자 public/private/protected

31/92

속성 변수의 접근 한정자속성 변수의 접근 한정자접근 한정자 접근 명세(access specifier) 접근 한정자, 접근 명세(access specifier) 다른 클래스에서 필드의 접근 허용 정도를 나타내는 부분

public protected private public, protected, private

접근 한정자접근 한정자 클래스클래스 서브 클래스서브 클래스 같은 패키지같은 패키지 모든 클래스모든 클래스

private[ ]

d

private[ ]

d

OO XX XX XX

OO

OO

XX

OO

OO

OO

XX

XXprotectedpublicprotectedpublic

OO

OO

OO

OO

OO

OO

XX

OO

private int i; // 캡슐화를 위해 private 사용 권장

선언 예

p // pint j; // 접근 한정자 미 지정protected int k; // protected

bli i t ; // bli

32/92

public int sum; // public

접근 한정자의 사용 예접근 한정자의 사용 예패키지 P

bli 사용 예

class A {id f() {

public class B {bli i t

class C {public void k() {

패키지 P public 사용 예

void f() {B b = new B();b.n = 3;b g();

public int n;public void g() {

n = 5;}

public void k() {B b = new B();b.n = 7;b.g();b.g();

}}

}}

b.g();}

}

패키지 P private 사용 예

class A {void f() {

B b = new B();

public class B {private int n;private void g() {

class C {public void k() {

B b = new B();

class A {void f() {

B b = new B();

class C {public void k() {

B b = new B();B b = new B();b.n = 3;b.g();

}

private void g() {n = 5;

}}

B b new B();b.n = 7;b.g();

}

B b = new B();b.n = 3;b.g();

}

B b new B();b.n = 7;b.g();

}

33/92

}}

} }}

}}

}}

패키지 P 접근 한정자 미 지정 예

class A {void f() {

B b = new B();

public class B {int n;void g() {

class C {public void k() {

B b = new B();

class A {void f() {

B b = new B();b e ();b.n = 3;b.g();

}

o d g() {n = 5;

}}

b.n = 7;b.g();

}}

b e ();b.n = 3;b.g();

}}}

}}

패키지 P protected 사용 예

}}

class A {void f() {

public class B {protected int n;

class C {public void k() {

B b new B();

패키지 P protected 사용 예

class A {void f() {

B b = new B();b.n = 3;b.g();

}

protected void g() {n = 5;

}}

B b = new B();b.n = 7;b.g();

}

B b = new B();b.n = 3;b.g();

}}}

} }}

D가 B를 상속받음

}}

class D extends B {void f() {

n = 3;

34/92

g();}

}

정적(St ti ) 필드(클래스 변수)정적(Static) 필드(클래스 변수)

정적 필드의 용도

실체 필드는 객체가 생성될 때마다 각 객체에 변수들이 실체 필드는 객체가 생성될 때마다 각 객체에 변수들이생성되지만, 정적 필드는 클래스로부터 생성된 객체들의 수와 상관없이 하나만 생성상 생성

한 클래스로부터 생성된 모든 객체들은 정적 필드를 공유유

정적 필드를 이용하여 객체들 사이의 통신에 사용하거나 객체들의 공통 속성을 나타낼 수 있다나 객체들의 공통 속성을 나타낼 수 있다.

실체 필드와는 달리 정적 필드는 클래스 이름을 통하여접근접근

35/92

정적(St ti ) 필드(클래스 변수)정적(Static) 필드(클래스 변수)

클래스 Test클래스 Test로 부터생성된 모든 객체들은

static int number;int i, j, k;

생성된 모든 객체들은Test.number로 클래스변수에 접근 할 수 있다int i, j, k;

객체생성

수에 할 수 있다

객체생성

객체고유 객체고유 객체고유객체고유 객체 유데이터

객체 유데이터

객체 유데이터

객체 유데이터

객체 a 객체 b 객체 c 객체 d

36/92

변수 접근 방법변수 접근 방법

정적 필드와 실체 필드에 접근하기 위해서는 정적 필드와 실체 필드에 접근하기 위해서는“.”을 사용

정적 필드 : 클래스이름.정적 필드

Test.number

실체 필드 객체이름 실체 필드실체 필드 : 객체이름.실체 필드

a.i, b.j, j

37/92

상수상수

예약어 final을 사용하여 상수 지정

변할 수 없는 상수 값을 나타내고 초기화 이후 변할 수 없는 상수 값을 나타내고 초기화 이후값이 변하지 않음

상수는 관례상 대문자로 표기 상수는 관례상 대문자로 표기

final int MAX = 100; // 메소드 내부 선언 시final int MAX 100 // 메 내부 선언 시

상수 값이 여러 메소드에서 사용되면 클래스에 상수 값이 여러 메소드에서 사용되면 클래스에서 static final 사용

public static final int MAX = 100;

38/92

메소드(Method)메소드(Method)

객체의 행위를 기술하는 방법 객체의 행위를 기술하는 방법

프로그램 코드를 포함하고 있는 함수의 형태

객체는 메소드 호출을 통하여 객체에 대한 작업을 수행

선언 형태 선언 형태

[accessSpecifier] returnType methodName(parameterList) {// method body// method body

} // 예 :

bli id d it(d bl t){public void deposit(double amount){. . .

}

returnType : 반환 값이 없으면 void

}

39/92

메소드 이름의 첫 글자는 일반적으로 소문자로 씀

메소드(Method)메소드(Method)접근 한정자 접근 명세(access specifier) 접근 한정자, 접근 명세(access specifier)

다른 클래스에서 메소드의 접근 허용 정도

필드의 접근 한정자와 의미가 동등( i t / t t d/fi l) 필드의 접근 한정자와 의미가 동등(private/protected/final)

static 정적 메소드(static method), 클래스 메소드(class method)

전역 함수(global function)와 같은 역할

해당 클래스의 정적 필드 혹은 다른 정적 메소드만을 사용 해당 클래스의 정적 필드 혹은 다른 정적 메소드만을 사용

클래스 이름으로 참조

참고 : 일반 메소드 호출 방법

ClassName.methodName(parameterList);

참고 : 일반 메소드 호출 방법

ObjectName.methodName(parameterList);

40/92

메소드(Method)메소드(Method)접근 한정자 접근 명세(access specifier) 접근 한정자, 접근 명세(access specifier) final

최종 메소드(final method)

서브클래스에서 재 정의할 수 없는 속성

synchronized 동기화 메소드

항상 하나의 스레드만이 접근할 수 있도록 제어하는 기능

native C 언어와 같은 다른 프로그래밍언어로 쓰여진 구현 부분을 이용

abstract 추상 메소드로서 추상 클래스 내에서 선언

[] : 자격자가 없는 경우

41/92

[] 자격자가 없는 경우 패키지 내에서만 호출 가능

매개변수(Parameter)매개변수(Parameter)

메소드 내에서만 참조될 수 있는 지역 변수

class Fraction {class Fraction {int numerator, denominator; // 필드public Fraction(int numerator, int denominator) { // 매개 변수

t t //numerator = numerator; // …}

}

필드 : 적어도 클래스 내에서 사용

실체 필드를 구분하기 위하여 ‘this’ 사용 가능

매개 변수 : 메소드 내에서만 사용 매개 변수 : 메소드 내에서만 사용

this.numerator = numerator;

42/92

매개변수(Parameter)매개변수(Parameter)i th d의 매개변수 main method의 매개변수

main method의 형태

public static void main(String[] args) {// …

명령어 라인에서 전달

}

명령어 라인에서 전달

명령어 라인 [0] [1] [2] 명령어 라인 :

java ClassName args[0] args[1] args[2]

args[0] args[1] args[2]

java ClassName args[0] args[1] args[2]

43/92

구성자 생성자(Constructor)구성자,생성자(Constructor)

객체가 연산자에 의해 생성될 때 자동으로 불려지 객체가 new 연산자에 의해 생성될 때 자동으로 불려지는 메소드

이름 : 클래스 이름과 동일

복귀형 : 명시하지 않음 복귀형 : 명시하지 않음

기능 : 주로 객체를 초기화하는 작업

accessSpecifier ClassName(parameterType parameterName, . . .) {constructor body

} //Example:

public BankAccount(double initialBalance) { p ( ) {. . .

}

44/92

구성자 생성자(Constructor)구성자,생성자(Constructor)

매개변수를 이용하여 복수개의 생성자를 구분

class Fraction {// ...Fraction(int a, int b) {

numerator = (double) a;( )denominator = (double) b;

}Fraction(double a, double b) {Fraction(double a, double b) {

numerator = a;denominator = b;

}}…

}

Fraction f = new Fraction(1, 2);F i f F i (1 0 2 0)

45/92

Fraction f = new Fraction(1.0, 2.0);

Math 클래스Math 클래스

Math class: sqrt, pow, cos 등의 수학 연산을정의한 메소드와 PI E의 상수값을 정의정의한 메소드와 PI, E의 상수값을 정의

모든 메소드는 static method로 클래스 명을 이용하여 접근

xn 연산 : Math pow(x n) x 연산 : Math.pow(x, n)

x2 연산의 경우는 x * x 를 이용하는 것을 추천

수의 제곱근을 구할 경우 : Math.sqrt 사용

예 : Math sqrt(x) 예 : Math.sqrt(x)

46/92

Math 클래스Math 클래스

Math.sqrt(x) square root

Math.pow(x, y) power xy

Math.exp(x) exp( ) e

Math.log(x) natural log

Math.sin(x), Math.cos(x), Math.tan(x)

sine, cosine, tangent (x in radian)

Math round(x) closest integer to xMath.round(x) closest integer to x

Math.min(x, y), Math.max(x, y) minimum, maximum

http://download.oracle.com/javase/6/docs/api/java/la/ k ht l 의 M th Cl 참고

47/92

ng/package-summary.html 의 Math Class참고

Math 클래스Math 클래스

아래의 수식은

아래의 자바 코드로 구현

(-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a)

48/92

Math 클래스Math 클래스

Figure 4.2:Analyzing an Expression

49/92

Analyzing an Expression

클래스와 객체의 예클래스와 객체의 예

객체: 메소드를 이용하여 프로그램에서 활용할수 있는 실체수 있는 실체

각 객체는 특정 클래스에 속함

예 객체는 클래스 예:System.out 객체는 PrintStream 클래스에 속함

Figure 2.3:Figure 2.3:Representation of the System.out object

50/92

y j

메소드의 사용 예메소드의 사용 예

메소드 : 객체의 내부 데이터에 접근하는 일련의명령명령

메소드를 호출함으로써 객체를 다룸

클래스: 같은 행위를 갖도록 정의된 객체의 집합

클래스는 사용 가능한 메소드를 결정 클래스는 사용 가능한 메소드를 결정

String greeting = "Hello";//greeting 객체 선언String greeting Hello ;//greeting 객체 선언greeting.println() // Errorgreeting.length() // OKg g g () //

51/92

두 String 객체의 표현두 String 객체의 표현

Figure 2 4:Figure 2.4:A Representation of Two String Objects

52/92

String Objects

String 클래스의 메소드 사용

링에서 자의 갯수 출력

String 클래스의 메소드 사용

length: 스트링에서 문자의 갯수를 출력

String greeting = "Hello, World!";int n = greeting.length(); // sets n to 13

t U C 입력 스트링의 소문자 부분을 대문자로 변 toUpperCase: 입력 스트링의 소문자 부분을 대문자로 변

환한 별도의 스트링을 출력

String river = "Mississippi";St i bi Ri i t U C ()String bigRiver = river.toUpperCase(); // sets bigRiver to "MISSISSIPPI"

53/92

String 클래스의 메소드 사용String 클래스의 메소드 사용

메소드를 객체에 적용할 때 클래스에 정의되어 있는 적절한 메소드를 적용할 것절한 메소드를 적용할 것

예 : Printstream Class에는 length 메소드가 정의되어 있지 않음어 있지 않음

System.out.length();

// This method call is an error

54/92

Rectangle 객체Rectangle 객체

Rectangle 형의 객체 이용하여 사각형 형태 구

성성

Fi 2 9Figure 2.9:Rectangular Shapes

55/92

Rectangle 객체Rectangle 객체

Rectangle 객체 자체는 사각형 형태 아님

단지 사각형을 기술할 수 있는 수의 집합을 가진 단지 사각형을 기술할 수 있는 수의 집합을 가진객체

Figure 2.10:R t l Obj t

56/92

Rectangular Objects

객체의 구성(Construction 생성)객체의 구성(Construction, 생성)

의미

new Rectangle(5, 10, 20, 30)

의미:

1. new 연산자 이용 Rectangle 객체 생성

2. 매개변수(이 경우, 5, 10, 20, 30) 를 사용하여 객체의

데이터를 초기화

3. 객체를 반환

보통 new 연산자의 결과를 해당 객체형 변수에 저장 보통 new 연산자의 결과를 해당 객체형 변수에 저장

Rectangle box1 = new Rectangle(5, 10, 20, 30);Rectangle box2 = new Rectangle(); // 다양한 방식의 구성 방법 제공

http://download.oracle.com/javase/6/docs/api/java/awt/ k ht l 의 R t l Cl 참고

Rectangle box2 new Rectangle(); // 다양한 방식의 구성 방법 제공

57/92

/package-summary.html 의 Rectangle Class참고

객체 구성 방법객체 구성 방법

new ClassName(parameters)

Example:new Rectangle(5, 10, 20, 30)new Rectangle()

PPurpose:To construct a new object, initialize it with the construction

t d t f t th t t d bj tparameters, and return a reference to the constructed object

58/92

객체의 선언과 생성객체의 선언과 생성객체의 선언 객체의 선언

클래스명 객체참조변수;D

Dog myDog;

Dog

myDog

Dog

객체의 생성

객체참조변수 = new 클래스명();

Dog 객체

객체참조변수 = new 클래스명();

myDog = new Dog();g 객체

59/92

객체의 선언과 생성객체의 선언과 생성

객체의 선언과 생성

클래스명 객체참조변수 = new 클래스명();클래스명 객체참조변수 = new 클래스명();

Dog myDog = new Dog();

Dog 객체myDog

Dog

myDog

60/92

Dog

객체의 선언과 생성객체의 선언과 생성Animal aHippo = new Hippo();

Hippo 객체

aHippo

Animal

61/92

객체의 선언과 생성객체의 선언과 생성객체의 선언

Box mybox1; null

객체의 선언 : 객체의 선언은 null 값을 가진 변수만을 의미

Box mybox2; null

mybox1

mybox2

객체의 생성 : 객체에 대한 메모리가 할당되고

width

객체의 생성 : 객체에 대한 메모리가 할당되고

변수(객체참조변수)는 객체에 대한 참조(주소)를 가진다

mybox1 = new Box();height

depth

mybox2 = new Box(); width

h i ht

mybox1

62/92

height

depthmybox2

프로그램 실행 과정프로그램 실행 과정

정적 메모리

CPUCPU RAMRAM 보조기억장치보조기억장치

ALU (연산기)메

상수 메모리2

3

레지스터

힙자바 프로그램

파일1

2

4

힙 파일

스택(1) 프로그램 로딩(2) 패치(3) 연산(3) 연산(4) 메모리 저장

63/92

프로그램에서의 메모리 할당프로그램에서의 메모리 할당

정적 메모리 (static memory) – 공유 메소드나 공유 변수 저장

정적 메모리

소드나 공유 변수 저장

( )상수 메모리

상수 메모리 (constants pool) – 변경되지 않는 값을 저장

힙 힙 (heap) – 객체 할당을 위한 내부 기

p억장치

스택 스택 (stack) – 메소드와 변수를 위한

내부 기억장치주기억장치(RAM)

64/92

내부 기억장치주기억장치(RAM)

객체의 선언과 생성객체의 선언과 생성Book b = new Book();Book c = new Book();

1

Book 객체b

Book

Book 객체

2

Book 객체

c 힙

Book 레퍼런스: 2개객체: 2개

65/92

객체: 2개

객체의 선언과 생성B k d

객체의 선언과 생성Book d = c;

1

k

Book 객체b

Book

Book 객체

2

Book 객체

c 힙

Book

c

레퍼런스: 3개객체 2개

d

66/92

객체: 2개Book

객체의 선언과 생성c = b;

객체의 선언과 생성c = b;

1

k

Book 객체b

Book

Book 객체

2x

Book 객체

c 힙

Book

c

레퍼런스: 3개객체 2개

d

67/92

객체: 2개Book

객체의 소멸B k b B k()

객체의 소멸Book b = new Book();Book c = new Book();

1

Book 객체b

Book

B k 객체

2

Book 객체

c 힙

Book활성 레퍼런스: 2개

68/92

접근할 수 있는 객체: 2개

객체의 소멸객체의 소멸b = c;

1

Book 객체b

Book

B k 객체

2

Book 객체

c 힙

Book

c

활성 레퍼런스: 2개접근할 수 있는 객체: 1개

69/92

접근할 수 있는 객체: 1개버림받은 객체: 1개

객체의 소멸객체의 소멸

c = null;

1

Book 객체

1

b

Book

객체

2x 힙Book 객체

x

Book

c 활성 레퍼런스: 1개널 레퍼런스: 1개접근할 수 있는 객체: 1개

70/92

Book 접근할 수 있는 객체: 1개버림받은 객체: 1개

클래스의 테스트클래스의 테스트

테스트 클래스(Test class)main method를 가지고 있는 클래스 main method를 가지고 있는 클래스

보통 다른 클래스의 테스트 기능 수행

테스트 클래스의 전형적인 수행 절차

테스트 대상이 되는 클래스의 객체를 하나 이상 구성

하나 이상의 메소드 호출 하나 이상의 메소드 호출

하나 이상의 결과를 출력

71/92

클래스의 테스트클래스의 테스트

프로그램 제작 및 테스트 절차

프로그램을 저장할 새로운 서브 폴더 생성 프로그램을 저장할 새로운 서브 폴더 생성

각 클래스 별로 테스트 프로그램을 동시 작성

두 파일을 컴파일

테스트 프로그램 수행

기타 사항 기타 사항

표준 입출력 메소드 들은 main 메소드 내에서만 사용할 것용할 것

72/92

표준 입출력 메소드표준 입출력 메소드

표준 입출력 초기 유닉스 계열 운영체제에서 사용하는 개념 초기 유닉스 계열 운영체제에서 사용하는 개념

프로그램이 시작되면 기본적으로 입출력 파일이 하나씩생성이 되며 이것은 실제 파일이라기 보다는 파일 형식생성이 되며 이것은 실제 파일이라기 보다는 파일 형식으로 키보드 입력과 모니터 출력이 가능하도록 한 것

해당 객체: S t i S t t 해당 객체: System.in, System.out

관련 메소드: System.setIn(), System.setOut(), () 등System.setErr() 등

73/92

표준 입출력 메소드표준 입출력 메소드

자바에서는 스트림 객체를 이용하여 입출력을 수행

스트림(Stream)이란 바이트들의 열을 의미 스트림(Stream)이란 바이트들의 열을 의미

스트림 객체는 스트림에서 데이터를 읽거나 스트림에데이터를 쓸 수 있는 메소드들을 보유데이터를 쓸 수 있는 메소드들을 보유

표준 출력 스트림은 디스플레이 화면에 데이터 출력 표준 출력 스트림은 디스플레이 화면에 데이터 출력

프린트 스트림 객체에는 print() 메소드와 println() 메소드 등이 있음

print() : 출력 후 줄을 바꾸지 않음

println() : 출력 후 줄을 바꿈

printf() : 정밀한 포맷팅 출력 지원

74/92

printf() : 정밀한 포맷팅 출력 지원

printf 메소드printf 메소드

System.out.printf(“Total: %5.2f”, total) ;

PrintStream 객체의 메소드

PrintStream 형의 객체

PrintStream 객체의 메소드

System 클래스

printf method의 정의

public PrintStream printf(String format, Object… args)

format : format specifier가 포함된 문자열로 구성

args : format specifier와 연결되는 매개변수들 args : format specifier와 연결되는 매개변수들

format specifier보다 많은 변수들은 무시됨

75/92

printf 메소드printf 메소드

format specifier 의 정의

%[argument index$][flags][width][ precision]conversion%[argument_index$][flags][width][.precision]conversion

//예: %1$(6.3f, %3d, %e, %-4f, %,8d etc.

argument index: args 부분에 나열된 변수의 위치를 십진수로 나

(

argument_index args 부분에 나열된 변수의 위치를 십진수 나타냄

flag: 출력 포맷을 변경하는 문자로 구성됨

width: 최소로 표시되는 문자수를 양의 정수로 표현

precision: 표시되는 문자수를 제한하는 용도로 사용하며 양의 정수로 표현수로 표현

conversion: 출력 포맷을 지정하는 방식을 문자로 지정

76/92

printf 메소드printf 메소드conversion 출력 대상(자료형) 출력 형태

d integer 10진수 정수, 129

x, X hexadecimal integer 16진수 정수, f8a

o octal integer 8진수 정수, 127

f float, double 10진수 방식의 부동소수점 실수

e, E float, double e 또는 E 방식의 부동소수점 실수

g, G float, double 값에 따라 f와 e 사이에서 선택

c, C char 값에 대응하는 문자, a

s, S String 문자열, Tax :

b, B boolean true or falseb, B boolean true or false

% literal ‘%’ %

n 줄마침

77/92

n 줄마침

printf 메소드printf 메소드

flag 의미 예

왼쪽 정렬 1 23 다음에 빈칸- 왼쪽 정렬 1.23 다음에 빈칸

0 수 앞에 0을 채움 001.23

+ 양수 앞에 + 표시 +1.23

( 음수는 괄호로 둘러싸기 (1.23)

, 천단위 분리자 보여주기 12,300

78/92

표준 입력 메소드표준 입력 메소드

System.in.read() ;

BufferedInputStream 객체의 메소드

BufferedInputStream 형의 객체

BufferedInputStream 객체의 메소드

System 클래스

연속된 문자열을 키보드로부터 읽어 들임 연속된 문자열을 키보드로부터 읽어 들임

read() 메소드: 하나의 문자를 읽어 그 문자를 반환(문자가 없으면 -1 을 반환)

표준 입력 메소드를 사용 시 사용자가 데이터를 입력하기를 기다림

JAVA 5.0 이후 Scanner 객체를 이용한 편리한 입력 제공

79/92

Scanner 클래스의 사용Scanner 클래스의 사용

S 클래스 Scanner 클래스

java.util.Scanner 클래스j 클래

Scanner 객체 생성

import문 필요

Scanner in = new Scanner(System.in);

import문 필요 소스 맨 윗줄에 사용

i t j til S

Scanner에서 키 입력 받기

import java.util.Scanner;

Scanner에서 키 입력 받기 Scanner는 입력되는 키 값을 공백 (‘₩t’,‘ ₩f’,‘

₩r’ ‘ ’ ‘ ₩n’)으로 구분되는 토큰 단위로 읽음

80/92

₩r , , ₩n )으로 구분되는 토큰 단위로 읽음

Scanner 클래스Scanner 클래스

주요 메소드 설명

S i () 다음 토큰을 찾아 문자열로 반환String next() 다음 토큰을 찾아 문자열로 반환

boolean nextBoolean() 다음 토큰을 찾아 boolean으로 변환하여 반환

b t tB t () 다음 토큰을 찾아 b t 로 변환하여 반환byte nextByte() 다음 토큰을 찾아 byte로 변환하여 반환

double nextDouble() 다음 토큰을 찾아 double로 변환하여 반환

float nextFloat() 다음 토큰을 찾아 float로 변환하여 반환float nextFloat() 다음 토큰을 찾아 float로 변환하여 반환

int nextInt() 다음 토큰을 찾아 int로 변환하여 반환

long nextLong() 다음 토큰을 찾아 long으로 변환하여 반환long nextLong() 다음 토큰을 찾아 long으로 변환하여 반환

short nextShort() 다음 토큰을 찾아 short로 변환하여 반환

String nextLine() 한 라인 전체(‘₩n’ 포함)를 문자열 타입으로 반환String nextLine() 한 라인 전체( ₩n 포함)를 문자열 타입으로 반환

81/92

Scanner 클래스의 사용Scanner 클래스의 사용

토큰

Kim Seoul 33 65.1 사용자의키 입력키 입력

Scanner Scanner는 키 입력을공백 단위로 구분하여

Scanner in = new Scanner(System.in);

65.1

공백 단위로 구분하여읽음String name = in.next(); // "Kim"

String addr = in.next(); // "Seoul"int age = in nextInt(); // 23

Ki

Seoul33

int age in.nextInt(); // 23double weight = in.nextDouble(); // 65.1

Kim

82/92

[실습1] Class Basis[실습1] – Class Basis강의 홈페이지의 D j 파일의 클래스 선언 구조를 강의 홈페이지의 Dog.java 파일의 클래스 선언 구조를이해한다.

강의 홈페이지의 DogTester.java 파일의 클래스 생성 구조를 이해하고 실행 결과를 예상하라.

DogTester.java 파일을 수행하여 결과를 확인하고 객체

의 생성, 메소드 접근 방법 등을 이해한다.

먼저 Dog.java 파일을 컴파일

이후 DogTester java 파일을 컴파일 이후 DogTester.java 파일을 컴파일

이후 DogTester.java 파일 실행

예상 결과와 다른 경우 그 이유를 파악하라 예상 결과와 다른 경우 그 이유를 파악하라.

83/92

[실습2] Debug[실습2] – Debug

강의 홈페이지의 ManTester.java는 John F Kennedy라고 지정된 이름을 James G Brown으로 바꿔서 출력하는 프로그램이다.

Human.java 코드와 Man.java 코드의 상속 구조를 이j j 상속해하라.

자기 이름으로 새로운 객체를 추가 생성하고 현재의 자기 이름으로 새로운 객체를 추가 생성하고 현재의human 수(= 2)를 출력하여 정적 필드의 용법을 확인하라.하라.

필요시 원하는 결과를 얻을 수 있도록 코드를 디버깅하라하라.

84/92

[실습3] Encapsulation[실습3] – Encapsulation

강의 홈페이지의 Adder.java, AdderTester.java를 검토해보고 실행 시 error가 발생하는 이유를 파악하라.

Adder.java 코드에서 private 키워드를 제거하는 방식으로 디버깅하고 결과를 확인하라.버깅 과

Adder.java 코드는 원상 복구한 후 AdderTester.java코드를 수정하되 Adder class에서 선언된 메소드들코드를 수정하되 Adder class에서 선언된 메소드들을 활용하는 방식으로 error를 디버깅하라.

필드에 직접 접근하지 않고 메소드를 통해 한 단계를 필드에 직접 접근하지 않고 메소드를 통해 한 단계를더 거치는 방식의 장점에 대해 검토한다.

85/92

[실습4] 변수의 종류[실습4] – 변수의 종류

강의 홈페이지의 AccessTest.java 파일에서 선언된다양한 변수의 종류를 구분하라.

지역 변수의 초기화, 속성 변수의 초기화 필요성을 확인하라.

public, private를 사용한 경우의 변수의 가시성을 확인하라.인하라.

public, private 변수를 접근하는 방법을 숙지하라.

86/92

[실습5] 키보드 입력[실습5] – 키보드 입력

강의 홈페이지의 CashRegister.java code를 이해하라해하라.

강의 홈페이지의 InputTester.java code를 완성하라 (교재 173 페이지 참고)하라. (교재 173 페이지 참고)

실행 결과를 확인하라.행 과

입력값들을 수정해보고 이에 대한 영향을 확인하라하라.

자바 API에서 Scanner 클래스에 대한 설명들을확인하라.

87/92

[실습6] 포맷 출력 실습[실습6] – 포맷 출력 실습

완성된 InputTester.java code를 이용하여 출력포맷을 아래와 같이 다양하게 변경하라포맷을 아래와 같이 다양하게 변경하라. Your change is +2.70

Y h i 1 108 7000 Your change is 1,108.7000

Your change is -13.20

Your change is 6.50e+00

Your change is (13.20) // 음수 값 표현g ( )

Your change is (7) // 음수 값 정수 표현

교재 174 페이지 참고 교재 174 페이지 참고

PrintStream 클래스의 printf 메소드 참고

88/92

[실습7] Math Class의 사용[실습7] – Math Class의 사용

강의 홈페이지의 MathClass.java code를 이용하여 3x2 + 4x + 1 = 0의 해를 구하라하여 3x + 4x + 1 0의 해를 구하라.

해는 -1.0, -0.3333

[실습 5]를 참고하여 2차식의 계수를 입력받도 [실습 5]를 참고하여 2차식의 계수를 입력받도록 MathClass.java code를 수정하라.

다양한 계수를 입력한 후 예측한 해가 나오는지확인하라확인하라.

예측한 해가 나오지 않는 경우 코드를 디버깅하라라.

89/92

[실습8] MoveTester java[실습8] – MoveTester.java

강의 홈페이지의 MoveTester.java code를 이해하라 (교재 75 페이지 참고)하라. (교재 75 페이지 참고)

실행 결과를 확인하라.

파라미터를 수정하고 이에 대한 영향을 확인하라.

Java 홈페이지에서 Rectangle class에 대한 설명과 getX getY 메소드의 동작을 확인하라명과 getX, getY 메소드의 동작을 확인하라.

90/92

[실습9] BankAccount[실습9] – BankAccount

강의 홈페이지의 BankAccount.java code를 완성하라 (교재 109 페이지 참고)성하라. (교재 109 페이지 참고)

교재가 없는 경우 완성된 메소드를 이해한 후 교재를 참고하지 말고 코드를 완성하라재를 참고하지 말고 코드를 완성하라.

강의 홈페이지의 BankAccountTester.java code강 j를 이해하라. (교재 112 페이지 참고)

계좌의 생성과 입금 출금 이체의 구현코드를 계좌의 생성과 입금, 출금, 이체의 구현코드를이해하라.

실행을 통해 그 결과를 확인하라.

91/92

[실습10] BankAccount 2[실습10] – BankAccount 2

강의 홈페이지의 kA j d 를 활 강의 홈페이지의 BankAccount.java code를 활용하고 BankAccountTester.java code를 다음과같은 동작을 하도록 수정하라. 잔액이 1,000,000원인 철수계좌 생성

잔액이 0원인 영희계좌 생성

100,000원을 철수계좌에서 영희계좌로 이체

이체 전후의 철수계좌와 영희계좌의 잔액 출력

printf 메소드를 이용하여 다음과 같이 출력하라-----------------------------

계좌 이체 이전

철수계좌 잔액은 1,000,000

영희계좌 잔액은 0영희계좌 잔액은 0

-----------------------------

계좌 이체 이후

철수계좌 잔액은 900,000

92/92

영희계좌 잔액은 100,000

-----------------------------