객체지향프로그래밍 - 클래스및객체 - 상속성및다형성 - 추상클래스 - 예외처리
클래스 (class) 객체지향개념 자료 (field) + 자료를처리할수있는루틴 (method) 객체생성 캡슐화 (encapsulation) 정보은폐 (Information hiding) 멤버필드와메소드를클래스의외부에서는접근을조정 상속 (Inheritance) 새로운클래스를정의할때, 이미존재하는클래스를바탕으로필요한속성만추가하여작성하는방법 슈퍼클래스, 서브클래스 2
객체지향프로그래밍의장점 생산성향성 객체를하드웨어의 IC 처럼재사용 자연적인모델링 재사용 보통사람들의생각을프로그래밍언어로표현 상속성, 클래스통합을통한코드재상용의극대화 유지보수의용이성 함수수정에있어주변에미치는영향이최소화됨 3
4 실세계의객체와컴퓨터상의객체
클래스선언과객체생성및사용 1. 공장 = 클래스 2. 물건생성 = 객체생성 3. 물건생성 = 객체사용 mypen.write() Pen mypen = new Pen() 중요특성및 기능추출 class Pen { String color; int price; void write() { System.out.println("Hello"); } } 5
실세계의객체와컴퓨터상의객체 예제 : CircleUser.java class CircleUser { public static void main(string args[]) { Circle c = new Circle(); c.setradius(7); System.out.println(c.getCircumference()); System.out.println(" 원면적 :"+ c.getarea()); } } 6
생성자 (constructor) 객체생성과패키지 클래스이름과동일한이름을갖는함수 생성자의리턴타입은기술하지않음 메모리공간할당및클래스멤버필드의초기화를위해서필요 디폴트생성자 (default constructor) 7
예제 : Circle2.java 1 class Circle { 2 protected int r; 3 public Circle() { 4 r = 0; 5 } 6 public Circle(int r) { 7 this.r = r; 8 } 9 10 } 8
특징 this 클래스내에서자기자신을가리키는레퍼런스 static으로선언된메소드에서는사용될수없다. 두가지목적으로사용 자기자신의멤버필드나메소드를명확히지시하기위해서사용 객체전체를함수의아규먼트로전달해야하는경우에사용 예제 : This.java 9 void a(int a) { 10 this.a = a; 11 b.dojob(this); 12 } 13 }.. 9
패키지 유사한클래스들의모임 package package_name; 패키지내에서클래스들은서로자유롭게다른클래스들을참조 다른패키지의클래스참조. import package _ name.class_ name; 10
Public 클래스 public 으로선언된경우 같은패키지내에서자유롭게사용. 다른패키지에서도자유롭게사용. public 으로선언되지않은경우 같은패키지내에서는자유롭게사용 다른패키지에서접근시에러가발생 11
PublicPoint.java package points public class PublicPoint class PointList PublicPoint.java package pointuser package pointuser class PointUser point.publicpoint p = new class PointUser2 point.pointlist p1 = new 12 Pointuser.java Pointuser2.java
객체간의의사소통 : 메시지패싱 자바언어에서메시지패싱 메시지패싱방법을사용 대부분의프로그래밍언어에서는함수호출을이용 Car Engine engine; Pedal pedal; Wheel wheel; Di Driver Car car; car.pedal.push() pedal push(){ } engine.powerup(); wheel speedup(){...... } engine powerup(){ } wheel.speedup() 13
가시성 : 클래스내부접근 package class class class 상속 O O X O protected public private default 상속 O O X O class class 14
가시성 : 클래스외부접근 package class class X class O O X X 상속 protected public private default O X X class 상속 class 15
가시성예제 package points package points4 class Point int x, y ; public void move(..) { } Import points.point3d class Point3d int z ; public void move(..) { } 상속 상속 class Point3d int z ; public void move(..) { } class Point4d int w ; public void move(..) { } 16
오버로딩 (overloading) 연산자오버로딩 (Operator Overloading) 동일한연산자가자료의타입에따라다른작업을수행하는것 메소드오버로딩 (Method Overloading) 동일한이름을가지는메소드가여러개존재가능 동일클래스에서메소드이름이동일하지만시그네쳐가다름. 17
메소드시그네쳐 (signiture) 메소드이름, 매개변수수, 매개변수자료형 동일한메소드이름을사용하면컴파일러가 시그네쳐를이용하여구분 메서드이름이동일하고시그니쳐도동일하다면 컴파일에러발생 메소드리턴타입은시그니쳐에포함되지않음 18
오버로딩 (overloading) 19 1 class Overloading { 2 public void say() { 3 System.out.println("Hello?"); 4 } 6 publicvoidsay(stringmsg){ 7 System.out.println(msg); 8 } 10 public void say(string msg, int n) { 11 for(int i =0; i < n; i++) { 12 System.out.println(msg); t tl 13 } 14 } 16 public static void main(string args[]) { 17 Overloading a = new Overloading(); 18 a.say(); 19 a.say( say("how are you?");?); 20 a.say("i am fine.", 3);...
상속성 (inheritance) 상속및기타 기존에있는클래스를바탕으로다른특성을추가해새로운클래스를생성 단일상속성 (single inheritance) animal superclass, baseclass, parent class 상속 (extends) is a relationship 특별화 (specialization) 일반화 (generalization) animal human Subclass, derived class, child class 20
21
super super, super() 슈퍼클래스를지칭하는레퍼런스 상위클래스의멤버필드나메소드를지칭할때사용 super.attribute, super.method() super() 슈퍼클래스의생성자호출 상속받은클래스는생성자에서슈퍼클래스의생성자를호출 22
1 class Manager extends Employee { 2 String dept; 3 Employee subordinate[]; 4 5 public Manager(String name, String idnum, String dept) { 6 super(name, idnum); 7 this.dept = dept; 8 } 9} 23
특성 클래스의상속관계에서발생 Overriding 슈퍼클래스에있는메소드를서브클래스에서다른작업을하도록서브클래스에서동일한메소드이름으로재정의 24 class Employee { public void dojob() { System.out.println(" temployee "+name + " does his best."); } } class Manager extends Employee { public void dojob() { System.out.println("Manager "+name +" works hard with his subordinates in"+dept+" dept."); } }
상속과오버라이딩 A z AA void b() { b()..("a") } a 10 void b() { c()..("aa") AA) } a 20 void c() {..("C") } 25
상속과오버라이딩시주의 오버라이딩을사용할때메소드의시그니쳐는동일하면서메소드의리턴타입이다른경우에는컴파일시에에러가발생 static 으로선언한메소드는오버라이딩되지않음 26
27 1 class Point { 2 int x = 0, y = 0, color; 3 void move(int dx, int dy) { x += dx; y += dy; } 4 int getx(){returnx;} 5 int gety(){returny;} 6} 7 8 class RealPoint extends Point { 9 float x = 0.0f, y = 0.0f; 10 void move(int dx, int dy) { move((float)dx, (float)dy); } 11 void move(float dx, float dy) { x+=dx; y += dy; } 12 float getx(){returnx;} 13 float gety() (){ return y; } 14 }
Static 메소드오버아리딩 1 class Super { 2 static String greeting() { return "Goodnight"; } 3 String name() { return "Richard"; } 4 } 5 6 class Sub extends Super { 7 static String greeting() { return "Hello"; } 8 String name() { return "Dick"; } 9 } 10 11 class MethodHiding { 12 public static void main(string[] args) { 13 Super s = new Sub(); 14 System.out.println(s.greeting() + ", " + s.name()); 15 } 16 } 28
정의 오버쉐도우 (overshadow) 동일한이름의필드가슈퍼클래스와서브클래스에동시에존재 오버쉐도우된멤버접근 super 레퍼런스 서브클래스를슈퍼클래스로형변환 오버라이드된메소드는형변환을통해접근할수없고 super 레퍼런스를통해서만접근. 29
예제 : Super.java 1 class SuperOne { 2 int a; 3 public SuperOne() { 4 a = 10; 5 } 6 7 public void print() { 8 System.out.println("I am SuperOne."); 9 } 10 } 11 30
12 class SubOne extends SuperOne { 13 int a; 14 15 public SubOne() { 16 super(); 17 a = 20; 18 } 19 20 public void print() { 21 System.out.println("I am SubOne."); 22 } 23 public int getsupera() { 25 return super.a; 26 } 27 public void dosuperprint() { 29 super.print(); 30 } 31
32 public static void main(string args[]) { 33 SubOne sub = new SubOne(); 34 System.out.println("sub.a = " + sub.a); 35 sub.print(); 36 System.out.println("((SuperOne)sub).a = " + ((SuperOne)sub).a); 37 ((SuperOne)sub).print(); 38 sub.dosuperprint(); 39 } 40 } 32
XYZ.java i=10; Class X print() ; msg = I am an X ; play() ; Class Y i=10; msg = I am an Y ; print() ; play() ; Class Z i=10; msg = I am an Z ; print() ; play() ; 33
다형성 (polymorphism) Poly = Many Morph = Forms Polymorphism = Many forms 과학자 화가 뉴튼스티븐호킹아인슈타인 레오나르도다빈치 고호피카소 다형적객체 (polymophic object) 34
다형성종류 Universal Parametric Inclusion (Subtyping) Polymorphism Ad-hoc Overloading Coercion 35
예, PolyA.java PolyB.java Class PolyA Class PolyB msg = I am PolyA!! work() { } msg = I am PolyB.. work() { } stack PolyB b() PolyA a() heap b.work() a.work() 36
예, PolyA2.java PolyB2.java Class PolyA2 Class PolyB2 stack msg = IamPolyA!! init() { work() } work() { } msg = I ampolyb PolyB.. work() { } PolyB2 b() PolyA2 a =new PolyB2() heap b.init() => work() a.init() 37
추상클래스 (abstract class) 추상클래스 (abstract class) 특성이구체적으로구현되지않는클래스 new 연산자로객체를생성할수없음. 추상메소드를가지는모든클래스 추상메소드 메소드의인터페이스만정의되어있는메소드 메소드의리턴타입부분앞에 abstract라는키워드를기술 추상클래스로부터상속받는경우에서브클래스는추상메소드를구현 (implement) 몸체완성 38
추상클래스예제 Shape.java public abstract class Shape { public abstract double area( ); public abstract double circumference( ); } - 상속 - 상속 - 추상메소드구현 - 추상메소드구현 Circle.java Rectangle.java 39
40 결과 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()); area()); 11 System.out.println("shape[1]'s area = " + shape[1].area()); 12 System.out.println( println("shape[2]'s s area ="+ shape[2].area()); C:\> java ShapeUser shape[0]'s area = 78.53981633974483 shape[1]'s area = 153.93804002589985
인터페이스 인터페이스 (interface) 추상클래스와유사 다중상속지원 [ interfacemodifier ] interface name [ extends name ] { [ interfacefieldmodifier ] type name; [ interfacemethodmodifier ] returntype name ( argumentlist ) ; } 41
예제 : Trash.java 1 public class Trash extends Thing { 2 Trash() { 3 super(" 쓰레기 "); 4 } 5 } 42
예제 : Shop.java 인터페이스 (interface) 8 public void sell(valuable v, String goods) { 9 System.out.print(name +" 에서 "); 10 System.out.print(v.value() + " 원어치 "); 14 public static void main(string args[]) { 15 Shop myshop = new Shop(" 숭실슈퍼 "); 16 Money money = new Money(5000); 17 Watch watch = new Watch(" 로렉스 "); 21 myshop.sell(money, " 과자 "); 22 myshop.sell(watch, " 음료수 "); 43
Thing.java 1 public abstract class Thing { 2 String name; 4 Thing(String name) { 5 this.name = name; 6 } 7 } Valuable.java 1 interface Valuable { 2 public int value() ; 3 } 44 Watch.java public class Watch extends Thing implements Valuable { String brand; Watch(String b) { super(" 시계 "); brand = b; } public int value() { return 10000; } } Money.java public class Money extends Thing implements Valuable { int value; Money(int value) { super(" 돈 "); this.value = value; } public int value() { return value; } }
new Shop( 슈퍼 ); new Money(5000); new Watch( 로렉스 )) new Trash() ; Shop class name = 슈퍼 Money class name = 돈 value = 5000 return 5000 Watch class name = 시계 brabd = 로렉스 return 10000 Trash class name = 쓰레기 45
예 )DrawableCircle l 인터페이스 (interface) 46
인터페이스특성 필드는디폴드로 static, final 로선언 필드의값을변경, 컴파일에러 implements : 상속념 임플리멘츠한서브클래스는인터페이스의필드를상속 인터페이스의상속은클래스와마찬가지로키워드 extends 를사용 47
final 클래스 static 과 final 의의미 더이상상속을통해서재사용할수없음 final 클래스를상속받으려는클래스는컴파일시에에러가발생 클래스앞에 final 키워드사용 public final class FinalClass{. } final 메소드 final 이메소드에선언된경우, 오버라이딩이불가능 메소드앞에 final 키워드사용 public final void print(){. } 48
final 멤버필드 static 과 final 의의미 값을변경할수없는상수의의미 final 필드는값을초기화만할수있고, 새로운값을할당할수는없음 필드앞에 final 키워드사용 public final int a = 10; static 멤버필드 객체들간의전역변수처럼사용됨 클래스이름으로접근한다.(ex : Color.red) 멤버필드앞에 static 키워드사용 static int a = 3; 49
static 메소드 클래스메소드 static 과 final 의의미 메소드앞에 static 키워드사용 public final static void sayhello(string arg){. } 주의 this, super 를사용할수없음 static 이아닌멤버필드는접근할수없음 50
Object 클래스 자바에서중요한클래스 모든자바클래스의슈퍼클래스 extends Object 를쓰지않아도자동적으로상속 Object 클래스들의메소드 protected Object clone() public boolean equals(object obj) public int hashcode() 51
자바에서중요한클래스 데이터타입클래스 52
예외처리 예외처리 간단한에러 ( 예외 ) 가발생하였을때, 오류를바로잡아서계속수행할수있도록오류를처리 예외혹은예외상황 - 심각하지않은에러 C 언어에서예외처리 일반함수나시스템콜은음수값을혹은 0 을리턴 필요할경우 errno에값을할당해서에러의타입을알리기도함 53
3 main(int argc, char* argv[]) { 11 if((i = divide(a)) < 0) 12 printf("error!!"); 13 else 14 printf("successful!: answer is %d", i); 17 int divide(int x) { 18 switch(x) { 19 case 0: 20 return -1; /* 에러가발생하기전에 -1 값을리턴. */ 21 case 1: 22 return -2; /* 에러가발생하기전에 -2값을리턴. */ 23 defaults: 24 break; 25 } 26 return 100/(x*(x-1)); ( 1)).. 54
자바에서예외처리 1. Exception 클래스를정의 2. 예외가발생할조건을만족하면 Exception 클래스를 throw 3. try-catch 문을이용해서예외가발생하는경우에문제점을해결 55
예외클래스종류 자바에서예외 (Exception) 는클래스로표현 모든예외타입 (exception type) 은 Throwable 클래스나이것의서브클래스로부터상속 checked exception 메소드가선언한예외를 throw 하는지를컴파일러가체크 try-catch문을사용해야한다. unchecked exception RuntimeException이나 Error로부터상속받는표준런타임예외와에러 try-catch 문을사용하지않아도컴파일시에에러가발생하지않음 예외타입은클래스이기때문에생성자, 멤버필드, 메소드등을가질수있음 56
예외클래스만들기 예외처리 Exception 클래스를상속받아야한다. Checked Exception 와 UncheckedException. 57 1 public class DivideZeroException extends Exception { 2 private String reason; 3 4 DivideZeroException() { 5 reason = "Divide by zero"; 6 } 7 8 public String tostring() { 9 return reason; 10 } 11 }
throws 예외처리 checked exception 을메소드이름뒤에선언 public int dosomething(int x) throws Exception1, Exception2 { } throw 예외는 throw 문장을이용해서발생 throw new Exception1(); throws를혼동하기쉬움 58
예외처리 예제 : Divider.java : Exception 클래스를 throw 59 1 public class Divider { 2 3 public Divider() id { 4 5 } 6 7 public int divide(int x) throws DivideZeroException { 8 switch(x) { 9 case 0: 10 throw new DivideZeroException(); id 11 case 1: 12 throw new DivideZeroException(); 13 defaults: 14 ; 15 } 16 return (int)(100/(x*(x-1))); 17 } 18 }
try-catch-finally 예외처리 예외가발생할수있는문장들을 try 문블럭에기술 수행도중에예외가발생하면 catch 문으로제어가넘어감. catch 문은여러개가존재할수있음 finally 문은예외발생여부에관계없이항상수행. 60
예외처리 61 1 public class TestException { 2 3 public TestException() { } 4 5 public static void main(string[] args) { 6 int a; 7 8 Divider t = new Divider(); 9 try { 10 a = Integer.parseInt(args[0]); 11 System.out.println("successful!: answer is "+ t.divide(a)); 12 } catch(dividezeroexception e) { 13 System.out.println("error!!: " + e); 14 } catch(exception ex) { 15 System.out.println("error!!: t tl " + ex); 16 }..
예외처리 JDK 에서제공되는예외 Exception 클래스상속관계 62
예외처리 JDK 에서제공되는예외클래스들의예 ArithmeticException 0으로나누는경우에주로발생하는예외상황 ArithmeticException 은 RuntimeException 으로부터상속받은예외클래스 ArrayIndexOutofBoundsException 배열의크기보다큰원소를접근하려고할때발생되는예외 NegativeArraySizeException 배열의크기가음수로된경우에발생하는예외 NullPointerException ti 생성되지않은객체를이용해서객체의멤버를접근하는경우에발생하는예외 63