프로그래머를위한 Java 2, 4 판 제4장객체지향프로그래밍 II
4.1.1 상속 상속 기존에있는클래스를바탕으로다른특성을추가해새로운클래스를생성 서브클래스 (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++ Class for OOP 2
4.1.1 상속 사원과관리자의예 Employee 클래스 멤버필드 : 이름, 사번, 직책, 월급 메소드 : 일하다 Manager 클래스 멤버필드 : 이름, 사번, 직책, 월급, 부서 메소드 : 일하다 Class for OOP 3
4.1.1 상속 Employee 와 Manager 의관계 is-a 관계 A manager is an employee. 상속관계 Employee : 슈퍼클래스, 부모클래스 Manager : 서브클래스, 자식클래스 자바에서상속 extends 키워드사용 Class for OOP 4
4.1.1 상속 예제 : 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 } Class for OOP 5
4.1.1 상속 예제 : 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 } Class for OOP 6
4.1.1 상속 예제 : 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 } Class for OOP 7
4.1.2 super 와 super() super super는슈퍼클래스를지칭하는레퍼런스로사용 상위클래스의멤버필드나메소드를지칭할때사용 super() super.attribute super.method() static으로선언된메소드에서는사용될수없다. super() 는슈퍼클래스의생성자를호출 super() 는생성자의맨처음부분에위치 자식클래스의생성자는슈퍼클래스의생성자를호출해야한다. 슈퍼클래스의생성자를호출하지않는경우에는내부에서자동적으로슈퍼클래스의디폴트생성자가호출 Class for OOP 8
4.1.3 오버라이딩 오버라이딩 (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 + "..."); Class for OOP 9
예제 : A.java 4.1.4 상속, 오버라이딩, 우버쉐도우 2 int a = 10; 4 void b() { 5 System.out.println("A"); 예제 : 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"); Class for OOP 10
메모리구조 4.1.4 상속, 오버라이딩, 우버쉐도우 A z b() AA void b() {..("A") } a 10 c() a 20 void b() {..("AA") } void c() {..("C") } Class for OOP 11
4.1.4 상속, 오버라이딩, 우버쉐도우 예제 : XYZ.java msg 출력 Class for OOP 12
4.1.4 상속, 오버라이딩, 우버쉐도우 예제 : 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(); Class for OOP 13
4.1.4 상속, 오버라이딩, 우버쉐도우 예제 : 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; Class for OOP 14
4.1.4 상속, 오버라이딩, 우버쉐도우 결과 : 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 Class for OOP 15
4.1.4 상속, 오버라이딩, 오버쉐도우 오버라이딩 (overriding) 주의사항 가시성은커지는방향으로 예외 throws 문제 리턴타입이다른경우 오버쉐도우 (overshadow) 동일한이름의멤버필드가슈퍼클래스와서브클래스에있을때 오버쉐도우된멤버필드는 super 레퍼런스를이용하거나, 서브클래스를슈퍼클래스로형변환해서접근할수있다. Class for OOP 16
PolyMorphism Poly : 많다는뜻의접두어 Morphism : 형태라는뜻 Polymorphism : 형태가많다는뜻 의미 (Semantics) 는하나지만실제형태는여러가지가될수있음. 예 ) 밥을먹다 : 누가밥을먹는가에다양한형태가존재 객체지향프로그래밍에서 polymorphism 의지원형태 Overloading Overriding Class for OOP 17
4.2.1 클래스에서형변환 슈퍼타입과슈퍼클래스 슈퍼타입 슈퍼클래스 같은개념은아니지만, 자바 /C++ 등의언어에서는같다고보아도무방함 예 Class for OOP 18
4.2.1 클래스에서형변환 예제 : 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, 실행시에러 Class for OOP 19
4.2.2 static 메소드숨김 static 메소드숨김 부모클래스에서정의한 static 메소드를자식클래스에서다시정의하는경우 부모클래스의메소드는숨겨져서보이지않음 자식클래스를부모클래스로타입변경하면, 부모클래스의메소드를사용할수있음 예 : 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"; } Class for OOP 20
4.3 추상클래스 (abstract class) 추상클래스 (abstract class) 특성이구체적으로구현되지않는클래스 new 를이용해서생성할수없다 abstract 키워드사용 추상메소드 메소드의인터페이스만정의되어있는메소드 메소드의리턴타입부분앞에 abstract 라는키워드를기술 메소드의헤더만정의하고, 바디가없는메소드 추상메소드형태 visibilty_type abstract return_type function_name (argumet_list) ; 추상메소드는함수의몸체를가지지않는다. 추상메소드를가지는모든클래스를추상클래스라고한다. 추상클래스는클래스선언시에 abstract 라는키워드를 추상클래스로부터상속받는경우에서브클래스는추상메소드를구현 (implement) 해야한다. Class for OOP 21
4.3 추상클래스 (abstract class) 예제 : 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; 3 4 public Circle() { 5 r = 0; 6 } 7.. 11 12 public double circumference() { 13 return Math.PI*2*r; 14 } 15 16 public double area() { 17 return Math.PI*r*r; 18 }. Class for OOP 22
4.3 추상클래스 (abstract class) 예제 : 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());... 결과 % java ShapeUser shape[0]'s area = 78.53981633974483 shape[1]'s area = 153.93804002589985 shape[2]'s area = 45.0 Class for OOP 23
4.4 인터페이스 인터페이스 자바에서서브타입을지원하기위해서만든개념 모든메소드가헤더만갖고있고, 바디는없음 형태 [ interfacemodifier ] interface name [ extends name ] { [ interfacefieldmodifier ] type name; [ interfacemethodmodifier ] returntype name ( argumentlist ) ; } 인터페이스를구현하는클래스는 implements 키워드사용 Class for OOP 24
4.4.1 인터페이스기초 interface 가필요한이유 가정 어떤가계는물건을팔때돈이외경제적가치가있는것을받는다. Shop 클래스의 sell() 메소드는경제적가치가있는것을모두매개변수로받는다. 문제점 : sell() 메소드의매개변수타입 Money 타입인경우 다른경제적가치가있는것은못받는다. Thing 타입인경우 경제적가치가없는것도받을수있다. 해결책 C++ - 다중상속사용 자바 -??? interface라는개념도입 Class for OOP 25
4.4.1 인터페이스기초 interface 가필요한이유? Thing Money Watch Trash public class Shop { public void sell(? value, String name) { } }... Class for OOP 26
4.4.1 인터페이스기초 예제 : Thing.java 1 public abstract class Thing { 2 public String name; 3 4 public Thing(String name) { 5 this.name = name; 예제 : Valuable.java 1 interface Valuable { 2 public int value(); 3 } Class for OOP 27
4.4.1 인터페이스기초 예제 : 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 } Class for OOP 28
4.4.1 인터페이스기초 예제 : Trash.java 1 public class Trash extends Thing { 2 Trash() { 3 super(" 쓰레기 "); 예제 : Shop.java 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, " 아이스크림 "); // 컴파일에러 Class for OOP 29
4.4.1 인터페이스기초 인터페이스와추상클래스 추상클래스는클래스의메소드와멤버필드의일부분은구현, cf) 인터페이스는전혀구현되어있지않음 추상클래스를이용하는경우에는단일상속만지원 cf) 인터페이스는다중상속 (multiple inheritance) 을할수있음 인테페이스를구현하기위해서 implements 라는키워드를사용 인터페이스를구현하는것도서브타입 (subtype) 을만드는것임 Class for OOP 30
4.4.1 인터페이스기초 예 )DrawableCircle Class for OOP 31
4.4.1 인터페이스기초 인터페이스사용예 Class for OOP 32
4.4.1 인터페이스 (interface) 예제 : Drawable.java 1 import java.awt.graphics; 2 3 interface Drawable { 4 void paint(graphics g); 5 } 예제 : 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 } Class for OOP 33
4.4.1 인터페이스 (interface) 예제 : 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 }.. Class for OOP 34
4.4.2 인터페이스특성 인터페이스특성 인터페이스의멤버필드는디폴드로 static, final 로선언 따라서인터페이스의멤버필드의값을변경하려는시도는컴파일시에에러를발생 인터페이스구현 서브타입 여러개의인터페이스를구현하는경우 콤마를이용해서기술 인터페이스의임플리멘츠도상속과같은개념 인터페이스를임플리멘츠한서브클래스는인터페이스의멤버필드를상속받아서사용할수있다. 인터페이스의상속 extends 키워드사용 interface ScaledDrawable extends Drawable{..} Class for OOP 35
4.5 static 과 final 의의미 final 클래스 그클래스는더이상상속을통해서재사용할수없음 final 클래스를상속받으려는클래스는컴파일시에에러가발생 클래스앞에 final 키워드사용 public final class FinalClass{. } final 메소드 final 이메소드에선언된경우, 오버라이딩이불가능 메소드앞에 final 키워드사용 public final void print(){. } final 멤버필드 값을변경할수없는상수의의미 final 멤버필드는값을초기화만할수있고, 새로이값을할당할수는없음 멤버필드앞에 final 키워드사용 public final int a = 10; Class for OOP 36
4.5 static 과 final 의의미 static 멤버필드 객체들간의전역변수처럼사용됨 클래스이름으로접근한다. (ex : Color.red) 멤버필드앞에 static 키워드사용 static int a = 3; static 메소드 혹은클래스메소드라고도함 인스턴스가아닌클래스이름으로메소드호출 ex : Math.abs(-10); 메소드앞에 static 키워드사용 public final static void sayhello(string arg){. } 주의 this, super 를사용할수없음 static 이아닌멤버필드는접근할수없음 Class for OOP 37
4.5 static 과 final 의의미 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 } Class for OOP 38
5.3 내부클래스 (Inner Class) 내부클래스 클래스내부에정의된클래스 외부클래스의멤버필드와메소드에자유롭게접근가능 종류 내재된 (Nested) 톱레벨클래스 / 인터페이스 클래스나인터페이스가 static으로선언된경우 패키지의멤버 다른클래스에서사용될수있음 멤버클래스 클래스의멤버로정의됨 지역클래스 메소드내부에서정의됨 무명클래스 메소드내부에서정의됨 Class for OOP 39
5.3.1 내재된톱레벨클래스 / 인터페이스 내재된 (Nested) 톱레벨클래스 / 인테페이스 다른클래스에포함되면서클래스나인테페이스가 static으로선언된경우 다른톱레벨클래스와같이패키지의멤버이다. LinkedList 클래스에내재된인터페이스 Linkable이있다면, Linkable 인터페이스는 LinkedList.Linkable로접근할수있다. 예제 : LinkedList.java 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 } Class for OOP 40
5.3.1 내재된톱레벨클래스 / 인터페이스 예제 : 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 } Class for OOP 41
5.3.2 멤버클래스 멤버클래스 클래스의멤버로 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 }. Class for OOP 42
5.3.2 멤버클래스 멤버클래스 클래스의멤버로내부클래스가선언된경우 예제 : DiscountShop.java 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; 14 } Class for OOP 43
5.3.2 멤버클래스 예제 : 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(); Class for OOP 44
5.3.2 멤버클래스 예제 : 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 } Class for OOP 45
5.3.3 지역클래스 지역클래스 자바코드의블락 ({ }) 안에서정의된 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 }. Class for OOP 46
5.3.3 지역클래스 지역클래스 메소드내부에정의된클래스 예제 : 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); 15 } Class for OOP 47
5.3.4 무명클래스 무명클래스 지역클래스의개념을확장 클래스정의와사용의 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 } ); Class for OOP 48
5.3.4 무명클래스 무명클래스 메소드내부에서정의됨 예제 : 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); Class for OOP 49
5.4 자바에서중요한클래스 5.4.1 Object 클래스 모든자바클래스의슈퍼클래스 extends Object 를쓰지않아도자동적으로상속 Object 클래스들의메소드 protected Object clone() 객체를복사하는데사용된다. public boolean equals(object obj) 두객체의내용이동일한지알아볼때사용되는메소드 public int hashcode() 객체를위한해쉬코드를리턴 해쉬코드는자바시스템에서객체를유일하게식별하는정수값 Class for OOP 50
5.4. 자바에서중요한클래스 5.4.2 데이터타입클래스 Class for OOP 51
5.4. 자바에서중요한클래스 Boolean 클래스 Boolean 클래스는 boolean 기본타입을표현하기위한클래스 Boolean(boolean value), Boolean(String s) 두형태의생성자를가짐 두번째생성자의아규먼트 s는 "true" 문자열과동일하면 true 값을갖고, 다른경우에는 false 값을갖는다. Boolean 클래스로부터기본타입 boolean 값을얻기위해서는 booleanvalue() 메소드를이용 Class for OOP 52
5.4. 자바에서중요한클래스 Byte 클래스 byte 기본자료타입을표현하기위해 JDK 1.1 이후에제공되는클래스 Byte(byte value), Byte(String s) 두형태의생성자를갖는다 두번째생성자의아규먼트는문자열을 10진수의바이트값로변환하면서문자열의포맷이틀린경우에는 NumberFormatException 예외가발생 메소드 public static byte parsebyte(string s) 문자열을 byte 값으로변환하는메소드 public static byte parsebyte(string s, int radix) 문자열을 radix 에따라 10 진수, 2 진수등의 byte 값으로변환하는메소드 public byte bytevalue() 10 진수 byte 값을리턴하는메소드 Class for OOP 53
5.4. 자바에서중요한클래스 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) Class for OOP 54
5.4. 자바에서중요한클래스 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() - 의미있는숫자가아닌지여부를알아보는메소드 Class for OOP 55
5.4. 자바에서중요한클래스 Double 클래스의값을각기본자료형의값으로변경하는데 사용되는메소드 public byte bytevalue() public short shortvalue() public int public long public float public double intvalue() longvalue() floatvalue() doublevalue() Class for OOP 56
5.4. 자바에서중요한클래스 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 Class for OOP 57
5.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() Class for OOP 58
5.4. 자바에서중요한클래스 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() Class for OOP 59
5.4. 자바에서중요한클래스 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() Class for OOP 60
5.4. 자바에서중요한클래스 Math 클래스 수학함수와이에필요한상수들로구성 Math 클래스의모든메소드들은 static으로정의되어있기때문에프로그램내에서 Math 클래스의인스턴스를만들지않고 Math.method_name() 형태로메소드를호출해서사용할수있다. 멤버필드 public static final double E - 2.7182... public static final double PI - 3.14159... Class for OOP 61
5.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 사이의임의의값을 리턴한다. Class for OOP 62
5.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 } 결과 % java MathDemo 4 5 pow(4, 5) =>1024.0 Class for OOP 63
5.4. 자바에서중요한클래스 String 클래스 문자열을나타내기위해사용 생성자 public String() public String(String value) public String(char[] value) public String(char[] value, int offset, int count) public String(bytes[] value) Class for OOP 64
5.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() Class for OOP 65
5.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 } Class for OOP 66
5.4. 자바에서중요한클래스 Vector 클래스 Vector 는크기가동적인배열로볼수있다. java.util 패키지에속해있다. 생성자 public Vector() - 빈벡터를생성한다. public Vector(int initialcapacity) - 초기벡터의크기를 initialcapacity로만든다. public Vector(int initialcapacity, int capacityincrement) - 초기벡터의크기를 initialcapacity로만들고, 부족할때마다 capacityincrement 만큼씩벡터크기가증가 Class for OOP 67
5.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의개수를리턴 Class for OOP 68
5.4. 자바에서중요한클래스 예제 : 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 }... Class for OOP 69
5.4. 자바에서중요한클래스 StringTokenizer 클래스 문자열을개별적인토큰으로분리하는방법을제공 생성자 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 값으로기술하는생성자 public boolean hasmoretokens() - 토큰이더이상있는지여부를알아본다. public String nexttoken() - 다음토큰을리턴 public String nexttoken(string delim) - 새로운구별자 (delim) 를이용해서다음토큰을리턴 public int counttokens() - 토큰의개수를리턴 Class for OOP 70
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);.. Class for OOP 71
6.1 자바의예외처리 실세계의예외처리 이부장 void c( ) { try { 박과장.b( );... 작업중단 } catch (Exception e){... } } 3 박과장 void b( ) throws Exception { 김대리.a( );... 작업중단 } 2 김대리 void a( ) throws Exception { 돌발상황발생 1 } 작업중단 Class for OOP 72
6.1 자바의예외처리 예외처리 간단한에러 ( 예외 ) 가발생하였을때, 이오류를바로잡아서계속수행할수있도록오류를처리 예외혹은예외상황 - 심각하지않은에러 C 언어에서예외처리 방법 보통시그날처리루틴이나, 함수의리턴값으로 일반함수나시스템콜은음수값을혹은 0을리턴 필요할경우 errno에값을할당해서에러의타입을알리기도함 Class for OOP 73
6.1 자바의예외처리 자바에서예외처리 처리과정 1. 예외 (Exception) 클래스를정의 2. 예외가발생할수있는함수 a() 에서예외가발생할조건을만족하면, Exception 클래스를 throw throw new 예외클래스생성자 () 문장을사용 3. a ( ) 함수를호출하는곳에서는 try-catch 문장을이용해서예외가발생하는경우에문제점을해결 예외클래스종류 자바에서예외 (Exception) 는클래스로표현 모든예외타입 (exception type) 은 Throwable 클래스나이것의서브클래스로부터상속 checked exception 메소드가선언한예외를 throw 하는지를컴파일러가체크 try-catch 문을사용해야한다. unchecked exception RuntimeException 이나 Error 로부터상속받는표준런타임예외와에러 try-catch 문을사용하지않아도컴파일시에에러가발생하지않음 예외타입은클래스이기때문에생성자, 멤버필드, 메소드등을가질수있다. Class for OOP 74
6.1 자바의예외처리 throws checked exception 을메소드이름뒤에선언 public int dosomething(int x) throws Exception1, Exception2 { } throw 예외는 throw 문장을이용해서발생시킨다 throw new Exception1(); throws 를혼동하기쉬움 try-catch-finally 예외가발생할수있는문장들을 try문블락에기술한다. 수행도중에예외가발생하면 catch 문으로제어가넘어간다. catch 문은여러개가존재할수있다. finally문은예외발생여부에관계없이항상수행된다. Class for OOP 75
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(); Class for OOP 76
예외처리 JDK 에서제공되는예외 Exception 클래스상속관계 Class for OOP 77
6.1 자바의예외처리 예외관련클래스들 Checked Exception Unchecked Exception Class for OOP 78
6.1 자바의예외처리 1. 예외클래스만들기 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 } Class for OOP 79
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 } Class for OOP 80
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(); Class for OOP 81
예외처리 JDK 에서제공되는예외클래스들의예 ArithmeticException 0으로나누는경우에주로발생하는예외상황 ArithmeticException 은 RuntimeException 으로부터 상속받은 예외클래스 ArrayIndexOutofBoundsException 배열의크기보다큰원소를접근하려고할때발생되는예외 NegativeArraySizeException 배열의크기가음수로된경우에발생하는예외 NullPointerException 생성되지않은객체를이용해서객체의멤버를접근하는경우에발생하는예외 Class for OOP 82