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

3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

JAVA 프로그래밍

3. 클래스의 구현

한 동 일

2/92

학습 목표

To learn about the concepts of OOP

To understand the concepts of classes and objects

To be able to call methods

To understand the purpose and use of constructors

To realize the difference between objects and object references

To be able to use keyboard input and formatted monitor output

Page 2: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

3/92

객체 지향이란?

객체 지향의 배경

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

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

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

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

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

4/92

객체 지향 vs. 절차 지향

함수

공유데이터

함수함수

함수

객체지향 절차지향

메시지

객체

메시지

메시지

메시지

메소

메소드

메소드

데이터

메소

메소드

메소드

데이터

메소

메소드

메소드

데이터

객체

객체

Page 3: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

5/92

절차 지향(Procedure-Oriented)

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

데이터 구조

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

객체지향프로그램

Object-Oriented Program

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

6/92

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

자판기 엔진

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

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

동전 입력

상품 선택

돈이 충분한가?

상품재고있나?

시작

상품 인도

아니오

아니오

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

객체 지향 vs. 절차 지향

자판기의 구현 과정 예

Page 4: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

7/92

LISP

Loops

Flavors

C++

Objective-C

Pascal

ALGOL

CLOS

SIMULA

Smalltalk

Actor

Eiffel

C

1960

1970

1980

1990

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

JAVA

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

Object Pascal

8/92

객체 지향의 주요 개념

객체(Object)

클래스(Class)

상속(Inheritance)

메시지(Message)

캡슐화(Encapsulation)

다형성(Polymorphism)

Page 5: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

9/92

객체(Object)

객체

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

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

객체의 구성

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

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

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

10/92

객체의 구조

i1i2...ik

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

m1;m2;...

mr;

.

.

.

a: 속성 변수, m: 메소드, i: 공개 인터페이스

부모String name;int age;

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

자식

부모String name;int age;

void work();void cry();void laugh();

Animal 객체

Human 객체

void eat ();void sleep();void love();String hobby;String job;

Page 6: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

11/92

클래스(Class)

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

생물, 동물, 식물

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

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

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

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

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

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

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

12/92

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

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

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

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

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

클래스(Class)

char *name[];

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

Class Worker

Worker의 인스턴스

John

getname()exchangename()

Mary

getname()exchangename()

Paul

getname()exchangename()

Page 7: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

13/92

클래스와 객체, 인스턴스 클래스(Class)

객체를 정의하는 템플릿

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

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

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

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

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

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

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

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

14/92

클래스와 객체

Dog

age

breed

name

bark()

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

하나의 클래스

여러 객체

Page 8: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

15/92

상속(Inheritance)

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

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

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

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

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

16/92

상속의 예

부모String name;int age;

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

자식

부모String name;int age;

void work();void cry();void laugh();

Animal 객체

Human 객체

void eat ();void sleep();void love();String hobby;String job;

class Animal {String name;int age;void eat() {...}void sleep() {...}void love() {...}

}

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

}

상속

Page 9: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

17/92

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

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

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

메시지의 3가지 구성 요소

메시지를 받는 수신 객체

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

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

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

메시지

x = pt.hmove(5);

18/92

캡슐화(Encapsulation)

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

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

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

실세계에서의 캡슐화

Page 10: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

19/92

캡슐화의 장점

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

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

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

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

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

private int XPositionprivate int YPosition

public int hmove()public int vmove()

hmove()

vmove()

공개된인터페이스

객체

숨겨진데이터와메소드들

20/92

다형성(Polymorphism)

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

“one interface, multiple implementation”

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

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

상속

멍멍! 야옹! 꼬꼬댁!

소리내기

동물도형

draw()

타원

draw(){ 타원을그린다 }

사각형

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

삼각형

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

Page 11: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

21/92

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

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

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

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

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

} :

[public] interface InterfaceName {

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

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

} :

22/92

패키지(Package)

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

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

클래스 이름의 충돌

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

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

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

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

Page 12: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

23/92

자바의 기본 패키지

java.lang

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

java.io

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

java.util

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

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

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

java.net

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

