핵심 Java Programming Ch05. 상속 Phylogenetic: 계통, 발생(학)의
목차 5.1 상속의 기본 5.2 프로그래밍 예 5.3 메쏘드 오버라이딩과 상속에서의 영역 규칙 5.4 super 5.5 다형성 Ch05. 상속 목차 5.1 상속의 기본 5.2 프로그래밍 예 5.3 메쏘드 오버라이딩과 상속에서의 영역 규칙 5.4 super 5.5 다형성 5.6 강제 형 변환(Casting) 5.7 final 과 final static 5.8 소프트웨어 재사용과 객체 지향 분석 및 설계 Hominidae.: 진원류 2
5.1 상속의 기본 상속 OOP의 강력한 프로그래밍 기술 가운데 하나 Ch05. 상속 5.1 상속의 기본 상속 OOP의 강력한 프로그래밍 기술 가운데 하나 일반적인 클래스와 특수한 클래스의 공통적인 것은 다시 프로그래밍하지 않고 재사용 특수한 클래스는 일반적인 클래스의 모든 특성을 상속받음으로써 개발자는 새로운 특징만 추가 ▶Vehicles 클래스는 기반 클래스(base class) 또는 수퍼 클래스(super class) ▶Automobiles클래스는 파생클래스(derived class) 또는 서브 클래스(sub class) Vehicles -속도 -승차인원 Automobiles -제조회사 -배기량 Hominidae.: 진원류 3
5.1 상속의 기본_ IsA관계와 HasA관계 객체들 사이에 존재하는 관계(IsA 관계,HasA 관계) IsA 관계 Ch05. 상속 5.1 상속의 기본_ IsA관계와 HasA관계 객체들 사이에 존재하는 관계(IsA 관계,HasA 관계) IsA 관계 한 클래스가 다른 클래스의 서브타입/특수한 형태 쏘나타는 승용차 이지만(IsA), 승용차는 반드시 쏘나타일 필요는 없다. 자바에서는 extends 키워드 사용 자바에서 모든 객체는 Object 객체와 IsA 관계 Object 클래스는 클래스 계층 구조에서 최상위 클래스 class Sonata extends Car{ // Sonata is a (IsA) Car. ………. } Hominidae.: 진원류 4
5.1 상속의 기본_ IsA관계와 HasA관계 Component 클래스의 계층 구조 Ch05. 상속 5.1 상속의 기본_ IsA관계와 HasA관계 Component 클래스의 계층 구조 public class Button extends Component public class A{……….} //기반 클래스를 명시하지 않으면~~ public class A extends Object {………} Hominidae.: 진원류 5
5.1 상속의 기본_ IsA관계와 HasA관계 HasA 관계 Ch05. 상속 5.1 상속의 기본_ IsA관계와 HasA관계 HasA 관계 하나의 객체가 다른 객체를 포함하고 있든지 혹은 사용하고 있는 경우 승용차는 엔진을 가지고 있으므로 엔진에 대해서 HasA관계, 승용차는 엔진에 대해서 IsA관계 가지고 있지 않음 구분 클래스 관계 is a 특정 객체가 다른 객체에게 자신의 능력을 포함시켜주는 상속 관계 has a 특정 객체 내에서 다른 객체를 가지고 있다는 의미 Hominidae.: 진원류 6
5.2 프로그래밍 예 파생 클래스(derived class) 기반 클래스(base class) 상속 Ch05. 상속 5.2 프로그래밍 예 파생 클래스(derived class) Student도 Person이므로 Student 클래스를 Person클래스의 파생 클래스(derived class)로 정의 기반 클래스(base class) Student 클래스에 대한 Person 클래스를 가리킴 즉, 상위 수퍼 클래스(super class) 상속 파생 클래스는 기반 클래스의 모든 인스턴스 변수와 메쏘드를 상속 필요에 따라서 추가적인 인스턴스 변수와 메쏘드를 덧붙임 Person Student Employee Faculty Staff 실습5.1: Person.java 실습5.2: Student.java 실습5.3: Employee.java 실습5.4: Factulty.java 실습5.5: Staff.java 실습5.6: InheritanceDemo.java Hominidae.: 진원류 7
5.2 프로그래밍 예 Student객체 s는 setName()을 정의하지 않았지만 Person에서 상속받아서 Ch05. 상속 5.2 프로그래밍 예 Student객체 s는 setName()을 정의하지 않았지만 Person에서 상속받아서 s.setName("Hong, Kildong"); 사용 Student클래스에서 변수와 메쏘드를 추가 실습 5.2 인스턴스 변수 3개(grad, studentNo, major) 추가 메쏘드 7개(setGrade(), getGrade(), setStudentNo(), getStudentNo(), setMajor(), getMajor(), Info()) 추가 세 개의 생성자 등 추가 Student s = new Student(); s.setName("Hong, Kildong"); Hominidae.: 진원류 8
Ch05. 상속 5.2 프로그래밍 예 인스턴스 변수 메쏘드 생성자 9
5.2 프로그래밍 예 P[0] = student; // p[0]은 원래 Person 객체였지만 Student 객체로 변환 Ch05. 상속 5.2 프로그래밍 예 P[0] = student; // p[0]은 원래 Person 객체였지만 Student 객체로 변환 public class InheritanceDemo { public static void main(String[] args){ Person[] p = new Person[3]; Student student = new Student("홍길동", 24, 3, 200111723, "컴퓨터공학과"); Faculty professor = new Faculty("김교수", 54, "부산시 남구", 3000000, "공과대학"); professor.setCourse("컴퓨터 알고리즘"); Staff staff = new Staff("박과장", 42, 2000000, "대학본부"); staff.setDepartment("서무과"); p[0] = student; p[1] = professor; p[2] = staff; for(int i=0; i<p.length; i++){ System.out.println("<" + (i + 1) + ">-------"); p[i].info(); } Hominidae.: 진원류 10
[실습] “실습 5.1” ~ “실습 5.6” 따라 해보기 Report#1 검사(TV를 제어하는 프로그램) Ch05. 상속 [실습] “실습 5.1” ~ “실습 5.6” 따라 해보기 Report#1 검사(TV를 제어하는 프로그램) 예외 상황 처리 테스트 소스 Review 및 개별 Q&A 과제 평가(10점~0점) 11
5.3 메쏘드 오버라이딩과 상속에서의 영역 규칙 InheritanceDemo의 main()메쏘드 Ch05. 상속 5.3 메쏘드 오버라이딩과 상속에서의 영역 규칙 InheritanceDemo의 main()메쏘드 p[0].info() 가리키는 메쏘드? 기반클래스 person의 info()메쏘드 파생클래스 student의 info()메쏘드 기반 클래스의 메쏘드 정의를 오버라이드(override) 파생 클래스가 기반 클래스와 메쏘드 이름, 인자의 수, 형이 모두 같은 경우 파생 클래스의 메쏘드 사용 [비교] 메쏘드 중첩(overloading) 메쏘드 이름만 같고, 인자의 수나 형이 다른 경우 상속에서의 영역 public이면 어떤 클래스에서도 접근 가능 (일반적으로 모든 인스턴스 변수는 private로 선언됨) private으로 선언되면 선언된 클래스 내에서만 접근 허용 메쏘드 내의 지역 변수는 외부에서는 접근 불허 Hominidae.: 진원류 12
5.3 메쏘드 오버라이딩과 상속에서의 영역 규칙 protected People.java Student2.java Ch05. 상속 5.3 메쏘드 오버라이딩과 상속에서의 영역 규칙 protected public과 private의 중간쯤 해당 자신의 파생 클래스에게는 변수와 메쏘드의 접근을 허용 다른 클래스에게는 접근 금지 People.java [실습5.1]Person.java를 [실습5.7]People.java로 변경 People.java에서 name은 protected Student2.java에서 직접 접근 가능 Student2.java OOP의 개념으로 보면 좋은 방법 아님 인스턴스 변수는 가급적 private로 선언해서 보호 클래스내의 메쏘드를 인스턴스 변수에 접근하는 방법이 안전 Hominidae.: 진원류 System.out.println("Name: " + theName()); 이 아닌 System.out.println("Name: " + name); 으로 직접 접근 가능 13
5.4 super Super 상속받을 메쏘드에 약간의 코드 추가 Ch05. 상속 5.4 super Super 상속받을 메쏘드에 약간의 코드 추가 예 : 파생 클래스의 display()메쏘드에서 수퍼클래스의 display()에 없는 일을 해준 다음, 수퍼클래스의 display()를 상속받고 싶다면 상속받지 않고, 메쏘드 오버라이딩으로 새로운 메쏘드를 작성해도 되지만, 공통적인 부분은 수퍼 클래스에서 상속받는 것이 OOP의 기본 개념 실습5.2, 5.3, 5.4의 info()메쏘드는 각각 수퍼클래스의 info()메쏘드를 super.info()를 통해서 호출하고, 필요 정보 추가 public void display(Graphics g) { // 파생 클래스의 display() 메쏘드 g.setColor(color); // 그래픽 객체의 색깔 정하기 super.display(g); // 수퍼클래스의 display() 메쏘드 상속 } Hominidae.: 진원류 14
5.5 다형성(polymorphism) 4장의 다형성(polymorphism) 5장의 다형성(polymorphism) Ch05. 상속 5.5 다형성(polymorphism) 4장의 다형성(polymorphism) 메쏘드 중복의 관점에서 다형성 5장의 다형성(polymorphism) 클래스 계층 구조에서 메쏘드의 다형성 실습5.9.5, 실습5.10 다형성(polymorphism) main()에서 동일 메쏘드 animal.talk() 수행 클래스 Dog과 Pig의 talk() 메쏘드를 각각 부름 자바 시스템이 객체와 관련된 talk() 메쏘드 선택 다형성 기법을 사용하지 않는 다면 비 효율적 if(animal == aPig) aPig.talk(); if(animal == aDog) aDog.talk(); Hominidae.: 진원류 15
5.5 다형성(polymorphism) Ch05. 상속 16 Hominidae.: 진원류 //실습5.10 : AnimalDemo2.java public class AnimalDemo2 { public static void main(String[] args) { Pig aPig = new Pig(); Dog aDog = new Dog(); Snake aSnake = new Snake(); Animal animal; animal = aDog; animal.talk(); animal = aPig; animal = aSnake; } class Animal { private int legs = 4; public void talk() { System.out.println("Animals can't talk!"); class Dog extends Animal { System.out.println("Dog : BARK"); class Pig extends Animal { System.out.println("Pig : GRUNT"); class Snake extends Animal { private int legs = 0; Hominidae.: 진원류 16
5.6 강제 형 변환(Casting) 승급(promotion) 강등(demotion) Ch05. 상속 5.6 강제 형 변환(Casting) 승급(promotion) 서브 클래스의 객체를 수퍼 클래스의 객체로 치환 그 역은 타당하지 않다 Animal animal = aDog; // 승급의 예 : 타당함 Dog객체 aDog은 Animal의 서브클래스이기 때문… 강등(demotion) 수퍼클래스의 객체는 서브클래스의 객체로 치환될 수 없음 틀린 예로서 컴파일러에 의해서 오류가 검출 Dog aDog = animal; // 강등(demotion)의 예 : 오류 Hominidae.: 진원류 17
5.6 강제 형 변환(Casting) 강제 형 변환(casting) Ch05. 상속 5.6 강제 형 변환(Casting) 강제 형 변환(casting) 프로그래머가 명시적으로 강제 형 변환(casting)을 시키주는 경우 강등도 가능 변수의 데이터형 명시적 변경 Dog aDog = (Dog) animal; // 강제 형 변환의 예 : 타당 Hominidae.: 진원류 18
5.7 final과 final static 메쏘드를 final로 표기 클래스 전체가 final Ch05. 상속 5.7 final과 final static 메쏘드를 final로 표기 메쏘드는 더 이상 오버라이드 할 수 없음 대부분의 라이브러리는 키워드 final을 붙임 클래스 전체가 final 이 클래스는 서브 클래스를 가질 수 없다는 의미 final static 변수는 상수를 선언하는데 사용 일반적으로 final static은 대문자로 구성 area = Math.PI * r * r; // PI: Math 클래스의 상수 final float CmperInch = 2.45; //상수 Hominidae.: 진원류 public class Constants{ public final static float C = 3.0E+8F; public final static int SCREEN_WIDTH = 640; } 19
5.8 소프트웨어 재사용과 객체 지향 분석 및 설계 소프트웨어는 사실“소프트(soft)”하지 못함 OOP Ch05. 상속 5.8 소프트웨어 재사용과 객체 지향 분석 및 설계 소프트웨어는 사실“소프트(soft)”하지 못함 약간의 변경만 시켜도 금방 파괴 프로그래머는 소프트웨어의 변경 꺼림 이러한 특성들 때문에 OOP가 등장 OOP 필요로 하는 행위의 일부를 상속 다르게 행동하고 싶은 부분은 오버라이드(override) 추가하고 싶은 부분은 새로운 메쏘드 작성 Hominidae.: 진원류 20
5.8 소프트웨어 재사용과 객체 지향 분석 및 설계 OOP 프로그래머의 작업 Ch05. 상속 5.8 소프트웨어 재사용과 객체 지향 분석 및 설계 OOP 프로그래머의 작업 1. 프로그램의 요구 사항 분석 2. 필요한 것을 위한 라이브러리 클래스(API) 찾음 3. 필요한 라이브러리 클래스(API)를 확장 OOP 프로그램이 기존의 프로그램보다 훨씬 짧은 이유 객체지향 분석(Object-Oriented Analysis: OOA)과 객체지향 설계Object-Oriented Design: OOD) OOP 실제 프로그램의 코딩 이전에 종이나 칠판에 프로그램을 배치해 볼 수 있는 방법 제공 14장 UML(Unified Modeling Language) Hominidae.: 진원류 21
5.8 소프트웨어 재사용과 객체 지향 분석 및 설계 UML(United Modeling Language) Ch05. 상속 5.8 소프트웨어 재사용과 객체 지향 분석 및 설계 UML(United Modeling Language) G.Booch, I.Jacobson, J.Rumbaugh 등은 소프트웨어 개발에 객체지향 기법을 도입하려고 시도 소프트웨어 모델링에 기존의 여러 다른 기법을 통합한 방법으로서 소프트웨어 개발자가 OOA/OOD 기법을 사용하는데 표준 언어와 표기법 제공 Hominidae.: 진원류 22
Ch05. 상속 [실습] class Car { int speed; void speedUp() { speed++; } void speedDown() { speed--; void stop() { speed=0; “실습 5.7” ~ “실습 5.12” 따라 해보기 문1> Car클래스를 상속 받는 Bus 클래스를 만들어라. Bus 클래스에는 탑승 인원 정보와 버스회사 이름을 저장할 수 있도록 작성한다. <추가할 맴버 변수> int passenger; //탑승 인원 String company;//버스 회사 이름 문2> Bus 클래스 객체를 생성하여 버스회사이름, 탑승인원, 속도 정보를 입력하고 출력하는 프로그램을 작성하여라. 23
Q&A 24