• 검색 결과가 없습니다.

상속

N/A
N/A
Protected

Academic year: 2022

Share "상속"

Copied!
82
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

프로그래머를

프로그래머를 위한 위한 Java 2, 4 Java 2, 4 판 판

제 제 4 4 장 장 객체지향 객체지향 프로그래밍 프로그래밍 II II

(2)

Chap.4,5,6

Class for OOP 2

4.1.1

4.1.1 상속상속

z

상속

† 기존에 있는 클래스를 바탕으로 다른 특성을 추가해 새로운 클래스를 생성

 서브 클래스(subclass), 파생 클래스(derived class), 자식 클래스(child class)

 슈퍼 클래스 (superclass), 베이스 클래스 (baseclass), 부모 클래스 (parent class)

† is - a 관계

 "Human is an animal."에서 human과 animal과의 관계

 human은 animal에 속하면서 animal의 모든 속성을 상속받음

 is - a가 성립하는 경우에 상속이 가능하다.

† 서브 클래스는 슈퍼 클래스의 서브타입 (subtype)

† 자바에서는 상속을 위해서 extends라는 키워드를 사용

† 자바는 단일 상속(single inheritance)만 지원

 하나의 슈퍼 클래스로부터 상속받음 cf) 다중상속다중상속 C++C++

(3)

Chap.4,5,6

4.1.1

4.1.1 상속상속

z

사원과 관리자의 예

†

Employee 클래스

멤버 필드: 이름, 사번, 직책, 월급

메소드: 일하다

†

Manager 클래스

멤버 필드: 이름, 사번, 직책, 월급, 부서

메소드: 일하다

(4)

Chap.4,5,6

Class for OOP 4

4.1.1

4.1.1 상속상속

z

Employee와 Manager의 관계

†

is-a 관계

A manager is an employee.

†

상속 관계

Employee : 슈퍼 클래스, 부모 클래스

Manager : 서브 클래스, 자식 클래스

†

자바에서 상속

extends 키워드 사용

(5)

Chap.4,5,6

4.1.1

4.1.1 상속상속

z

예제 : Employee.java

