프로그래머를
프로그래머를 위한 위한 Java 2, 4 Java 2, 4 판 판
제 제 4 4 장 장 객체지향 객체지향 프로그래밍 프로그래밍 II II
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++
Chap.4,5,6
4.1.1
4.1.1 상속상속
z
사원과 관리자의 예
Employee 클래스
멤버 필드: 이름, 사번, 직책, 월급
메소드: 일하다
Manager 클래스
멤버 필드: 이름, 사번, 직책, 월급, 부서
메소드: 일하다
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 키워드 사용
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 }
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 }
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 }
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()는 생성자의 맨 처음 부분에 위치
자식 클래스의 생성자는 슈퍼클래스의 생성자를 호출해야 한다.
슈퍼클래스의 생성자를 호출하지 않는 경우에는 내부에서 자동적으로
슈퍼클래스의 디폴트 생성자가 호출
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 + "...");
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 상속상속, , 오버라이딩오버라이딩, , 우버쉐도우우버쉐도우
Chap.4,5,6
4.1.4
4.1.4 상속상속, , 오버라이딩오버라이딩, , 우버쉐도우우버쉐도우
z
메모리 구조
A
AAa 10 b()
a 20 c()
void b() { ..("A") }
void b() { ..("AA") }
void c() { ..("C") }
z
Chap.4,5,6
Class for OOP12
4.1.4
4.1.4 상속상속, , 오버라이딩오버라이딩, , 우버쉐도우우버쉐도우
z
예제 : XYZ.java
msg 출력
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();
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;
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
Chap.4,5,6
Class for OOP16
4.1.4
4.1.4 상속상속, , 오버라이딩오버라이딩, , 오버쉐도우오버쉐도우
z
오버라이딩 (overriding)
주의 사항
가시성은 커지는 방향으로
예외 throws 문제
리턴 타입이 다른 경우
z
오버쉐도우 (overshadow)
동일한 이름의 멤버 필드가 슈퍼클래스와 서브클래스에 있을 때
오버쉐도우된 멤버 필드는 super 레퍼런스를 이용하거나, 서브
클래스를 슈퍼클래스로 형 변환해서 접근할 수 있다 .
Chap.4,5,6
PolyMorphism PolyMorphism
z
Poly : 많다는 뜻의 접두어
z
Morphism : 형태라는 뜻
z
Polymorphism : 형태가 많다는 뜻
의미(Semantics)는 하나지만 실제 형태는 여러가지가 될 수 있음.
예) 밥을 먹다: 누가 밥을 먹는 가에 다양한 형태가 존재
객체지향 프로그래밍에서 polymorphism의 지원 형태
Overloading
Overriding
Chap.4,5,6
Class for OOP18
4.2.1
4.2.1 클래스에서클래스에서 형변환형변환
z
슈퍼 타입과 슈퍼 클래스
슈퍼 타입 ≒ 슈퍼 클래스
같은 개념은 아니지만, 자바/C++ 등의 언어에서는 같다고 보아도 무방함
z
예
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, 실행 시 에러
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"; }
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)
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)
Chap.4,5,6
z
예제 : ShapeUser.java
1 class ShapeUser { 23 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)
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 ) ;
}
Chap.4,5,6
4.4.1
4.4.1 인터페이스인터페이스 기초기초
z
interface가 필요한 이유
가정
어떤 가계는 물건을 팔 때 돈 이외 경제적 가치가 있는 것을 받는다.
Shop 클래스의 sell() 메소드는 경제적 가치가 있는 것을 모두 매개 변수로 받는다.
문제점 : sell() 메소드의 매개 변수 타입
Money 타입인 경우 – 다른 경제적 가치가 있는 것은 못 받는다.
Thing 타입인 경우 – 경제적 가치가 없는 것도 받을 수 있다.
해결책
C++ - 다중 상속 사용
자바 - ???
z interface라는 개념 도입
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) { ...
} }
?
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 }
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 }
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, "아이스크림"); // 컴파일 에러
Chap.4,5,6
Class for OOP30
4.4.1
4.4.1 인터페이스인터페이스 기초기초
z
인터페이스와 추상 클래스
추상 클래스는 클래스의 메소드와 멤버 필드의 일부분은 구현,
cf) 인터페이스는 전혀 구현되어 있지 않음
추상 클래스를 이용하는 경우에는 단일 상속만 지원
cf) 인터페이스는 다중 상속 (multiple inheritance)을 할 수 있음
인테페이스를 구현하기 위해서 implements라는 키워드를 사용
implements인터페이스를 구현하는 것도 서브 타입(subtype)을 만드는 것임
Chap.4,5,6
4.4.1
4.4.1 인터페이스인터페이스 기초기초
예 )DrawableCircle
Chap.4,5,6
Class for OOP32
4.4.1
4.4.1 인터페이스인터페이스 기초기초
z
인터페이스 사용 예
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)
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 }
………..
Chap.4,5,6
4.4.2
4.4.2 인터페이스인터페이스 특성특성
z
인터페이스 특성
인터페이스의 멤버필드는 디폴드로 static, final로 선언
따라서 인터페이스의 멤버필드의 값을 변경하려는 시도는 컴파일 시에 에러를 발생
인터페이스 구현 – 서브타입
여러 개의 인터페이스를 구현하는 경우
콤마를 이용해서 기술
인터페이스의 임플리멘츠도 상속과 같은 개념
인터페이스를 임플리멘츠한 서브클래스는
인터페이스의 멤버필드를 상속 받아서 사용할 수 있다.
인터페이스의 상속
extends 키워드 사용
interface ScaledDrawable extends Drawable{…..}
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
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이 아닌 멤버필드는 접근할 수 없음
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 }
Chap.4,5,6
5.3 5.3 내부내부 클래스클래스(Inner Class)(Inner Class)
z
내부 클래스
클래스내부에 정의된 클래스
외부 클래스의 멤버 필드와 메소드에 자유롭게 접근 가능
z종류
내재된 (Nested) 톱레벨 클래스 / 인터페이스
클래스나 인터페이스가 static으로 선언된 경우
패키지의 멤버 – 다른 클래스에서 사용될 수 있음
멤버 클래스
클래스의 멤버로 정의됨
지역 클래스
메소드 내부에서 정의됨
무명 클래스
메소드 내부에서 정의됨
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 내재된내재된 톱레벨클래스톱레벨클래스//인터페이스인터페이스
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 }
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 멤버멤버 클래스클래스
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;
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();
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 }
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 }
………….
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);
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 } );
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);
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 해쉬코드는 자바 시스템에서 객체를 유일하게 식별하는 정수 값
Chap.4,5,6
5.45.4.. 자바에서자바에서 중요한중요한 클래스클래스
5.4.2 데이터 타입 클래스
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() 메소드를 이용
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.. 자바에서자바에서 중요한중요한 클래스클래스
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)
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() - 의미 있는 숫자가 아닌지 여부를 알아보는 메소드
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()
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
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()
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()
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()
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...
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 사 이 의 임 의 의 값 을 리턴한다.
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
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)
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()
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 }
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 만큼씩 벡터
크기가 증가
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의 개수를 리턴
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 }
…...
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() - 토큰의 개수를 리턴
메소드
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);
…………..
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
작업 중단 작업 중단
Chap.4,5,6
6.1 6.1 자바의자바의 예외예외 처리처리
z
예외처리
간단한 에러(예외)가 발생하였을 때,
이 오류를 바로 잡아서 계속 수행할 수 있도록 오류를 처리
예외 혹은 예외상황 - 심각하지 않은 에러
z
C 언어에서 예외처리
방법
보통 시그날 처리 루틴이나, 함수의 리턴 값으로
일반 함수나 시스템 콜은 음수 값을 혹은 0을 리턴
필요할 경우 errno에 값을 할당해서 에러의 타입을 알리기도 함
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문을 사용하지 않아도 컴파일 시에 에러가 발생하지 않음
예외타입은 클래스이기 때문에 생성자, 멤버 필드, 메소드 등을 가질 수 있다.
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문은 예외 발생 여부에 관계없이 항상 수행된다.
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();
Chap.4,5,6
예외처리예외처리
z
JDK에서 제공되는 예외
Exception 클래스 상속 관계
Chap.4,5,6
Class for OOP78
6.1 6.1 자바의자바의 예외예외 처리처리
z
예외 관련 클래스들
Checked Exception
Unchecked Exception
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 }
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 }
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();
Chap.4,5,6
Class for OOP82
예외처리예외처리
z
JDK에서 제공되는 예외 클래스들의 예
ArithmeticException
0으로 나누는 경우에 주로 발생하는 예외 상황
ArithmeticException 은 RuntimeException 으 로 부 터 상 속 받 은 예외 클래스
ArrayIndexOutofBoundsException
배열의 크기보다 큰 원소를 접근하려고 할 때 발생되는 예외
NegativeArraySizeException
배열의 크기가 음수로 된 경우에 발생하는 예외
NullPointerException
생성되지 않은 객체를 이용해서 객체의 멤버를 접근하는 경우에
발생하는 예외