1 / 57

8 장 . 상속

8 장 . 상속. Java. public class SumTest { public static void main(String a1[]) { int a, b, sum; a = Integer.parseInt (a1[0]); b = Integer.parseInt (a1[1]); sum = a + b ; // 두 수를 더하는 부분입니다 System.out.println (" 두수의 합은 " + sum + " 입니다 "); } }.

kiona-burke
Download Presentation

8 장 . 상속

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. 8장. 상속 Java public class SumTest { public static void main(String a1[]) { int a, b, sum; a = Integer.parseInt(a1[0]); b = Integer.parseInt(a1[1]); sum = a + b ; // 두 수를 더하는 부분입니다 System.out.println("두수의 합은 " + sum + "입니다"); } }

  2. 학습목표

  3. 목차 • section 1 상속(Inheritance)의 개요 • section 2 멤버 변수의 상속 • section 3 메소드의 상속과 오버라이딩(Overriding) • section 4 예약어super • section 5 속과 생성자 • section 6 객체의 형변환 • section 7 연산자 instanceof • section 8 추상 클래스와 추상 메소드 • section 9 예약어final

  4. 1 상속(Inheritance)의 개요 • 상속(inheritance) • 객체지향 언어의 장점인 모듈의 재사용(reusing)과 코드의 간결성을 제공하는 중요한 특성 [public/final/abstract] class 클래스이름 extends 상위 클래스이름 { .......... 멤버 변수선언 .......... 생성자선언 .......... 메소드선언 } 형식

  5. 2 멤버 변수의 상속 • protected 접근 한정자 • 같은 패키지 내의 클래스와 같은 패키지는 아니지만 상속된 클래스에서 사용 가능한 접근 한정자 • 멤버 변수의 접근 한정자 • public : 동일한 패키지인지, 상속관계인지에 상관없이 모든 클래스에서 사용 가능 • 한정자 없음 : 동일한 패키지이면 상속 여부에 상관없이 사용 가능 • protected : 동일한 패키지이면 상속 여부에 상관없이 사용 가능하며, 다른 패키지라도 상속되었으면 사용 가능 • private : 어떠한 경우에도 사용 불가능. 클래스 내부에서만 사용 가능

  6. 2 멤버 변수의 상속 • 접근 한정자의 사용 247 page

  7. 2 멤버 변수의 상속 • 실습예제 세 개의 클래스가 상속 관계 상속된 객체 변수에 접근

  8. 2 멤버 변수의 상속 • 프로그램 설명 • 04, 07 : 클래스 A, B, C가 상속관계로 정의되었고, 각 클래스는 하나의 객체 변수를 가지고 있다. 객체 변수가 접근 한정자를 가지고 있지 않으므로, 동일한 패키지에서는 상속된다. • 14~17 : 클래스 C로부터 생성된 객체를 통하여 상속받은 변수 aa와 bb에 접근하여 값을 출력한다.

  9. 2 멤버 변수의 상속 • 실습예제 객체 변수 j를 private로 선언 AA 클래스로부터 상속받아 BB 클래스 생성 오류 발생

  10. 2 멤버 변수의 상속 • 프로그램 설명 • 03 : 클래스 AA에서 객체 변수 j를 private로 선언하였다. • 09 : 클래스 AA로부터 상속받아 클래스 BB를 생성하였다. 이 경우 상위 클래스에서 private로 선언된 객체 변수는 상속되지 않는다. • 12 : 하위 클래스에서 상위 클래스의 private 변수에 접근하면 오류가 발생한다.

  11. 2 멤버 변수의 상속 • 실습예제 객체 변수 x 선언 객체 변수 x 선언. 상위 클래스의 객체 변수 x가 가려짐 x는 하위 클래스에서 선언된 문자열 x는 상위 클래스에서 선언된 정수

  12. 2 멤버 변수의 상속 • 프로그램 설명 • 02 : 상위 클래스에서 객체 변수 x를 선언하였다. • 05 : 하위 클래스에서 객체 변수(문자열형) x를 선언하였다. 하위 클래스에서 상위 클래스에서 선언된 변수와 같은 이름의 변수를 선언하는 경우는 상위 클래스 변수가 하위 클래스 변수에 의해 가려진다. • 10 : B2 클래스로부터 생성된 객체를 통하여 접근하는 x는 당연히 String x 이다. • 13 : B1 클래스로부터 생성된 객체를 통하여 접근하는 x는 당연히 int x 이다.

  13. 2 멤버 변수의 상속 • 실습예제 두 개의 클래스 변수 선언 클래스 이름을 통하여 클래스 변수에 값 저장 상속된 클래스에서 같은 이름을 가진 클래스 변수 선언

  14. 2 멤버 변수의 상속 • 프로그램 설명 • 06 : 상속된 클래스에서 상위 클래스에 선언된 클래스 변수와 같은 이름의 클래스 변수를 선언하였다. 상위 클래스의 클래스 변수는 하위 클래스의 클래스 변수에 의해 가려지게 된다. • 10~12 : 클래스 변수에 값을 설정하였다. 클래스 변수이기 때문에 클래스 이름을 통해서 접근하게 된다. • 16 : C2.y 값은 클래스 C1으로부터 상속된 클래스 변숫값이 출력된다.

  15. 3 메소드의 상속과 오버라이딩(Overriding) • 오버라이딩(overriding) • 상속 관계에 있는 클래스들 간에 같은 이름의 메소드를 정의하는 경우 • 상위 클래스의 메소드와 하위 클래스의 메소드가메소드 이름은 물론 매개변수의 타입과 개수까지도 같아야 함

  16. 3 메소드의 상속과 오버라이딩(Overriding) • 실습예제 클래스 AAA로부터 객체 변수와 메소드가 상속 상속된 메소드 호출

  17. 3 메소드의 상속과 오버라이딩(Overriding) • 프로그램 설명 • 09 : 상위 클래스 AAA로부터 객체 변수와 메소드를 상속받았다. • 18 : 하위 클래스로부터 생성된 객체를 통하여 상위 클래스로부터 상속받은 메소드를 수행하였다.

  18. 3 메소드의 상속과 오버라이딩(Overriding) • 실습예제 매개변수가 있는 show() 메소드 선언 하위 클래스에서 매개변수가 없는 show() 메소드 선언

  19. 3 메소드의 상속과 오버라이딩(Overriding) • 프로그램 설명 • 02, 08 : 상속된 관계의 클래스에서 상위 클래스에 선언된 메소드를 하위 클래스에서 오버라이딩하기 위해서는 메소드의 이름은 물론 매개변수의 개수와 형이 같아야 한다. 여기서는 매개변수의 개수와 형이 다르기 때문에 상위 클래스에 선언된 show(String str) 메소드가 하위 클래스에 상속된다. • 15, 16 : 상속된 하위 클래스 입장에서 보면 같은 이름의 메소드가 상속되었으므로, 오버로딩이 되어 메소드가 호출될 수 있다.

  20. 3 메소드의 상속과 오버라이딩(Overriding) • 실습예제 상속된 관계에서 동일한 메소드 선언(Overriding) 상속된 관계에서 동일한 메소드 선언(Overriding) 하위 클래스로 선언된 show() 메소드 수행

  21. 3 메소드의 상속과 오버라이딩(Overriding) • 프로그램 설명 • 02, 08 : 상속된 두 개의 클래스에서 같은 이름과 매개변수를 가진 메소드를오버라이딩하여 선언하였다. 상위 클래스에서 선언된 메소드는 하위 클래스의 메소드에 의해 가려지게 된다. • 15 : 하위 클래스의 show() 메소드가 호출되어 수행된다.

  22. 4 예약어super • 예약어super • 하위 클래스에 의해 가려진 상위 클래스의 멤버 변수나 메소드에 접근할 때 사용 • 상위 클래스의 생성자를 호출하기 위해 사용 super.객체 변수 super.메소드이름(매개변수) 형식

  23. 4 예약어super • 실습예제 display() 메소드를오버라이딩 super를 사용하여 상위 클래스 메소드 수행

  24. 4 예약어super • 실습예제 super를 사용하여 상위 클래스 객체 변수 사용

  25. 4 예약어super • 프로그램 설명 • 03, 10 : 상속된 관계의 클래스에서 같은 이름의 메소드를오버라이딩하였다. • 16 : 상위 클래스의 메소드를 수행시키기 위해 예약어super를 사용하였다. • 20 : 상위 클래스의 객체 변수를 사용하기 위해 예약어super를 사용하였다.

  26. 5 상속과 생성자 • 묵시적(default) 생성자 • 성자 중에 매개변수가 없는 생성자 • super 문장 • 상위 클래스의 특정 생성자를 호출하는 문장 • 반드시 생성자 부분의 첫 번째 라인에 위치 • 상위 클래스의 생성자가 항상 하위 클래스 생성자보다 먼저 수행되어야 함을 의미 • super-상위 클래스 생성자 호출 super(매개변수) 형식

  27. 5 상속과 생성자 • 실습예제 상속관계의 클래스에서 묵시적 생성자 선언 상속관계의 클래스에서 묵시적 생성자 선언

  28. 5 상속과 생성자 • 실습예제 상속관계의 클래스에서 묵시적 생성자 선언 하위 클래스로부터 객체 생성. 상위 클래스 묵시적 생성자 수행

  29. 5 상속과 생성자 • 프로그램 설명 • 03, 10, 17 : 3개의 클래스가 상속관계를 이루고 있으면서, 묵시적인 생성자를 모두 가지고 있다. • 24 : 최하위 클래스에서 객체를 생성하면, 상위 클래스의 묵시적 생성자들이 먼저 수행된다. 즉 new 문장에 의해 객체가 생성되면 묵시적 생성자는 무조건 수행된다.

  30. 5 상속과 생성자 • 실습예제 매개변수가 있는 생성자 선언 하위 클래스의 생성자 첫 번째 라인에서 상위 클래스 생성자 호출

  31. 5 상속과 생성자 • 실습예제 객체 생성. 생성자가 수행됨

  32. 6 객체의 형변환 • 자바는 클래스 계층 구조에서 상속관계의 클래스로부터 생성된 객체들 사이의 형변환을 허용 Acast타입의 객체 refA선언 Acast타입의 객체 변수 refA에 Ccast클래스의 객체를 생성하여 할당

  33. 6 객체의 형변환 • 메인 클래스를 다음과 같이 수정 Ccast클래스 멤버에 접근. 오류 발생

  34. 6 객체의 형변환 • Ccast형의 객체 변수로 refC를 선언하고, refC에 Acast형의 객체를 할당 오류 발생

  35. 6 객체의 형변환 • 클래스 사이에서 객체의 형변환 • 하위 클래스에서 생성된 객체를 상위 클래스 형의 객체 변수에 배정하는 형변환은 허용 • 반대로 상위 클래스에서 생성된 객체를 하위 클래스 형의 객체 변수에 배정할 수 없다. • 상위 클래스 형의 객체 변수에 배정된 하위 클래스 객체의 경우, 상위 클래스 형의 객체 변수를 통해서는 상위 클래스에 선언된 속성에만 접근이 가능

  36. 6 객체의 형변환 • 실습예제 3개의 상속된 클래스에 메소드오버라이딩 3개의 상속된 클래스에 메소드오버라이딩

  37. 6 객체의 형변환 • 실습예제 3개의 상속된 클래스에 메소드오버라이딩 Am 클래스의 객체 변수 r에 Am 클래스 객체 배정 Am 클래스의 객체 변수 r에 Bm클래스 객체 배정 Am 클래스의 객체 변수 r에 Cm 클래스 객체 배정

  38. 6 객체의 형변환 • 프로그램 설명 • 26-27 : 이 문장을 실행시간 측면에서 살펴보면 Am 클래스 타입의 객체 변수 r에 Cm 클래스로부터 객체를 생성하여 할당하였다. 그리고 r을 통하여 callme() 메소드를 호출하고 있다. 객체 변수 r은 callme() 메소드에 접근할 수 있는 방법을 가지고 있고, Cm 클래스에서는 Am 클래스의 메소드callme()를 오버라이딩하고 있다. 그러므로 실행시간에 수행되는 callme() 메소드는Cm 클래스에 정의된 callme() 메소드이다.

  39. 7 연산자 instanceof • instanceof • 객체가 특정 클래스나 인터페이스로부터 생성된 객체인지를 판별하여 ture또는 false 값을 반환하여 주는 이진 연산자 • type : 클래스 이름 또는 인터페이스 이름 객체 변수 instanceof type 형식

  40. 7 연산자 instanceof • 실습예제 3개의 클래스가 상속

  41. 7 연산자 instanceof • 실습예제 형변환 성공 형변환 불가

  42. 7 연산자 instanceof • 프로그램 설명 • 01~09 : 3개의 클래스가 상속관계를 형성하고 있다. • 12~23 : 각 클래스로부터 객체를 생성하여, 각 객체가 해당 클래스의 객체인지를 판별하였다. • 21 : Cn클래스로 생성된 객체 c가 An 클래스의 객체인지를 판별하고 있다. 객체 c의 클래스인 Cn클래스는 An 클래스로부터 상속된 클래스이므로 Cn클래스는 An 클래스의 모든 속성을 다 가지고 있다. 그러므로 하위 클래스 Cn으로부터 생성된 객체는 An클래스의 객체라 할 수 있다. • 23 : 상위 클래스로부터 생성된 객체 a가 하위 클래스인 Cn클래스의 객체인가를 판별하고 있다. 하위 클래스인 Cn은 상위 클래스인 An보다 추가적인 정보를 더 가진 클래스이다. 그러므로 객체 a가 Cn클래스의 객체라 할 수 없다.

  43. 7 연산자 instanceof

  44. 8 추상 클래스와 추상 메소드 • 추상 클래스 • 하위 클래스에서 구현되는 추상적인 기능만을 정의하는 클래스 • 추상 클래스에서 정의된 추상적인 기능은 하위 클래스에서 구현 271 page

  45. 8 추상 클래스와 추상 메소드 • 추상 메소드 • 추상 클래스 내에 정의되는 메소드로써 선언 부분만 있고 구현 부분이 없는 메소드 • 하위 클래스에서는 상위 클래스에서 추상 메소드로 정의된 메소드를오버라이딩하여 사용 • 추상 클래스와 추상 메소드 추상 메소드는 선언 부분만 있다. 하위 클래스에서 오버라이딩하여 사용 abstract class 클래스이름 { ........... 클래스에 기술할 수 있는 일반적인 멤버 변수와 메소드 ........... abstract void 추상메소드이름(); } 형식

  46. 8 추상 클래스와 추상 메소드 • 추상 클래스와 추상 메소드 같은 이름의 메소드를선언함으로서오버라이딩

  47. 8 추상 클래스와 추상 메소드 • 실습예제 추상 클래스와 추상 메소드 선언

  48. 8 추상 클래스와 추상 메소드 • 실습예제 서로 다른 객체에 같은 이름의 메소드 사용 서로 다른 객체에 같은 이름의 메소드 사용 서로 다른 객체에 같은 이름의 메소드 사용

  49. 8 추상 클래스와 추상 메소드 • 실습예제 객체의 형변환을 이용하여 동일한 메소드에 대해 서로 다른 결과 출력

  50. 8 추상 클래스와 추상 메소드 • 프로그램 설명 • 01~04 : 두 개의 추상 메소드를 가진 추상 클래스를 선언하였다. • 05~28 : 추상 클래스 Shape를 상위 클래스 하여 세 개의 클래스를 생성하였으며, 각각의 클래스에 추상 메소드를오버라이딩하여 구현하였다. 각각의 클래스에서 오버라이딩하여 구현된 메소드의 내부는 당연히 다르게 작성된다. • 32~40 : 각 클래스로부터 객체를 생성하여 draw() 메소드와computeArea() 메소드를 수행시켰다. 서로 다른 객체이지만 동일한 메소드를 이용하여 도형을 그리고, 면적을 계산하였다. • 42~50 : 상위 클래스인 추상 클래스 형의 객체 변수를 선언하고 그 변수에 하위 클래스의 객체를 배정하였다. 오버라이딩과 객체의 형변환을 이용하여 동일한 메시지 s.draw(), s.computeArea() 에 대해 서로 다르게 응답하는 예를 보이고 있다.

More Related