. . .

24/92

클래스

클래스 헤더

클래스 멤버

메 소 드

구 성 자

속성 변수

클래스의 구성

내부클래스

Page 13: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

25/92

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

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

}

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

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

public, final, abstract

public

다른 패키지에서 사용 가능

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

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

객체의 초기화

26/92

class SampleClass { static int num;int a, b; int c;

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

a = x;b = y; c = z;

}public int sum() {

int d; d = a + b + c ; return d;

}}

클래스 선언 예

class SampleClass { // 클래스 헤더부분static int num;int a, b; // 속성 변수 부분(정적 필드와 실체 필드)int c;

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

a = x;b = y; // b: 속성 변수, y: 매개 변수c = z; // 매개변수는 메소드 내부에서만 사용

}public int sum() { // 메소드 부분

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

}}

Page 14: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

27/92

클래스 해더의 선언

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

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

}

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

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

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

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

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

28/92

변수의 분류

변수의 분류

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

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

지역 변수(local variable)

매개 변수(parameter variable)

정적 필드

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

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

Page 15: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

29/92

변수의 분류

실체 필드

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

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

지역 변수, 매개변수

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

반드시 초기화 해야 함

속성 변수

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

30/92

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

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

Field Type Initial value

byte (byte)0

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

Page 16: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

31/92

속성 변수 선언

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

static : 클래스 변수의 선언

final : 상수 변수의 선언

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

접근 한정자 public/private/protected

32/92

속성 변수의 접근 한정자 접근 한정자, 접근 명세(access specifier)

다른 클래스에서 필드의 접근 허용 정도를 나타내는 부분

public, protected, private

private int i; // 캡슐화를 위해 private 사용 권장int j; // 접근 한정자 미 지정protected int k; // protectedpublic int sum; // public

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

private[ ]protectedpublic

private[ ]protectedpublic

OO XX XX XX

선언 예

OO

OO

OO

XX

OO

OO

OO

OO

OO

XX

XX

OO

Page 17: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

33/92

접근 한정자의 사용 예

class A {void f() {

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

}}

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

n = 5;}

}

class C {public void k() {

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

}}

패키지 P

class A {void f() {

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

}}

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

n = 5;}

}

class C {public void k() {

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

}}

패키지 P public 사용 예

private 사용 예

class A {void f() {

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

}}

class C {public void k() {

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

}}

34/92

class A {void f() {

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

}}

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

n = 5;}

}

class C {public void k() {

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

}}

패키지 P

class A {void f() {

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

}}

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

n = 5;}

}

class C {public void k() {

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

}}

패키지 P

class D extends B {void f() {

n = 3;g();

}}

D가 B를 상속받음

접근 한정자 미 지정 예

protected 사용 예

class A {void f() {

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

}}

class A {void f() {

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

}}

Page 18: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

35/92

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

정적 필드의 용도

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

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

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

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

36/92

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

static int number;int i, j, k;

객체고유데이터

객체고유데이터

객체고유데이터

객체고유데이터

클래스 Test

객체생성

클래스 Test로 부터생성된 모든 객체들은Test.number로 클래스변수에 접근 할 수 있다

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

Page 19: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

37/92

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

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

Test.number

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

a.i, b.j

변수 접근 방법

38/92

상수

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

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

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

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

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

public static final int MAX = 100;

Page 20: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

39/92

메소드(Method)

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

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

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

선언 형태

returnType : 반환 값이 없으면 void

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

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

} // 예 :

public void deposit(double amount){. . .

}

40/92

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

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

필드의 접근 한정자와 의미가 동등(private/protected/final)

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

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

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

클래스 이름으로 참조

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

ClassName.methodName(parameterList);

ObjectName.methodName(parameterList);

Page 21: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

41/92

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

final 최종 메소드(final method)

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

synchronized 동기화 메소드

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

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

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

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

42/92

매개변수(Parameter)

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

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

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

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

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

numerator = numerator; // …}

}

this.numerator = numerator;

Page 22: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

43/92

매개변수(Parameter) main method의 매개변수

main method의 형태

명령어 라인에서 전달

