[ 단원 06 ] 상속과 다형성
학습목표 객체지향의 특징인 상속에 대해 이해하고 프로그래밍에 활용할 수 있다. • 클래스 간의 상속 관계를 구현 • 키워드 this와 super, • 상위 생성자의 호출 super() • 접근 지정자 public protected default private의 활용 객체지향의 특징인 다형성에 대해 이해하고 프로그래밍에 활용할 수 있다. • 참조형에서 변환 연산인 업 캐스팅과 다운 캐스팅 • 객체 확인 연산자 instanceof • 하위 클래스에서 상위 클래스의 메소드를 재정의하는 메소드 오버라이딩의 이해 • 메소드 오버라이딩의 동적 바인딩 이해 추상 클래스와 인터페이스를 이해하고 프로그래밍에 활용할 수 있다. • 추상 클래스의 의미와 구현 • 추상 메소드의 필요성과 구현 • 인터페이스의 의미와 구현 • 인터페이스의 필요성과 구현
1. 상속
상속과 개념과 사례 상속(inheritance) Section 1 상속 p190 상속과 개념과 사례 상속(inheritance) 하위 클래스는 상위 클래스의 특징인 필드와 메소드를 그대로 물려받을 수 있는 특성 차량, 자전거, 자동차, 기차를 클래스로 표현 이들 클래스 간의 계층 구조에서 상속이라는 특징을 파악 하위인 자전거와 자동차 그리고 기차는 상위인 차량이라는 특성을 모두 물려 받을 수 있음
키워드 extends(1) [A는 B이다]는 [이다 관계(is-a relationship)]가 성립 Section 1 상속 키워드 extends(1) [A는 B이다]는 [이다 관계(is-a relationship)]가 성립 B는 상위클래스, A는 하위 클래스 관계로 규정 하위 클래스는 상위 클래스의 필드와 메소드를 상속받을 수 있는 특징 즉 [자동차는 차량이다]가 성립 차량에 정의될 수 있는 필드와 메소드는 모두 자동차에서 상속받을 수 있음 상위 클래스 슈퍼super 클래스 또는 부모parent 클래스, 기본base 클래스 하위 클래스 서브sub 클래스 또는 자식child 클래스, 유도derived 클래스
키워드 extends(2) 하위_클래스이름 extends 상위_클래스이름 모든 클래스의 최상위는 Object라는 클래스 Section 1 상속 키워드 extends(2) 하위_클래스이름 extends 상위_클래스이름 모든 클래스의 최상위는 Object라는 클래스
상위 클래스의 필드와 메소드를 상속 하위 클래스 상위 클래스의 멤버인 필드와 메소드를 다시 구현 없이 사용 Section 1 상속 상위 클래스의 필드와 메소드를 상속 하위 클래스 상위 클래스의 멤버인 필드와 메소드를 다시 구현 없이 사용
Section 1 상속 실습예제 6-1, 6-2 차량을 위한 클래스 차량의 하위 클래스인 자동차를 위한 클래스
자기 자신과 상위 객체의 구분 this와 super this는 객체 자신을 의미하는 키워드 Section 1 상속 자기 자신과 상위 객체의 구분 this와 super this는 객체 자신을 의미하는 키워드 마찬가지로 super는 상위 객체를 의미하는 키워드
Section 1 상속 실습예제 6-3 차량의 하위 클래스인 자동차를 위한 클래스
상위 생성자 호출 생성자 구현 첫 줄에서의 super( ) super()는 상위 클래스의 기본 생성자를 호출하는 문장 Section 1 상속 상위 생성자 호출 생성자 구현 첫 줄에서의 super( ) super()는 상위 클래스의 기본 생성자를 호출하는 문장 생성자의 첫 줄에서 상위 생성자를 호출하는 super() 또는 super(…)를 명시적으로 호출하지 않는다면 첫 줄에서 무조건 자동으로 super()를 호출 자동으로 사용되는 기본 생성자의 첫 줄은 무조건 super()를 호출
상위 객체가 먼저 생성 생성자 호출에 의해 객체가 생성될 때 항상 상위 객체를 위한 필드와 메소드가 먼저 생성된 후 Section 1 상속 상위 객체가 먼저 생성 생성자 호출에 의해 객체가 생성될 때 항상 상위 객체를 위한 필드와 메소드가 먼저 생성된 후 하위 객체가 생성
상위 클래스에서 기본 생성자 구현의 중요성 사용자가 직접 구현하는 생성자에서 첫 줄 Section 1 상속 상위 클래스에서 기본 생성자 구현의 중요성 사용자가 직접 구현하는 생성자에서 첫 줄 상위 생성자의 호출인 super() 또는 super(인자)가 아니면 자동으로 기본 생성자 super()를 호출 이 때 상위 클래스에서 기본 생성자를 사용할 수 없다면 문법 오류가 발생
상위 클래스에서 기본 생성자가 없는 경우의 문제 Section 1 상속 상위 클래스에서 기본 생성자가 없는 경우의 문제 다음 Vehicle과 같이 인자가 있는 생성자를 구현한다면 더 이상 기본 생성자는 구현 없이 자동으로 사용 불가능 하위 클래스 생성자 구현에서 super()를 사용한다면 문법 오류가 발생
Section 1 상속 실습예제 6-4, 6-4 생성자를 구현한 차량 클래스 자동차를 위한 생성자의 구현과 객체의 생성
클래스 접근 지정자 클래스 접근 지정자는 public과 [default] 방식 키워드 public을 사용한 클래스 Section 1 상속 클래스 접근 지정자 클래스 접근 지정자는 public과 [default] 방식 키워드 public을 사용한 클래스 다른 모든 클래스에서 사용 가능 접근 지정자를 아무것도 기술하지 않은 default 클래스 동일한 패키지의 다른 클래스에서만 사용 가능 그러므로 default 클래스는 package 클래스라고도 부름
필드와 메소드 접근 지정자 public, protected [default], private 4가지 종류 Section 1 상속 필드와 메소드 접근 지정자 public, protected [default], private 4가지 종류
Section 1 상속 실습예제 6-6 은행계좌를 추상화한 상위 클래스
Section 1 상속 실습예제 6-7 저축계좌를 표현한 클래스
Section 1 상속 실습예제 6-8 동일한 패키지에서 SavingAccount의 사용
Section 1 상속 실습예제 6-9 다른 패키지의 Account를 상위로 하는 하위 클래스
Section 1 상속 실습예제 6-10 다른 패키지에서 SavingAccount를 사용하는 클래스 CheckTest
2. 다형성
Section 2 다형성 p208 클래스 Person 학교의 교직원과 학생 정보를 표현하기 위한 계층도
Section 2 다형성 실습예제 6-12, 6-13 교직원과 직원 클래스
하위 객체를 상위 클래스형 변수에 대입 업 캐스팅 업 캐스팅의 제약 Section 2 다형성 하위 객체를 상위 클래스형 변수에 대입 업 캐스팅 하위 객체는 상위 클래스형 변수에 대입이 가능, 상위로의 자료형 변환 업 캐스팅은 하위인 교직원은 상위인 사람이라는 개념이 성립 업 캐스팅의 제약 업 캐스팅된 변수로는 하위 객체의 멤버를 참조할 수 없는 제약 Faculty 형 변수 f로는 접근 지정자만 허용하면 모든 멤버를 접근 가능 Person 형 변수 p로는 Person의 멤버인 name과 number만 접근이 가능
Section 2 다형성 실습예제 6-14 참조형의 형 넓히기 변환
상위 객체를 하위 클래스형 변수에 대입 다운 캐스팅 상위 클래스 형을 하위 클래스 형으로 변환 Section 2 다형성 상위 객체를 하위 클래스형 변수에 대입 다운 캐스팅 상위 클래스 형을 하위 클래스 형으로 변환 다운 캐스팅은 반드시 명시적인 형변환 연산자 (하위 클래스)가 필요 만일 형변환 연산자가 없으면 컴파일 시간에 오류 발생
다운 캐스팅의 실행 오류 컴파일 시간 실행 시간 상속 관계만 성립하면 다운 캐스팅은 가능 Section 2 다형성 다운 캐스팅의 실행 오류 컴파일 시간 상속 관계만 성립하면 다운 캐스팅은 가능 실행 시간 실제 객체가 할당되지 않았다면 실행 시간에 오류가 발생
Section 2 다형성 객체 확인 연산자 연산자 instanceof
오버라이딩 메소드 오버라이딩(method overriding) 정의 메소드 오버라이딩의 목적 Section 2 다형성 오버라이딩 메소드 오버라이딩(method overriding) 정의 상위 클래스의 동일한 메소드를 하위 클래스에서 다시 정의하는 것 메소드 재정의(method redefinition) 또는 메소드 대체(method replacement) 라고도 표현 메소드 오버라이딩의 목적 상위 클래스에서 이미 정의한 메소드를 다시 수정하지 않고 하위 클래스에서 좀 더 보완 수정하거나 완전히 새로운 것으로 대체하기 위한 방법
오버라이딩 조건 조건 ❶ 메소드의 반환 값과 메소드 이름, 매개변수는 반드시 같아야 함 Section 2 다형성 오버라이딩 조건 조건 ❶ 메소드의 반환 값과 메소드 이름, 매개변수는 반드시 같아야 함 ❷ 접근 지정자는 하위 클래스의 메소드가 보다 공개적 상위 클래스의 메소드가 public이면 오버라이딩되는 메소드는 public만 가능 상위 메소드가 protected이면 하위 메소드는 public과 protected만 가능 상위 메소드가 default이면 하위 메소드는 public과 protected, default만 가능 ❸ 메소드 수정자가 final, private인 메소드는 오버라이딩될 수 없음
Section 2 다형성 메소드 오버라이딩 예
키워드 final 클래스 앞의 final 메소드 반환형 앞의 지정자 final Section 2 다형성 키워드 final 클래스 앞의 final 클래스가 더 이상 상속되지 못한다는 의미의 키워드 메소드 반환형 앞의 지정자 final 더 이상 하위 클래스에서 메소드 오버라이딩이 허용되지 않도록 지정하는 키워드
Section 2 다형성 동적 바인딩 오버라이딩 메소드 호출 가장 하위 객체의 메소드 실행
Section 2 다형성 실습예제 6-21 메소드 재정의를 알아보는 예제
메소드 오버로딩 이름이 같으며 인자가 다른 여러 메소드 구현 하나의 클래스 또는 상속 관계에 있는 클래스 내부에서 Section 2 다형성 메소드 오버로딩 이름이 같으며 인자가 다른 여러 메소드 구현 하나의 클래스 또는 상속 관계에 있는 클래스 내부에서 인자가 다르나 이름이 같은 메소드가 여러 개 정의될 수 있는 특징
3. 추상클래스와 인터페이스
추상 클래스(1) 추상 클래스(abstract class)의 의미 다른 일반 클래스와 구별되는 특징 Section 3 추상클래스와 인터페이스 p224 추상 클래스(1) 추상 클래스(abstract class)의 의미 클래스 계층구조에서 상위에 위치, 하위 클래스를 대표하는 클래스 추상의 의미대로 “구체적”이지 않은 클래스 보다 구체적인 하위 클래스를 대표하는 클래스 다른 일반 클래스와 구별되는 특징 ① 추상 클래스는 직접 객체화(instantiation)될 수 없다. 즉 생성자를 사용하여 객체를 생성할 수 없다. ② 추상 클래스는 다른 클래스에 의하여 상속되어야 한다. 즉 하위 클래스가 없는 추상클래스는 의미가 없다. ③ 추상 클래스는 하위 클래스가 있어야 하므로 추상 클래스 구현 시 클래스 앞에 키워드 final이 올 수 없다.
Section 3 추상클래스와 인터페이스 p224 추상 클래스(2) 키워드 abstract
추상 클래스 내부의 추상 메소드 추상 메소드 추상 클래스 메소드 몸체가 없는 메소드 Section 3 추상클래스와 인터페이스 추상 클래스 내부의 추상 메소드 추상 메소드 메소드 몸체가 없는 메소드 추상 메소드 정의 시 반환형 앞에 키워드 abstract를 기술하고 메소드 몸체 구현 없이 바로 세미콜론을 삽입 추상 메소드는 private와 final이 사용될 수 없음 추상 클래스 적어도 하나 이상의 추상 메소드를 가진 클래스는 반드시 추상이어야 함 키워드 final 이용 불가능
Section 3 추상클래스와 인터페이스 하위 클래스에서 추상 메소드의 구현
Section 3 추상클래스와 인터페이스 실습예제 6-24 추상 클래스 Shape 구현
실습예제 6-25, 26 Circle.java Rectangle.java Section 3 추상클래스와 인터페이스 실습예제 6-25, 26 Circle.java 원을 표현한 클래스로 상위 클래스 Shape의 추상 메소드 draw( )를 구현 Rectangle.java 사각형을 표현한 클래스로 상위 클래스 Shape의 추상 메소드 draw( )를 구현 package inheritance.abstratinterface; public class Circle extends Shape { public class Rectangle extends Shape { double radius; double width; double height; public Circle(double x, double y, double radius) { super(x, y); public Rectangle(double x, double y, double width, double height) { this.radius = radius; } public void draw() { this.width = width; super.drawCenter(); this.height = height; System.out.printf("반지름: %f, ", radius); System.out.printf("원 면적: %f\n", radius*radius*Math.PI); System.out.printf("가로: %f, 세로: %f, ", width, height); System.out.printf("사각형 면적: %f\n", width*height);
Section 3 추상클래스와 인터페이스 실습예제 6-27 추상 클래스 Shape 형의 변수로 객체의 추상 메소드 호출
인터페이스의 의미와 정의 IT에서 인터페이스 자바에서 인터페이스 인터페이스는 컴퓨터와 다른 주변기기를 연결하는 표준을 의미 Section 3 추상클래스와 인터페이스 인터페이스의 의미와 정의 IT에서 인터페이스 인터페이스는 컴퓨터와 다른 주변기기를 연결하는 표준을 의미 자바에서 인터페이스 해야 할 작업의 구체적 구현 없이 기능만 선언한 클래스 하위 클래스가 수행해야 하는 메소드와 필요한 상수만을 미리 추상적으로 정의해 놓은 특별한 클래스 인터페이스는 다중 상속(multiple inheritance)을 지원 자바의 일반 클래스는 다중 상속을 지원하지 않음 키워드 interface
인터페이스 상속 키워드 extends 키워드 implements 인터페이스를 상속받는 클래스 인터페이스들 간의 상속 Section 3 추상클래스와 인터페이스 인터페이스 상속 키워드 extends 인터페이스들 간의 상속 다중 상속인 경우 상위 인터페이스 여러 개를 쉼표로 구분하여 나열 키워드 implements 인터페이스를 상속받는 하위 클래스를 정의할 때는 사용 인터페이스를 상속받는 클래스 상위 인터페이스에서 정의한 모든 추상 메소드를 구현
Section 3 추상클래스와 인터페이스 인터페이스 설계