1 / 69

객체지향 개념

객체지향 개념. 상속 은닉성 다형성 클래스 구조와 특징. 상속. 하나의 정의해 놓은 클래스를 기초로 새로운 클래스를 만들 수 있는 방법이다 . 기존 클래스를 기초로 새로운 클래스를 정의하는 것을 파생 (derivation) 이라 한다 . 새로 정의된 클래스를 파생 클래스 (derived class) 라고 한다 . 또는 direct subclass , child class 라고도 한다 . 원래 클래스는 base class , super class , parent class 라고 한다 .

evelyn
Télécharger la présentation

객체지향 개념

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 객체지향 개념 상속 은닉성 다형성 클래스 구조와 특징

  2. 상속 하나의 정의해 놓은 클래스를 기초로 새로운 클래스를 만들 수 있는 방법이다. 기존 클래스를 기초로 새로운 클래스를 정의하는 것을 파생(derivation)이라 한다. 새로 정의된 클래스를 파생 클래스(derived class)라고 한다. 또는 direct subclass , child class라고도 한다. 원래 클래스는 base class , super class , parent class 라고 한다. 자바는 하나의 super class로 부터 상속을 받는 단일 상속( single inheritance )만 지원한다.

  3. 상속 class A B의 직접 상위 C의 간접 상위 파생 시킴 class B A의 직접 하위 C의 직접 상위 파생 시킴 class C B의 직접 하위 A의 간접 하위

  4. 상속 class A 파생 시킴 class B 파생 시킴 class C

  5. 클래스 상속( class inheritance ) 베이스 클래스의 멤버를 파생 클래스에서 액세스 가능하도록 파생 클래스를 만드는 것을 클래스 상속이라 한다. 베이스 클래스의 상속 멤버(inheritance member)는 파생 클래스에서 액세스 할 수 있다. 베이스 클래스의 모든 멤버가 상속 되지는 않는다. extends 키워드를 사용한다.

  6. 클래스 상속( class inheritance ) public class Ex001Car { int intSpeed; String strColor; String strCarName; public void speedUp() { intSpeed ++; } public void speedDown() { intSpeed --; } }

  7. 클래스 상속( class inheritance ) public class Ex001CarSub extends Ex001Car { String strCarModel; public void speedStop() { intSpeed = 0; } public static void main( String args[] ) { Ex001CarSub objCar1 = new Ex001CarSub(); objCar1.speedUp(); System.out.println("objCar1 속도="+objCar1.intSpeed ); objCar1.speedStop(); System.out.println("objCar1 속도="+objCar1.intSpeed ); } }

  8. 데이터 멤버 상속 하기 상속은 부모의 멤버가 파생 클래스에 존재하는가 하는 문제가 아니라 파생 클래스에서 부모의 멤버를 액세스 할 수 있는가를 정의 한다. package2 package1 [SubClass2] [class1] int a; public protected private [SubClass1]

  9. 데이터 멤버 상속 하기 아래와 같이 Ex001Car class를 수정하여 주석을 하나씩 옮겨 가면서 test한다. package를 선언 한 경우와 선언 하지 않은 경우를 비교 한다. // package a; public class Ex001Car { int intSpeed; //public int intSpeed; //protected int intSpeed; //private int intSpeed; ......................................

  10. 데이터 멤버 숨기기( overshadow) 파생 클래스의 데이터 멤버를 베이스 클래스의 데이터 멤버와 같은 이름으로 정의 할 수 있다. 이런 경우 같은 이름을 가진 베이스 클래스의 멤버는 파생 클래스에서 은폐된다. 아래와 같이 Ex001CarSub class를 수정 한다. 수정 후 실행 하면 실행 결과는 아래와 같다. public class Ex001CarSub extends Ex001Car { int intSpeed = 5; String strCarModel; ......................................

  11. 상속 메서드 베이스 클래스의 생성자는 액세스 유형과 상관 없이 상속 되지 않는다. Ex001Car class의 speedUp() 메서드의 액세스 유형을 변화하여 접근 가능 여부를 확인 한다. public class Ex001Car { ............................... //void speedUp() public void speedUp() //protected void speedUp() //private void speedUp() { intSpeed ++; } ..............................

  12. super 슈퍼 클래스를 지칭하는 레퍼런스로 사용 된다. this와 super는 클래스의 내부에서만 사용될 수 있고,static으로 선언된 메서드에서는 사용 될 수 없다. public class Ex002CarSubSuper extends Ex001Car { int intSpeed = 5; String strCarModel; public void speedStop() { super.intSpeed = 0; //this.intSpeed = 0; } ....................

  13. super() 슈퍼 클래스의 생성자를 호출 한다. 생성자의 맨 처음 문장에 위치해야 한다. public class Ex003CarSubSuper extends Ex001Car { String strCarModel; public Ex003CarSubSuper() { super(); intSpeed = 5; }

  14. 오버라이딩( overriding ) 베이스 클래스에 있는 메소드와 동일한 특징(signature)을 갖는 메소드를 파생 클래스에서 다시 정의 가능 하다. 파생 클래스에서 재 정의 하는 메서드는 접근 속성이 같거나 덜 할 수는 있지만 더 할 수는 없다. 파생 클래스에서 overriding한 메서드를 호출하면 베이스 클래스의 메서드 대신 파생 클래스에서 overriding한 메서드가 호출 된다. 베이스 클래스의 메서드는 계속 존재 하며 파생 클래스에서 호출 가능 하다. 베이스 클래스의 메서드와 특징이 동일 하면서 리턴 타입이 다른 메서드는 파생클래스에서 정의 할 수 없다.( 메서드 명은 동일하나 파라미터가 다른 경우는 가능 )

  15. 오버라이딩( overriding ) static으로 선언한 메서드는 overriding 할 수 없다.( 파생 클래스의 메서드를 static으로 선언하면 숨김이 발생 한다 ) static으로 선언한 경우에는 변수의 타입에 따라서 메서드가 호출 된다. private 접근 속성도 overriding 가능

  16. 오버라이딩( overriding ) public class Ex004CarSubOverriding extends Ex001Car { String strCarModel; public void speedUp() { intSpeed += 5; //super.speedUp(); } public static void main( String args[] ) { Ex004CarSubOverriding objCar1 = new Ex004CarSubOverriding(); objCar1.speedUp(); System.out.println("objCar1 속도 = " + objCar1.intSpeed ); } }

  17. 디폴트 생성자와 상속 관계 상위 클래스의 생성자는 명시적으로 호출하지 않아도 자동 호출 된다. 상의 클래스에서 인자가 있는 생성자만 정의되어 있다면 기본 생성자는 자동으로 호출되지 않는다. ( 컴파일러가 디폴트 생성자를 제공 하지 않는다 ) 다음 예는 에러가 발생 한다. 두 파일 중 하나의 주석을 제거하면 에러는 발생 하지 않는다. 생성자 호출 순서 확인 => 상위 클래스부터 호출

  18. 디폴트 생성자와 상속 관계 public class Ex005Car { static int intSpeed; String strColor; String strCarName; /* public Ex005Car() { intSpeed = 1; } */ public Ex005Car(int intStart) { intSpeed = intStart; } ......................

  19. 디폴트 생성자와 상속 관계 public class Ex006CarSub extends Ex005Car { String strCarModel; /* public Ex006CarSub() { super(5); } */ .................................... public static void main( String args[] ) { Ex006CarSub objCar1 = new Ex006CarSub(); objCar1.speedUp(); System.out.println("objCar1 속도 = " + objCar1.intSpeed ); .....................................

  20. 베이스 클래스 액세스 속성 선택하기 클래스의 외부 인터페이스를 구성하는 메서드는 public으로 선언되어야 한다. 보통 베이스 클래스에서는 데이터 멤버 필드를 private으로 만들고, 이를 액세스 하는 public 메서드를 제공한다. protected 옵션은 같은 패키지에 들어 있는 클래스 또는 다른 패키지에 들어있는 파생클래스에서는 데이터 멤버를 자유롭게 액세스할 수 있으나, 그 외 클래스에서는 액세스를 제한하고자 할 때 사용한다. 액세스 속성을 생략하면 같은 패키지에서는 자유롭게 접근 가능하나 다른 패키지에서는 private과 동일 하다.

  21. 한 덩어리로묶여 있다 ! 관련된 메소드(함수)들 데이터 캡슐화(encapsulation)(1/2) • 어떤 데이터들과 관련된 함수들을 하나로 묶는 것 • 장점 • 특정 기능을 모듈화 할 수 있다. • 관련성을 정확히 규정할 수 있음 • 프로그램 수정이 용이

  22. 캡슐화(encapsulation)(2/2) • Java의 캡슐화 장치 • class Point { int xPosition; int yPosition; boolean status; colorType color; public void move (int x, int y); public void setColor (colorType c); public void penUp ( ); public void penDown ( ); . . .} 데이터: 멤버 변수 관련 함수: 멤버 메소드

  23. 블랙 박스 관련된 함수들 데이터 정보은닉(Information Hiding)(1/2) • 캡슐내부의 정보를 외부에 감출수 있다. • 캡슐화는 관련된 것들 주변에 캡슐을 씌우는 것. • 그러나, 캡슐화 그 자체가 캡슐안의 내용들이 외부에 보이지 않는 것을 의미하지는 않는다. • 정보은닉은 객체에 블랙박스(Blackbox)를 씌워서 내부의 정보를 감추는 장치이다. • 장점 • 객체의 세부사항을 다른객체에 숨김으로써 다른객체가 해당 객체에 함부로 접근하는 것을 막음

  24. xPosition: 10yPosition: 20status: oncolor: blue move (int, int); setColor (colorType); penUp ( ); penDown ( ); 정보은닉(Information Hiding)(2/2) • Java의 인터페이스 장치 • class point { private int xPosition; private int yPosition; private boolean status; private colorType color; public void move (int x, int y); public void setColor (colorType c); public void penUp ( ); public void penDown ( ); . . .}

  25. 폴리모피즘( polymorphism : 다형성 ) 래퍼런스 변수가 어떤 종류 이던 현재 래퍼런스하고 있는 실제 객체의 메서드가 호출 된다. 상위 클래스의 래퍼런스 변수는 하위 클래스 객체를 래퍼런스 할 수 있지만, 그 반대는 금지 되어 있다.( 반대의 경우에는 컴파일 에러 발생 –캐스트 연산을 이용하여 컴파일 에러는 막을 수 있으나 실행 시 에러 발생 ) 특별한 문법이 존재 하는 것이 아니라, overloading 과 overriding의 형태로 표현한다. 다형성은 메서드에만 적용 된다. 공통의 기반 클래스를 가지는 객체들을 일괄적으로 다루는 것이 가능 하다. –공통의 기반 클래스형 배열을 만들어 객체를 관리 한다.

  26. 폴리모피즘( polymorphism : 다형성 ) class A f() class SA f() class SB f() class SC f() A a = new SA() A a = new SB() A a = new SC()

  27. 폴리모피즘의 조건 파생 클래스 객체의 메서드 호출은 베이스 클래스 유형의 변수를 통해야 한다. 호출된 메서드는 베이스 클래스의 멤버이어야 한다. 베이스 클래스와 파생 클래스에서 메서드의 특징이 같아야 한다. 메서드 리턴값 유형이 베이스 메서드의 유형과 같아야 한다. 메서드 액세스 속성은 파생 클래스가 베이스 클래스보다 덜 제한 적 이어야 한다.

  28. 폴리모피즘( polymorphism : 다형성 ) public class Ex007Poly { String strMsg; public Ex007Poly() { strMsg = "Ex007Poly"; } public void f() { System.out.println("이곳은 Ex007Poly,strMsg = " + strMsg ); } }

  29. 폴리모피즘( polymorphism : 다형성 ) public class Ex008Poly extends Ex007Poly { public Ex008Poly() { strMsg = "Ex008Poly"; } public void f() { System.out.println("이곳은 Ex008Poly,strMsg = " + strMsg ); } public static void main( String args[] ) { Ex008Poly obj1 = new Ex008Poly(); obj1.f(); Ex007Poly obj2 = new Ex008Poly(); obj2.f(); } }

  30. 추상 클래스 ( abstract class ) 하나 이상의 추상 메서드가 선언 되어있는 클래스 –추상 메서드가 없어도 에러는 발생 하지 않는다. 다형성을 이용하여 여러 개의 하위 클래스를 파생 시킬 필요 가 있을 때 사용( 공통 메서드를 동적으로 호출 할 때 ) 추상 클래스는 abstract 키워드를 사용한다. 추상 메서드는 abstract 키워드로 정의하고 ‘;’으로 끝난다. public 과 abstract 키워드는 어느것을 먼저 써도 상관 없다. 추상 클래스는 new연산자로 객체를 생성 할 수 없다. 추상 클래스를 상속 받은 서브 클래스는 추상 메서드를 구현 ( implement )해야 한다. 추상 메서드 이외의 메서드를 구현 할 수 있다.

  31. 추상 클래스 ( abstract class ) 상속한 클래스에서 반드시 f() 메서드를 정의해야 한다. public abstract class Ex009Abstract { public abstract void f(); public void f1() { System.out.println("하하하하"); } }

  32. 추상 클래스 ( abstract class ) public class Ex010Abstract extends Ex009Abstract { public void f() { System.out.println("이곳은 Ex010Abstract "); super.f1(); } public static void main( String args[] ) { Ex010Abstract obj1 = new Ex010Abstract(); obj1.f(); } }

  33. 인터페이스 ( interface ) 자바에서는 다중 상속을 지원하지 않는다. 그러나 인터페이스는 다중 상속 ( multiple inheritance )을 할 수 있다. 인터페이스는 객체를 모델링한 클래스가 아니라 객체가 가지고 있어야 할 기능 만을 명시한다. ( “해당 클래스에서 인터페이스를 구현 한다.”) 같은 인터페이스를 가지고 클래스마다 서로 다른 기능이 구현 될 수 있다. interface 키워드를 사용하여 정의 한다. implements 키워드를 사용하여 상속 받는다. 인터페이스의 멤버필드는 디폴트로 static,final로 선언 되어 있다. 반드시 abstract 메서드일 필요는 없다. 모든 메서드는 구현 할 수 없다 ‘super’키워드 대신에 ‘interface명’을 사용 한다.

  34. 인터페이스 ( interface ) interface Ex011Interface { public void f(); /* public void f1() { System.out.println("하하하하"); } */ }

  35. 인터페이스 ( interface ) public class Ex012Interface implements Ex011Interface { public void f() { System.out.println("이곳은 Ex012Interface "); } public static void main( String args[] ) { Ex012Interface obj1 = new Ex012Interface(); obj1.f(); } }

  36. 인터페이스 ( interface ) 아래와 같이 상속 받은 클래스의 멤버와 인터페이스의 멤버의 이름이 같은 경우 둘을 구분하기 위해서 ‘super’와 ‘interface명’ 을 사용 한다. interface Ex013Interface { int a = 3; } class Ex013Class { int a = 5; }

  37. 인터페이스 ( interface ) class Ex013Object extends Ex013Class implements Ex013Interface { public void f() { System.out.println("class a=" + super.a); System.out.println("interface a="+Ex013Interface.a); } public static void main( String args[] ) { new Ex013Object().f(); } }

  38. final 클래스 • 클래스 앞에 final로 정의하면 더 이상 상속 될 수 없다. • final로 정의된 class를 상속 하고자 하면 컴파일 에러 발생 • 클래스의 일관성을 유지 하는데 사용 • abstract 와 final 키워드는 동시에 사용 될 수 없다. • 다음과 같이 정의 • final class 클래스_명 • 아래는 다음 페이지 예제의 컴파일 결과 이다

  39. final 클래스 final class Ex014Class { int a = 5; public void f() { System.out.println("하하하하"); } } class Ex014FinalObj extends Ex014Class { public static void main( String args[] ) { new Ex014FinalObj().f(); } }

  40. final 메서드 메서드를 final로 선언하면 overriding이 불가능 하다. class Ex015Class { final void f() { System.out.println("하하하하"); } } class Ex015FinalObj extends Ex015Class { public void f() { System.out.println("호호호호"); } .........................

  41. final 멤버 필드 멤버 필드를 final로 선언하면 하위 클래스에서 값을 변경 할 수 없다. ( 상수 ) 주석을 제거하고 컴파일 하면 에러 발생 class Ex016Class { public final int a = 5; } class Ex016FinalObj extends Ex016Class { public static void main( String args[] ) { Ex016FinalObj obj1 = new Ex016FinalObj(); //obj1.a = 10; System.out.println("a = " + obj1.a); ..............................

  42. static 멤버 필드 객체들간에 공유 할 수 있는 전역 변수 가 된다. 클래스 변수라고 한다. class A static int a static void f() a = 3; a = 3; a = 3; instance OA instance OB instance OC

  43. static 멤버 필드 class Ex017Class { public static int a ; } class Ex017StaticObj extends Ex017Class { public static void main( String args[] ) { Ex017StaticObj obj1 = new Ex017StaticObj(); Ex017StaticObj obj2 = new Ex017StaticObj(); obj1.a = 10; System.out.println("obj1 a = " + obj1.a); System.out.println("obj2 a = " + obj2.a); } }

  44. static method instance를 생성하지 않아도 메서드 호출이 가능 하다. ( 클래스 이름으로 호출이 가능 ) 클래스 메서드라고 한다. static 메서드에서는 this 나 super를 사용 할 수 없다. static이 아닌 멤버 필드는 접근 할 수 없다.

  45. static method class Ex018StaticObj { //public void f() public static void f() { System.out.println("하하하하"); } public static void main( String args[] ) { //Ex018StaticObj obj1 = new Ex018StaticObj(); //obj1.f(); f(); } }

  46. static method class Ex019Class { static int a = 5; public static void f() { System.out.println("하하하하 a = " + a); } } class Ex019StaticObj { public static void main( String args[] ) { //Ex019StaticObj obj1 = new Ex017StaticObj(); //obj1.f(); Ex019Class.f(); } }

  47. inner class( 내부 클래스 ) 클래스 정의 문장 안에 새로운 클래스를 정의한다. 메서드나 멤버 변수가 특정 외부 클래스에게만 public이고, 다른 클래스에게는 private으로 접근 속성을 정의 할 때 사용 한다. 내부 클래스도 사용하기 위해서는 인스턴스를 생성 해 주어야 한다. 외부 클래스의 멤버 변수와 메서드를 마음대로 사용 할 수 있다. 내부 클래스는 외부에서 단독으로 사용불가. 외부 클래스의 일부분으로 사용되는 개념이다. 클래스 파일 이름은 ‘외부클래스이름$내부클래스이름.class’로 생성 된다.

  48. inner class( 내부 클래스 ) class Ex020A { private int a = 5; public void f() { Ex020B objB = new Ex020B(); System.out.println("Ex020A->Ex020A a = " + a); System.out.println("Ex020A->Ex020B a = " + objB.a); objB.f(); } class Ex020B { private int a = 10;

  49. inner class( 내부 클래스 ) public void f() { System.out.println("Ex020B->Ex020A a="+Ex020A.this.a); System.out.println("Ex020B->Ex020B a="+ a); } } } public class Ex020InnerClass { public static void main( String args[] ) { Ex020A objA = new Ex020A(); objA.f(); //Ex020B objB = new Ex020B(); } }

  50. local class( 지역 클래스 ) 코드 블럭안에 정의 된 내부 클래스이다. 정의된 블럭 안에서만 사용 할 수 있다. class Ex021A { private int a = 5; public void f() { class Ex021B { private int a = 10; } Ex021B objB = new Ex021B(); System.out.println("Ex020A->Ex020A a = " + a); System.out.println("Ex020A->Ex020B a = " + objB.a); }

More Related