명령어 라인 :

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

}

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

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

44/92

구성자,생성자(Constructor)

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

이름 : 클래스 이름과 동일

복귀형 : 명시하지 않음

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

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

} //Example:

public BankAccount(double initialBalance) { . . .

}

Page 23: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

45/92

구성자,생성자(Constructor)

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

Fraction f = new Fraction(1, 2); Fraction f = new Fraction(1.0, 2.0);

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

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

}Fraction(double a, double b) {

numerator = a;denominator = b;

}…

}

46/92

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

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

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

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

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

예 : Math.sqrt(x)

기타 : 큰 수 처리를 위한 별도의 Math 패키지 존재

BigDecimal, BigInteger Class등

Math 클래스

Page 24: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

47/92

Math 클래스

Math.sqrt(x) square root

Math.pow(x, y) power xy

Math.exp(x) ex

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 x

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

https://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html 의 Math Class참고(java.lang 패키지)

48/92

아래의 수식은

아래의 자바 코드로 구현

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

Math 클래스

Page 25: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

49/92

Figure 4.2:Analyzing an Expression

Math 클래스

50/92

클래스와 객체의 예

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

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

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

Figure 2.1:Representation of the System.out object

Page 26: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

51/92

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

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

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

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

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

메소드의 사용 예

52/92

Figure 2.5:A Representation of Two String Objects

두 String 객체의 표현

Page 27: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

53/92

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

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

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

환한 별도의 스트링을 출력

String river = "Mississippi";String bigRiver = river.toUpperCase(); // sets bigRiver to "MISSISSIPPI"

String 클래스의 메소드 사용

54/92

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

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

System.out.length();

// This method call is an error

String 클래스의 메소드 사용

Page 28: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

55/92

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

Rectangular Shapes

Rectangle 객체

56/92

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

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

Figure 2.11:Rectangular Objects

Rectangle 객체

Page 29: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

57/92

의미:

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

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

데이터를 초기화

3. 객체를 반환

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

https://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html 의 awt 패키지 Rectangle Class참고

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

new Rectangle(5, 10, 20, 30)

객체의 구성(Construction, 생성)

58/92

new ClassName(parameters)

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

Purpose:To construct a new object, initialize it with the construction parameters, and return a reference to the constructed object

객체 구성 방법

Page 30: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

59/92

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

클래스명 객체참조변수;

Dog myDog;

Dog

myDog

Dog 객체

객체의 생성

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

myDog = new Dog();

60/92

객체의 선언과 생성

객체의 선언과 생성

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

Dog myDog = new Dog();

Dog 객체

Dog

myDog

Page 31: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

61/92

Hippo 객체

Animal

aHippo

Animal aHippo = new Hippo();

객체의 선언과 생성

62/92

객체의 선언과 생성

Box mybox1;

Box mybox2;

mybox1 = new Box();

mybox2 = new Box();

null

null

mybox1

mybox2

width

height

depth

width

height

depth

mybox1

mybox2

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

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

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

Page 32: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

63/92

ALU (연산기)

레지스터

정적 메모리

상수 메모리

스택

자바 프로그램파일

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

1

2

3

4

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

프로그램 실행 과정

64/92

정적 메모리

상수 메모리

스택

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

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

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

스택 (stack) – 메소드와 변수를 위한내부 기억장치주기억장치(RAM)

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

Page 33: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

65/92

객체의 선언과 생성

Book

Book

Book 객체

Book 객체

1

2

b

c

Book b = new Book();Book c = new Book();

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

66/92

Book

Book

Book 객체

Book 객체

1

2

b

c

Book d = c;

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

Book

d

객체의 선언과 생성

Page 34: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

67/92

Book

Book

Book 객체

Book 객체

1

2

b

c

c = b;

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

Book

d

x

객체의 선언과 생성

68/92

Book

Book

Book 객체

Book 객체

1

2

b

c

Book b = new Book();Book c = new Book();

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

객체의 소멸

Page 35: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

69/92

Book

Book

Book 객체

Book 객체

1

2

b

c

b = c;

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

객체의 소멸

70/92