1 class Employee {

2 protected String name;

3 protected String idnum;

7 public Employee(String name, String idnum) { 8 this.name = name;

9 this.idnum = idnum;

20 public void work() {

21 System.out.println("₩tEmployee ₩""+name + "₩" does his best.");

22 }

(6)

Chap.4,5,6

Class for OOP 6

4.1.1

4.1.1 상속상속

z

예제 : Manager.java

1 class Manager extends Employee { 2 String dept;

4 public Manager(String name, String idnum, String dept) { 5 super(name, idnum);

6 this.dept = dept;

7 } 8

9 public void work() {

10 System.out.println("Manager ₩""+name +

11 "₩" works hard with his subordinates in "+dept+“dept.");

12 }

(7)

Chap.4,5,6

4.1.1

4.1.1 상속상속

z

예제 : Company.java

7 jmchoi = new Manager(“Yoon Yong", "F99847", "Finance");

10 lee = new Employee("lee", "F94732");

12 employees = new Employee[4];

13 employees[0] = yiyoon;

14 employees[1] = sblim;

19 public void makeMoney() { 20 int n = employees.length;

21 for(int i=0; i < n; i++) { 22 employees[i].work();

23 }

(8)

Chap.4,5,6

Class for OOP 8

4.1.2 super

4.1.2 super와와 super()super()

z

super

†

super는 슈퍼 클래스를 지칭하는 레퍼런스로 사용

상위 클래스의 멤버 필드나 메소드를 지칭할 때 사용

z super.attribute

z super.method()

static으로 선언된 메소드에서는 사용될 수 없다.

z

super()

†

super()는 슈퍼 클래스의 생성자를 호출

†

super()는 생성자의 맨 처음 부분에 위치

†

자식 클래스의 생성자는 슈퍼클래스의 생성자를 호출해야 한다.

슈퍼클래스의 생성자를 호출하지 않는 경우에는 내부에서 자동적으로

슈퍼클래스의 디폴트 생성자가 호출

(9)

Chap.4,5,6

4.1.3

4.1.3 오버라이딩오버라이딩

z

오버라이딩 (overriding)

† 클래스의 상속관계에서 발생

† 슈퍼 클래스에 있는 메소드를 서브 클래스에서 다른 작업을 하도록 서브클래스에서 동일한 함수 이름으로 재정의

cf) 오버로딩(overloading)

† static으로 선언한 클래스 메소드에서는 오버라이딩 되지 않는다.

† 예외 상황을 발생시킬 수 있는 메소드는 오버라이딩 할 수 없다.

†

class Employee {

public void work() {

System.out.println("₩tEmployee ₩""+name + “….");

} }

class Manager extends Employee { public void work() {

System.out.println("Manager ₩""+name + "...");

(10)

Chap.4,5,6

Class for OOP10 z

예제 : A.java

2 int a = 10;

4 void b() {

5 System.out.println("A");

z

예제 : AA.java

1 class AA extends A { 2 int a = 20;

3 void b()

4 System.out.println("AA");

5

6 void c() {

7 System.out.println("C");

4.1.4

4.1.4 상속상속, , 오버라이딩오버라이딩, , 우버쉐도우우버쉐도우

(11)

Chap.4,5,6

4.1.4

4.1.4 상속상속, , 오버라이딩오버라이딩, , 우버쉐도우우버쉐도우

z

메모리 구조

A

AA

a 10 b()

a 20 c()

void b() { ..("A") }

void b() { ..("AA") }

void c() { ..("C") }

z

(12)

Chap.4,5,6

Class for OOP12

4.1.4

4.1.4 상속상속, , 오버라이딩오버라이딩, , 우버쉐도우우버쉐도우

z

예제 : XYZ.java

msg 출력

(13)

Chap.4,5,6

4.1.4

4.1.4 상속상속, , 오버라이딩오버라이딩, , 우버쉐도우우버쉐도우

z

예제 : XYZ.java

40 Z z = new Z();

41 Y y = z;

42 X x = z;

43 z.print();

44 y.print();

45 super.print();

46 play();

47 super.play();

48 // y.doZ();

49 // super.super.print();

(14)

Chap.4,5,6

Class for OOP14

4.1.4

4.1.4 상속상속, , 오버라이딩오버라이딩, , 우버쉐도우우버쉐도우

z

예제 : XYZ.java(계속)

51 System.out.println("₩ni ="+ i);

52 System.out.println("this.i = "+ this.i);

53 System.out.println("super.i = "+ super.i);

54 System.out.println("y.i = "+ y.i);

55 System.out.println("x.i = "+ x.i);

56 System.out.println("((Y)this).i = "+ ((Y)this).i);

57 System.out.println("((X)this).i = "+ ((X)this).i);

58 // super.super.i = 10;

(15)

Chap.4,5,6

4.1.4

4.1.4 상속상속, , 오버라이딩오버라이딩, , 우버쉐도우우버쉐도우

z

결과 : XYZ.java

C:₩> java Z I am a Z.

I am a Z.

I am an Y.

Play..I am a Z.

Play..I am an X.

i =15

this.i = 30 super.i = 20 y.i = 20

x.i = 10

((Y)this).i = 20 ((X)this).i = 10

(16)

Chap.4,5,6

Class for OOP16

4.1.4

4.1.4 상속상속, , 오버라이딩오버라이딩, , 오버쉐도우오버쉐도우

z

오버라이딩 (overriding)

†

주의 사항

가시성은 커지는 방향으로

예외 throws 문제

리턴 타입이 다른 경우

z

오버쉐도우 (overshadow)

†

동일한 이름의 멤버 필드가 슈퍼클래스와 서브클래스에 있을 때

†

오버쉐도우된 멤버 필드는 super 레퍼런스를 이용하거나, 서브

클래스를 슈퍼클래스로 형 변환해서 접근할 수 있다 .

(17)

Chap.4,5,6

PolyMorphism PolyMorphism

z

Poly : 많다는 뜻의 접두어

z

Morphism : 형태라는 뜻

z

Polymorphism : 형태가 많다는 뜻

†

의미(Semantics)는 하나지만 실제 형태는 여러가지가 될 수 있음.

예) 밥을 먹다: 누가 밥을 먹는 가에 다양한 형태가 존재

†

객체지향 프로그래밍에서 polymorphism의 지원 형태

Overloading

Overriding

(18)

Chap.4,5,6

Class for OOP18

4.2.1

4.2.1 클래스에서클래스에서 형변환형변환

z

슈퍼 타입과 슈퍼 클래스

†

슈퍼 타입 ≒ 슈퍼 클래스

같은 개념은 아니지만, 자바/C++ 등의 언어에서는 같다고 보아도 무방함

z

(19)

Chap.4,5,6

4.2.1

4.2.1 클래스에서클래스에서 형변환형변환

z

예제 : ReferenceCast.java

9 animal1 = new Animal();

10 mammal1 = new Mammal();

11 ape1 = new Ape();

12 human1 = new Human();

13

14 // human2 = ape1; // 컴파일 에러 15 // human2 = mammal1; // 컴파일 에러

16 // human2 = (Human) mammal1; // 컴파일 OK, 실행 시 에러 17

18 mammal2 = human1; // OK

19 // human2 = mammal2; // 컴파일 에러 20 human2 = (Human) mammal2; // OK

21 // ape2 = (Ape) mammal2; // 컴파일 OK, 실행 시 에러 22 // ape2 = (Ape) animal1; // 컴파일 OK, 실행 시 에러

(20)

Chap.4,5,6

Class for OOP20

4.2.2 static

4.2.2 static 메소드메소드 숨김숨김

z

static 메소드 숨김

†

부모 클래스에서 정의한 static 메소드를 자식 클래스에서 다시 정의하는 경우

†

부모 클래스의 메소드는 숨겨져서 보이지 않음

†

자식 클래스를 부모 클래스로 타입 변경하면, 부모 클래스의 메소드를 사용할 수 있음

z

예 : MethodHiding.java

1 class Super {

2 static String greeting() { return "Goodnight"; } 3 String name() { return "Richard"; }

4 }

6 class Sub extends Super {

7 static String greeting() { return "Hello"; } 8 String name() { return "Dick"; }

(21)

Chap.4,5,6

z

추상클래스 (abstract class)

 특성이 구체적으로 구현되지 않는 클래스

 new를 이용해서 생성할 수 없다

 abstract 키워드 사용

† 추상 메소드

 메소드의 인터페이스만 정의되어 있는 메소드

 메소드의 리턴 타입 부분 앞에 abstract라는 키워드를 기술

 메소드의 헤더만 정의하고, 바디가 없는 메소드

 추상 메소드 형태

visibilty_type abstract return_type function_name (argumet_list) ;

 추상 메소드는 함수의 몸체를 가지지 않는다.

† 추상 메소드를 가지는 모든 클래스를 추상 클래스라고 한다.

 추상 클래스는 클래스 선언 시에 abstract라는 키워드를

 추상 클래스로부터 상속받는 경우에 서브 클래스는 추상 메소드를 구현(implement)해야 한다.

4.3 4.3 추상클래스추상클래스 (abstract class)(abstract class)

(22)

Chap.4,5,6

Class for OOP22 예제 : Shape.java

1 public abstract class Shape { 2 public abstract double area();

3 public abstract double circumference();

4 }

예제 : Circle.java 파일

1 class Circle extends Shape{

2 protected int r;

34 public Circle() { 5 r = 0;

6 } 7 11……..

12 public double circumference() { 13 return Math.PI*2*r;

14 }

1516 public double area() { 17 return Math.PI*r*r;

18 }

……….

4.3 4.3 추상클래스추상클래스 (abstract class)(abstract class)

(23)

Chap.4,5,6

z

예제 : ShapeUser.java

1 class ShapeUser { 2

3 public static void main(String arg[]) { 4 Shape shape[] = new Shape[3];

5

6 shape[0] = new Circle(5);

7 shape[1] = new Circle(7);

8 shape[2] = new Rectangle(9, 5);

9

10 System.out.println("shape[0]'s area = " + shape[0].area());

11 System.out.println("shape[1]'s area = " + shape[1].area());

12 System.out.println("shape[2]'s area = " + shape[2].area());

…………...

z

결과

% java ShapeUser

shape[0]'s area = 78.53981633974483 shape[1]'s area = 153.93804002589985 shape[2]'s area = 45.0

4.3 4.3 추상클래스추상클래스 (abstract class)(abstract class)

(24)

Chap.4,5,6

Class for OOP24

4.4 4.4 인터페이스인터페이스

z

인터페이스

†

자바에서 서브 타입을 지원하기 위해서 만든 개념

†

모든 메소드가 헤더만 갖고 있고 , 바디는 없음

†

형태

†

인터페이스를 구현하는 클래스는 implements 키워드 사용

[ interfacemodifier ] interface name [ extends name ] {

[ interfacefieldmodifier ] type name;

[ interfacemethodmodifier ] returntype name ( argumentlist ) ;

}

(25)

Chap.4,5,6

4.4.1

4.4.1 인터페이스인터페이스 기초기초

z

interface가 필요한 이유

†

가정

어떤 가계는 물건을 팔 때 돈 이외 경제적 가치가 있는 것을 받는다.

 Shop 클래스의 sell() 메소드는 경제적 가치가 있는 것을 모두 매개 변수로 받는다.

†

문제점 : sell() 메소드의 매개 변수 타입

Money 타입인 경우 – 다른 경제적 가치가 있는 것은 못 받는다.

Thing 타입인 경우 – 경제적 가치가 없는 것도 받을 수 있다.

†

해결책

C++ - 다중 상속 사용

자바 - ???

z interface라는 개념 도입

(26)

Chap.4,5,6

Class for OOP26

4.4.1

4.4.1 인터페이스인터페이스 기초기초

z

interface가 필요한 이유

Thing

Money Watch Trash

public class Shop {

public void sell( ? value, String name) { ...

} }

?

(27)

Chap.4,5,6

4.4.1

4.4.1 인터페이스인터페이스 기초기초

z

예제 : Thing.java

z

예제 : Valuable.java

1 public abstract class Thing { 2 public String name;

3

4 public Thing(String name) { 5 this.name = name;

1 interface Valuable { 2 public int value();

3 }

(28)

Chap.4,5,6

Class for OOP28

4.4.1

4.4.1 인터페이스인터페이스 기초기초

z

예제 : Watch.java

1 public class Watch extends Thing implements Valuable { 2

3 String brand;

4

5 Watch(String b) { 6 super("시계");

7 brand = b;

8 } 9

10 public int value() { 11 return 10000;

12 }

(29)

Chap.4,5,6

4.4.1

4.4.1 인터페이스인터페이스 기초기초

z

예제 : Trash.java

z

예제 : Shop.java

1 public class Trash extends Thing { 2 Trash() {

3 super("쓰레기");

8 public void sell(Valuable v, String goods) { 9 System.out.print(name +"에서 ");

10 System.out.print(v.value() + "원어치 ");

...

21 myshop.sell(money, "과자");

22 myshop.sell(watch, "음료수");

23 //myshop.sell(trash, "아이스크림"); // 컴파일 에러

(30)

Chap.4,5,6

Class for OOP30

4.4.1

4.4.1 인터페이스인터페이스 기초기초

z

인터페이스와 추상 클래스

†

추상 클래스는 클래스의 메소드와 멤버 필드의 일부분은 구현,

cf) 인터페이스는 전혀 구현되어 있지 않음

†

추상 클래스를 이용하는 경우에는 단일 상속만 지원

cf) 인터페이스는 다중 상속 (multiple inheritance)을 할 수 있음

†

인테페이스를 구현하기 위해서 implements라는 키워드를 사용

implements

인터페이스를 구현하는 것도 서브 타입(subtype)을 만드는 것임

(31)

Chap.4,5,6

4.4.1

4.4.1 인터페이스인터페이스 기초기초

예 )DrawableCircle

(32)

Chap.4,5,6

Class for OOP32

4.4.1

4.4.1 인터페이스인터페이스 기초기초

z

인터페이스 사용 예

(33)

Chap.4,5,6

예제 : Drawable.java

1 import java.awt.Graphics;

2

3 interface Drawable {

4 void paint(Graphics g);

5 }

z

예제 : DrawableCircle.java

1 import java.awt.*;

2

3 class DrawableCircle extends Circle implements Drawable { 4 protected int x, y;

……

16 public void paint(Graphics g) { 17 g.drawOval(x-r, y-r, 2*r, 2*r);

18 } 19 }

4.4.1

4.4.1 인터페이스인터페이스(interface)(interface)

(34)

Chap.4,5,6

Class for OOP34

4.4.1

4.4.1 인터페이스인터페이스(interface)(interface)

z

예제 : DrawApplet.java

1 import java.awt.*;

2 import java.applet.*;

3

4 public class DrawApplet extends Applet { 5 Drawable drawable[];

6

7 public void init() {

8 drawable = new Drawable[3];

9 drawable[0] = new DrawableCircle(45, 45, 30);

10 drawable[1] = new DrawableRectangle(25, 25, 40, 65);

11 drawable[2] = new DrawableCircle(90, 70, 60);

12 } 13

14 public void paint(Graphics g) { 15 int n = drawable.length;

16 for(int i=0; i< n; i++) { 17 drawable[i].paint(g);

18 }

………..

(35)

Chap.4,5,6

4.4.2

4.4.2 인터페이스인터페이스 특성특성

z

인터페이스 특성

† 인터페이스의 멤버필드는 디폴드로 static, final로 선언

 따라서 인터페이스의 멤버필드의 값을 변경하려는 시도는 컴파일 시에 에러를 발생

† 인터페이스 구현 – 서브타입

† 여러 개의 인터페이스를 구현하는 경우

 콤마를 이용해서 기술

† 인터페이스의 임플리멘츠도 상속과 같은 개념

 인터페이스를 임플리멘츠한 서브클래스는

인터페이스의 멤버필드를 상속 받아서 사용할 수 있다.

† 인터페이스의 상속

 extends 키워드 사용

interface ScaledDrawable extends Drawable{…..}

(36)

Chap.4,5,6

Class for OOP36

4.5 static

4.5 static과과 finalfinal의의 의미의미

z

final 클래스

† 그 클래스는 더 이상 상속을 통해서 재사용할 수 없음

 final 클래스를 상속받으려는 클래스는 컴파일 시에 에러가 발생

† 클래스 앞에 final 키워드 사용

public final class FinalClass{ …. }final

z

final 메소드

† final이 메소드에 선언된 경우, 오버라이딩이 불가능

† 메소드 앞에 final 키워드 사용

public final void print(){ …. }final

z

final 멤버필드

† 값을 변경할 수 없는 상수의 의미

† final 멤버필드는 값을 초기화만 할 수 있고, 새로이 값을 할당할 수는 없음

† 멤버필드 앞에 final 키워드 사용

public final int a = 10;final

(37)

Chap.4,5,6

4.5 static

4.5 static과과 finalfinal의의 의미의미

z

static 멤버필드

† 객체들간의 전역변수처럼 사용됨

† 클래스 이름으로 접근한다. (ex : Color.red)

† 멤버필드 앞에 static 키워드 사용

static

static int a = 3;

z

static 메소드

† 혹은 클래스 메소드라고도 함

† 인스턴스가 아닌 클래스 이름으로 메소드 호출

ex : Math.abs(-10);

† 메소드 앞에 static 키워드 사용

public final staticstatic void sayHello(String arg){ .… }

† 주의

 this, super를 사용할 수 없음

 static이 아닌 멤버필드는 접근할 수 없음

(38)

Chap.4,5,6

Class for OOP38

4.5 static

4.5 static과과 finalfinal의의 의미의미

z

static 초기화

† 클래스내에서 static 키워드를 이용해서 초기화 루틴을 사용할 수 있음

 static 초기화는 클래스가 초기화될 때 수행

 대표적인 static 초기화의 예는 네이티브 메소드에서 라이브러리를 로드 static {

System.loadLibrary("hello");

}

† 자바 클래스에서 멤버필드나 메소드의 위치는 크게 중요하지 않았음

 그러나 static 초기화에서는 변수의 위치는 중요

 뒤에 선언된 변수나 함수를 앞에서 레퍼런스해서 사용할 수 없음

예제 : BadStaticInitial.java

1 class BadStaticInitial { 2 static int i = j + 2;

3 static int j = 4;

4 }

(39)

Chap.4,5,6

5.3 5.3 내부내부 클래스클래스(Inner Class)(Inner Class)

z

내부 클래스

†

클래스내부에 정의된 클래스

†

외부 클래스의 멤버 필드와 메소드에 자유롭게 접근 가능

z

종류

†

내재된 (Nested) 톱레벨 클래스 / 인터페이스

클래스나 인터페이스가 static으로 선언된 경우

패키지의 멤버 – 다른 클래스에서 사용될 수 있음

†

멤버 클래스

클래스의 멤버로 정의됨

†

지역 클래스

메소드 내부에서 정의됨

†

무명 클래스

메소드 내부에서 정의됨

(40)

Chap.4,5,6

Class for OOP40 1 public class LinkedList {

2 protected Linkable head;

3

4 public LinkedList() { 5 head = null;

6 }

…………...

12 public interface Linkable { 13 public Linkable getNext();

14 } 15 }

z

내재된 (Nested) 톱레벨 클래스 / 인테페이스

† 다른 클래스에 포함되면서 클래스나 인테페이스가 static으로 선언된

경우

† 다른 톱레벨 클래스와 같이 패키지의 멤버이다.

 LinkedList 클래스에 내재된 인터페이스 Linkable이 있다면,

Linkable 인터페이스는 LinkedList.Linkable로 접근할 수 있다.

예제 : LinkedList.java

5.3.1

5.3.1 내재된내재된 톱레벨클래스톱레벨클래스//인터페이스인터페이스

(41)

Chap.4,5,6

5.3.1

5.3.1 내재된내재된 톱레벨톱레벨 클래스클래스//인터페이스인터페이스

z

예제 : LinkableNode.java

3 public class LinkableNode implements LinkedList.Linkable { 4 protected Object value;

5 protected LinkedList.Linkable next;

...

12 public LinkedList.Linkable next() { 13 return next;

14 } 15

16 public void next(LinkedList.Linkable node) { 17 next = node;

18 }

(42)

Chap.4,5,6

Class for OOP42

z

멤버 클래스

† 클래스의 멤버로 Inner 클래스가 선언된 경우이다.

† static으로 선언되지 않는다.

† 자신을 포함하는 클래스의 멤버 필드와 메소드들을 자유롭게 접근

예제 : DrawRecD.java

…..

5 public class DrawRecD extends Applet { 6 int startX, startY, w, h;

………….

21 public class MouseMotionHandler extends MouseMotionAdapter { 22 public void mouseDragged(MouseEvent e) {

23 w = Math.abs(startX - e.getX());

24 h = Math.abs(startY - e.getY());

25 repaint();

26 } 27 }

……….

5.3.2

5.3.2 멤버멤버 클래스클래스

(43)

Chap.4,5,6

z

멤버 클래스

† 클래스의 멤버로 내부 클래스가 선언된 경우

z

예제 : DiscountShop.java

5.3.2

5.3.2 멤버멤버 클래스클래스

1 public class DiscountShop extends Shop {

6 class Coupon implements Valuable { 7 String label;

8 Coupon() {

9 label = name + "상품권";

10 } 11

12 public int value() { 13 return 10000;

(44)

Chap.4,5,6

Class for OOP44

5.3.2

5.3.2 멤버멤버 클래스클래스

z

예제 : ABC.java

1 public class ABC {

2 public String msg = "A";

3 public void print() { 4 BC bc = new BC();

5 bc.print();

6 } 7

8 public class BC {

9 public String msg = "B";

10 public void print() { 11 C c = new C();

12 c.print();

(45)

Chap.4,5,6

5.3.2

5.3.2 멤버멤버 클래스클래스

z

예제 : ABC.java(계속)

15 public class C {

16 public String msg = "C";

17 public void print() {

18 System.out.println(msg); // "C"

19 System.out.println(this.msg); // "C"

20 System.out.println(C.this.msg); // "C"

21 System.out.println(BC.this.msg); // "B"

22 System.out.println(ABC.this.msg); // "A"

23 }

(46)

Chap.4,5,6

Class for OOP46

5.3.3

5.3.3 지역지역 클래스클래스

z

지역 클래스

† 자바 코드의 블락({… }) 안에서 정의된 Inner 클래스

† 지역 변수의 특성과 유사하다.

† 멤버 클래스는 아니지만, 포함하는 클래스의 멤버 필드와 메소드를 접근

예제 : SomeApplication.java

4 public class SomeApplication extends Frame {……..

5 public static final int EXIT = 0;

…..

23 MenuItem createMenuItem(String label, char shortcut, final int command) {

24 MenuItem item = new MenuItem(label, new MenuShortcut(shortcut));

25

26 class MenuItemHandler implements ActionListener { 27 public void actionPerformed(ActionEvent e) {

28 doCommand(command);

29 } 30 } 31

32 item.addActionListener(new MenuItemHandler());

33 return item;

34 }

………….

(47)

Chap.4,5,6

5.3.3

5.3.3 지역지역 클래스클래스

z

지역 클래스

†

메소드 내부에 정의된 클래스

z

예제 : DiscountShop2.java

1 public class DiscountShop2 extends Shop { ...

6 public void sales(final int value, String goods) { 7

8 class ValuableThing implements Valuable { 9 public int value() {

10 return value;

11 } 12 }

14 sell(new ValuableThing(), goods);

(48)

Chap.4,5,6

Class for OOP48

5.3.4

5.3.4 무명무명 클래스클래스

z

무명 클래스

† 지역클래스의 개념을 확장

† 클래스 정의와 사용의 2단계를 1단계로 결합

† 이름을 갖지 않고 한번만 사용

예제 : DrawRecD2.java

…….

8 public void init() {

9 addMouseListener(new MouseAdapter() { 10 public void mousePressed(MouseEvent e) { 11 startX = e.getX();

12 startY = e.getY();

13 } 14

15 public void mouseReleased(MouseEvent e) { 16 w = Math.abs(startX - e.getX());

17 h = Math.abs(startY - e.getY());

18 repaint();

19 } 20 } );

(49)

Chap.4,5,6

5.3.4

5.3.4 무명무명 클래스클래스

z

무명 클래스

†

메소드 내부에서 정의됨

z

예제 : DiscountShop3.java

1 public class DiscountShop3 extends Shop { ...

6 public void sales(final int value, String goods) { 7

8 sell(new Valuable() { 9 public int value() { 10 return value;

11 }

12 }, goods);

(50)

Chap.4,5,6

Class for OOP50

5.4 5.4 자바에서자바에서 중요한중요한 클래스클래스

5.4.1 Object 클래스

†

모든 자바 클래스의 슈퍼 클래스

†

“extends Object”를 쓰지 않아도 자동적으로 상속

†

Object 클래스들의 메소드

protected Object clone()

z 객체를 복사하는데 사용된다.

public boolean equals(Object obj)

z 두 객체의 내용이 동일한지 알아볼 때 사용되는 메소드

public int hashCode()

z 객체를 위한 해쉬코드를 리턴

z 해쉬코드는 자바 시스템에서 객체를 유일하게 식별하는 정수 값

(51)

Chap.4,5,6

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

5.4.2 데이터 타입 클래스

(52)

Chap.4,5,6

Class for OOP52

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

z

Boolean 클래스

†

Boolean 클래스는 boolean 기본 타입을 표현하기 위한 클래스

†

Boolean(boolean value), Boolean(String s) 두 형태의 생성자를 가짐

†

두 번째 생성자의 아규먼트 s는

"true" 문자열과 동일하면 true 값을 갖고, 다른 경우에는 false 값을 갖는다.

†

Boolean 클래스로부터 기본 타입 boolean 값을 얻기 위해서는

booleanValue() 메소드를 이용

(53)

Chap.4,5,6

z

Byte 클래스

† byte 기본 자료 타입을 표현하기 위해 JDK 1.1 이후에 제공되는 클래스

† Byte(byte value), Byte(String s) 두 형태의 생성자를 갖는다

† 두 번째 생성자의 아규먼트는 문자열을 10진수의 바이트값로 변환하면서

문자열의 포맷이 틀린 경우에는 NumberFormatException 예외가 발생

† 메소드

 public static byte parseByte(String s)

z 문자열을 byte 값으로 변환하는 메소드

 public static byte parseByte(String s, int radix)

z 문자열을 radix에 따라 10진수, 2진수 등의 byte 값으로 변 환 하 는 메소드

 public byte byteValue()

z 10 진수 byte 값을 리턴하는 메소드

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

(54)

Chap.4,5,6

Class for OOP54

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

z

Character 클래스

†

Character(char value) 형태의 생성자를 이용해서 char 기본 타입을 나타내기 위한 클래스로 사용

†

메소드

 public char charValue()

 public static boolean isLowerCase(char ch)

 public static boolean isUpperCase(char ch)

 public static boolean isDigit(char ch)

 public static boolean isLetter(char ch)

 public static boolean isLetterOrDigit(char ch)

 public static char toLowerCase(char ch)

 public static char toUpperCase(char ch)

 public static boolean isWhitespace(char ch)

(55)

Chap.4,5,6

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

z

Double 클래스

† Double 클래스는 double 기본 자료형을 클래스로 표현하기 위해 만들어진

클래스로 Double(double value), Double(String s) 두 형태의 생성자

† 멤버필드

public static final double MAX_VALUE - double 형이 갖을 수 있는 최대 값 public static final double MIN_VALUE - double 형이 갖을 수 있는 최소 값 public static final double NaN - double 형에서 숫자가 아님을 표현하기 위해

사용되는 값

public static final double NEGATIVE_INFINITY - double 형의 음의 무한대 값 public static final double POSITIVE_INFINITY - double 형의 양의 무한대 값

† 메소드

public static boolean isNaN(double v) - double 형이 의미 있는 숫자가

아닌지 여부를 알아보는 메소드

public static boolean isInfinite(double v)

public boolean isNaN() - 의미 있는 숫자가 아닌지 여부를 알아보는 메소드

(56)

Chap.4,5,6

Class for OOP56

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

†

Double 클래스의 값을 각 기본 자료형의 값으로 변경하는데 사용되는 메소드

public byte byteValue() public short shortValue()

public int intValue() public long longValue() public float floatValue() public double doubleValue()

(57)

Chap.4,5,6

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

z

Float 클래스

†

float 기본 자료형을 클래스로 표현하기 위해 사용되는 클래스

†

생성자

public Float(float value) public Float(double value) public Float(String s)

†

멤버필드

public static final float MAX_VALUE public static final float MIN_VALUE public static final float NaN

public static final float NEGATIVE_INFINITY public static final float POSITIVE_INFINITY

(58)

Chap.4,5,6

Class for OOP58

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

†

메소드

public static boolean isNaN(float v) public static boolean isInfinite(float v) public boolean isNaN()

†

Float 클래스의 값을 각 기본 자료 형의 값으로 변환하는 메소드 public byte byteValue()

public short shortValue()

public int intValue()

public long longValue()

public float floatValue()

public double doubleValue()

(59)

Chap.4,5,6

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

z

Integer 클래스

† int 기본 자료형을 표현하기 위한 클래스

† Integer 클래스는 Integer(int value), Integer(String s) 두개의 생성자

† 멤버필드

public static final int MAX_VALUE public static final int MIN_VALUE

† 메소드

public static int parseInt(String s) - 문자열을 10진수의 정수로 변환 public static int parseInt(String s, int radix)

- 문자열을 radix로 기술한 진법의 정수로 변환 public byte byteValue()

public short shortValue() public int intValue() public long longValue() public float floatValue() public double doubleValue()

(60)

Chap.4,5,6

Class for OOP60

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

z

Short 클래스

† short 기본 자료형을 표현하기 위한 클래스

† Short 클래스는 Short(short value), Short(String s) 두개의 생성자

† 멤버필드

public static final short MAX_VALUE public static final short MIN_VALUE

† 메소드

public static int parseShort(String s)

public static int parseShort(String s, int radix) public byte byteValue()

public short shortValue() public int intValue() public long longValue() public float floatValue() public double doubleValue()

(61)

Chap.4,5,6

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

z

Math 클래스

†

수학 함수와 이에 필요한 상수들로 구성

†

Math 클래스의 모든 메소드들은 static으로 정의되어 있기 때문에 프로그램 내에서 Math 클래스의 인스턴스를 만들지 않고

Math.

method_name()

형태로 메소드를 호출해서 사용할 수 있다.

†

멤버필드

public static final double E - 2.7182...

public static final double PI - 3.14159...

(62)

Chap.4,5,6

Class for OOP62

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

† 멤버필드

public static type abs(type value) - 아규먼트 value 의 절대값을 리턴한다.

public static type max(type a, type b) - a 와 b 중에서 큰 값을 리턴한다.

public static type min(type a, type b) - a 와 b 중에서 작은 값을 리턴한다.

public static double log(double a) - 자연 로그 lna 값을 리턴한다.

public static double pow(double a, double b) - ab 값을 리턴한다.

public static double sin(double a) - sin(a) 값 을 리 턴 한 다 . a 는 라디안 값이다.

public static double sqrt(double a) - a의 제곱근 값을 리턴한다.

public static double random() - 0.0 ~ 1.0 사 이 의 임 의 의 값 을 리턴한다.

(63)

Chap.4,5,6

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

예제 : MathDemo.java

1 public class MathDemo {

2 public static void main(String args[]) { 3 int a, b;

4 if(args.length == 0) { 5 a = 2;

6 b = 3;

7 } else {

8 a = Integer.parseInt(args[0]);

9 b = Integer.parseInt(args[1]);

10 }

11 System.out.println("pow("+a + ", "+b+") =>" + Math.pow(a,b));

12 } 13 }

z

결과

% java MathDemo 4 5 pow(4, 5) =>1024.0

(64)

Chap.4,5,6

Class for OOP64

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

z

String 클래스

† 문자열을 나타내기 위해 사용

† 생성자

public String()

public String(String value) public String(char[] value)

public String(char[] value, int offset, int count) public String(bytes[] value)

(65)

Chap.4,5,6

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

† 메소드

public char charAt(int index)

public boolean endsWith(String suffix) public int indexOf(char ch)

public int lastIndexOf(char ch) public int length(char ch)

public String replace(char old, char new) public String substring(int beginIndex)

public String substring(int beginIndex, int endIndex) public String toLowerCase()

public String toUpperCase() public String trim()

(66)

Chap.4,5,6

Class for OOP66

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

예제 : StringDemo.java

1 public class StringDemo {

2 public static void main(String args[]) { 3 String msg = "How are you ?";

4 String greeting = new String(msg);

5

6 if(msg == greeting) {

7 System.out.println("msg == greeting");

8 }else if(msg.equals(greeting)) {

9 System.out.println("msg equals greeting");

10 }

11 System.out.println("original msg: " + msg);

12 msg = msg.replace(' ','');

13 System.out.println("changed msg: " + msg);

14 } 15 }

(67)

Chap.4,5,6

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

z

Vector 클래스

†

Vector는 크기가 동적인 배열로 볼 수 있다.

†

java.util 패키지에 속해 있다.

†

생성자

public Vector()

- 빈 벡터를 생성한다.

public Vector(int initialCapacity)

- 초기 벡터의 크기를 initialCapacity로 만든다.

public Vector(int initialCapacity, int capacityIncrement) - 초기 벡터의 크기를 initialCapacity로 만들고,

부족할 때마다 capacityIncrement 만큼씩 벡터

크기가 증가

(68)

Chap.4,5,6

Class for OOP68

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

†

메소드

public void add(int index, Object element)

- element를 index 위치에 추가 public void addElement(Object element)

- element를 맨끝 위치에 추가 public void remove(int index)

- index 위치의 element를 삭제 public void removeElement(Object element)

- 벡터에서 처음 매칭되는 element를 삭제 public Object elementAt(int index)

- index 번째의 element를 리턴 public int size()

- 현재 벡터에 있는 element의 개수를 리턴

(69)

Chap.4,5,6

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

z

예제 : VectorDemo.java

1 import java.util.*;

2

3 public class VectorDemo {

4 public static void main(String args[]) { 5 Vector vector = new Vector(2,2);

6 String str = "hello";

7 char c = 'c';

8 char carray[] = {'h', 'e', 'l', 'l', 'o’};

9 int i = 10;

10

11 vector.addElement(str);

12 vector.addElement(new Character(c));

13 vector.addElement(carray);

14 vector.addElement(new Integer(i));

15

16 print(vector);

17 }

…...

(70)

Chap.4,5,6

Class for OOP70

public StringTokenizer(String str) - 문자열 str을 기본적인 구별자 ("")만을 이용해서 토큰을 구별하기 위한 생성자

public StringTokenizer(String str, String delim) - 문자열 str을 구별자(delim)를 이용해서 토큰을 구별하기 위한 생성자

public StringTokenizer(String str, String delim, boolean returnToken) - 문자열 str을 구별자(delim)를 이용해서 토큰을 구별하고, 구별자를 토큰과 마찬가지고 nextToken() 메소드에서 리턴할 것인지 여부를 returnToken 값으로 기술하는 생성자

z

StringTokenizer 클래스

† 문자열을 개별적인 토큰으로 분리하는 방법을 제공

† 생성자

5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스

public boolean hasMoreTokens() - 토큰이 더이상 있는지 여부를 알아본다.

public String nextToken() - 다음 토큰을 리턴 public String nextToken(String delim)

- 새로운 구별자(delim)를 이용해서 다음 토큰을 리턴 public int countTokens() - 토큰의 개수를 리턴

† 메소드

(71)

Chap.4,5,6

5.4 5.4 자바에서자바에서 중요한중요한 클래스클래스

예제 : StringToken.java

1 import java.util.*;

2

3 public class StringToken {

4 public static void main(String args[]) { 5 String url;

6 if(args.length == 0)

7 url = "http://mycom.soongsil.ac.kr/~jmchoi/";

8 else

9 url = args[0];

10 StringTokenizer st = new StringTokenizer(url, ":/.~", false);

11 while(st.hasMoreTokens()) {

12 String token = st.nextToken();

13 System.out.println("token => " + token);

…………..

(72)

Chap.4,5,6

Class for OOP72

6.1 6.1 자바의자바의 예외예외 처리처리

z

실세계의 예외 처리

박과장

void a( ) throws Exception {

}

김대리

돌발 상황 발생 void b( ) throws Exception { 김대리.a( );

...

}

이부장

void c( ) { try {

박과장.b( );

...

} catch (Exception e){

...

} }

작업 중단

1 2 3

작업 중단 작업 중단

(73)

Chap.4,5,6

6.1 6.1 자바의자바의 예외예외 처리처리

z

예외처리

†

간단한 에러(예외)가 발생하였을 때,

이 오류를 바로 잡아서 계속 수행할 수 있도록 오류를 처리

†

예외 혹은 예외상황 - 심각하지 않은 에러

z

C 언어에서 예외처리

†

방법

보통 시그날 처리 루틴이나, 함수의 리턴 값으로

일반 함수나 시스템 콜은 음수 값을 혹은 0을 리턴

필요할 경우 errno에 값을 할당해서 에러의 타입을 알리기도 함

(74)

Chap.4,5,6

Class for OOP74

6.1 6.1 자바의자바의 예외예외 처리처리

z 자바에서 예외처리

† 처리과정

1. 예외 (Exception) 클래스를 정의

2. 예외가 발생할 수 있는 함수 a()에서 예외가 발생할 조건을 만족하면, Exception 클래스를 throw

z “throw new 예외클래스생성자()” 문장을 사용

3. a ( ) 함수를 호출하는 곳에서는 try-catch 문장을 이용해서 예외가 발생하는 경우에 문제점을 해결

z 예외 클래스 종류

† 자바에서 예외(Exception)는 클래스로 표현

 모든 예외 타입 (exception type)은 Throwable 클래스나 이것의 서브클래스로부터 상속

† checked exception

 메소드가 선언한 예외를 throw하는 지를 컴파일러가 체크

 try-catch문을 사용해야 한다.

† unchecked exception

 RuntimeException이나 Error로부터 상속받는 표준 런타임 예외와 에러

 try-catch문을 사용하지 않아도 컴파일 시에 에러가 발생하지 않음

† 예외타입은 클래스이기 때문에 생성자, 멤버 필드, 메소드 등을 가질 수 있다.

(75)

Chap.4,5,6

6.1 6.1 자바의자바의 예외예외 처리처리

z

throws

† checked exception을 메소드 이름 뒤에 선언

public int doSomething(int x) throws Exception1, Exception2 {

……

}

z

throw

† 예외는 throw문장을 이용해서 발생시킨다

 throw new Exception1();

 throws를 혼동하기 쉬움

z

try-catch-finally

† 예외가 발생할 수 있는 문장들을 try문 블락에 기술한다.

† 수행도중에 예외가 발생하면 catch 문으로 제어가 넘어 간다.

† catch 문은 여러 개가 존재할 수 있다.

† finally문은 예외 발생 여부에 관계없이 항상 수행된다.

(76)

Chap.4,5,6

Class for OOP76

6.1 6.1 자바의자바의 예외예외 처리처리

1. 예외가 발생될 가능성이 있는 method을 판단한다.

2. 발생될 예외를 처리할 Class를 정의한다.

Class BoE exception Exception { }

3. Try-and-Catch

위의 예외가 발생할 부분에 Try-and-Catch를 선언한다 예 try {

} catch (BoE) { . . . } 4. Throws

예외가 발생 할 가능성이 있는 method에 대하여 위에서 정의한 Class 에 대한 예외를 선언한다.

예 method_name () throws BoE { . . . }

5. Throw

예외가 발생될 메소드 내에서 예외 발생 조건을 check하여, 예외가 발생되면 해당 예외 Class를 실행한다

throw new BoE();

(77)

Chap.4,5,6

예외처리예외처리

z

JDK에서 제공되는 예외

†

Exception 클래스 상속 관계

(78)

Chap.4,5,6

Class for OOP78

6.1 6.1 자바의자바의 예외예외 처리처리

z

예외 관련 클래스들

†

Checked Exception

†

Unchecked Exception

(79)

Chap.4,5,6

6.1 6.1 자바의자바의 예외예외 처리처리

1.

예외 클래스 만들기

z Exception 클래스를 상속받아야 한다.

1 public class BalanceOutOfBoundsException extends Exception { 2 public BalanceOutOfBoundsException() {

3 super("잔액을 초과하였습니다.");

4 } 5 }

1 public class MalformedData extends RuntimeException { 2 public MalformedData() {

3 super("데이터 포맷이 잘못되었습니다.");

4 } 5 }

(80)

Chap.4,5,6

Class for OOP80

6.1 6.1 자바의자바의 예외예외 처리처리

2. 예외가 발생할 수 있는 메소드 정의하기

1 public class Account { 2 private long balance;

3 private String name;

4

5 public Account(String name) { 6 this.name = name;

7 } 8

9 public void deposit(int amount) throws MalformedData { 10 if(amount <= 0) {

11 throw new MalformedData();

12 }

13 balance = balance + amount;

14 } 15

16 public void withdraw(int amount)

17 throws BalanceOutOfBoundsException, MalformedData { 18 if(amount <= 0) {

19 throw new MalformedData();

20 } 21

22 if( balance < amount) {

23 throw new BalanceOutOfBoundsException();

24 } 25 }

(81)

Chap.4,5,6

6.1 6.1 자바의자바의 예외예외 처리처리

3. try-catch로 예외 잡기

3 Account hong = new Account("홍길동");

4 hong.deposit(10000);

5 // hong.deposit(-100); // MalformedData 예외 발생 6 try {

7 hong.withdraw(5000);

8 // hong.withdraw(-50); // MalformedData 예외 발생 9 } catch (BalanceOutOfBoundsException be) {

10 be.printStackTrace();

11 } catch (MalformedData me) { 12 me.printStackTrace();

13 }

14 hong.check();

(82)

Chap.4,5,6

Class for OOP82

예외처리예외처리

z

JDK에서 제공되는 예외 클래스들의 예

†

ArithmeticException

0으로 나누는 경우에 주로 발생하는 예외 상황

ArithmeticException 은 RuntimeException 으 로 부 터 상 속 받 은 예외 클래스

†

ArrayIndexOutofBoundsException

배열의 크기보다 큰 원소를 접근하려고 할 때 발생되는 예외

†

NegativeArraySizeException

배열의 크기가 음수로 된 경우에 발생하는 예외

†

NullPointerException

생성되지 않은 객체를 이용해서 객체의 멤버를 접근하는 경우에

발생하는 예외

참조

관련 문서

첫째, 일선 행정기관의 정책조정과 정부혁신을 주도할 중앙관리기관을 정예화 한다. 첫째, 일선 행정기관의 정책조정과 정부혁신을 주도할 중앙관리기관을 정예화

double BuoyancyDisplacementCondition(); // 부력-중량 평형 조건을 계산하는 함수 double CCRequirementCondition(); // 화물창 요구 조건을 계산하는 함수

double BuoyancyDisplacementCondition(); // 부력-중량 평형 조건을 계산하는 함수 double CCRequirementCondition(); // 화물창 요구 조건을 계산하는 함수

bool SetDataForCpVar(double _D_Cb, double _LCBDelta, double

(a) Bottom emission structure (b) Double-sided emission structure. (d) Top emission structure - II (c) Top emission

™ Visualize the buckling analysis results by listing critical factors and plotting buckling modes. critical factors and

Double sided solid GND plane universal PCB (contd.).  Make

- 원가보상주의의 원칙을 법제화하는 경향을 보이고 있음 - 원가보상주의의 원칙을 법제화하는 경향을 보이고 있음.. 우리나라 공기업의