Book

Book

Book 객체

Book 객체

1

2

b

c

c = null;

활성 레퍼런스: 1개널 레퍼런스: 1개접근할 수 있는 객체: 1개버림받은 객체: 1개

x

객체의 소멸

Page 36: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

71/92

클래스의 테스트

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

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

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

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

하나 이상의 메소드 호출

하나 이상의 결과를 출력

72/92

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

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

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

두 파일을 컴파일

테스트 프로그램 수행

기타 사항

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

클래스의 테스트

Page 37: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

73/92

표준 입출력 메소드

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

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

해당 객체: System.in, System.out

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

74/92

표준 입출력 메소드

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

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

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

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

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

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

println() : 출력 후 줄을 바꿈

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

Page 38: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

75/92

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

System 클래스

PrintStream 형의 객체

PrintStream 객체의 메소드

printf 메소드

printf method의 정의

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

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

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

public PrintStream printf(String format, Object… args)

76/92

format specifier 의 정의

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

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

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

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

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

printf 메소드

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

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

Page 39: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

77/92

printf 메소드

flag 의미 예

- 왼쪽 정렬 1.23 다음에 빈칸

0 수 앞에 0을 채움 001.23

+ 양수 앞에 + 표시 +1.23

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

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

78/92

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 false

% literal ‘%’ %

n 줄마침

printf 메소드

Page 40: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

79/92

표준 입력 메소드

System.in.read() ;

System 클래스

BufferedInputStream 형의 객체

BufferedInputStream 객체의 메소드

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

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

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

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

80/92

Scanner 클래스의 사용

Scanner 클래스

java.util.Scanner 클래스

Scanner 객체 생성

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

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

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

Scanner in = new Scanner(System.in);

import java.util.Scanner;

Page 41: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

81/92

주요 메소드 설명

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

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

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

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

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

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

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

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

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

Scanner 클래스

82/92

Kim Seoul 33 65.1 사용자의키 입력

Scanner

Kim

Seoul33

65.1

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

토큰

Scanner in = new Scanner(System.in);

String name = in.next(); // "Kim"String addr = in.next(); // "Seoul"int age = in.nextInt(); // 23double weight = in.nextDouble(); // 65.1

Scanner 클래스의 사용

Page 42: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

83/92

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

이해한다.

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

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

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

먼저 Dog.java 파일을 컴파일

이후 DogTester.java 파일을 컴파일

이후 DogTester.java 파일 실행

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

84/92

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

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

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

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

[실습2] – Debug

Page 43: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

85/92

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

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

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

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

[실습3] – Encapsulation

86/92

[실습4] – 변수의 종류

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

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

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

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

Page 44: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

87/92

[실습5] – 키보드 입력

강의 홈페이지의 Volume.java code를 완성하라. (빅자바 6판 교재 145, 148 페이지 참고)

실행 결과를 확인하라.

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

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

88/92

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

완성된 Volume.java code를 이용하여 출력 포맷을 아래와 같이 다양하게 변경하라. Pack price per liter: +2.70

Pack price per liter: 1,108.7000

Your change is -13.20

Pack price per liter: 6.50e+00

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

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

교재 147 페이지 참고

PrintStream 클래스의 printf 메소드 참고

Page 45: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

89/92

[실습7] – Math Class의 사용

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

해는 -1.0, -0.3333

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

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

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

90/92

[실습8] – MoveTester.java

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

실행 결과를 확인하라.

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

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

Page 46: 3. 클래스의구현 한동일vip.sejong.ac.kr/dihan/java/lec03_020304.pdf · 2019-09-23 · JAVA 프로그래밍 3. 클래스의구현 한동일 2/92 학습목표 To learn about

91/92

[실습9] – BankAccount

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

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

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

실행을 통해 그 결과를 확인하라. 다양한 입출금을 통해 동작을 확인하라.

92/92

[실습10] – BankAccount 2

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

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

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

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

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

계좌 이체 이전

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

영희계좌 잔액은 0

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

계좌 이체 이후

철수계좌 잔액은 900,000

영희계좌 잔액은 100,000

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