Power Java 제 11 장상속
이번장에서학습할내용 상속이란? 상속의사용 메소드재정의 접근지정자 상속과생성자 Object 클래스 종단클래스 상속을코드를재사용하기위한중요한기법입니다.
상속이란? 상속의개념은현실세계에도존재한다.
상속의장점 상속의장점 상속을통하여기존클래스의필드와메소드를재사용 기존클래스의일부변경도가능 상속을이용하게되면복잡한 GUI 프로그램을순식간에작성 상속은이미작성된검증된소프트웨어를재사용 신뢰성있는소프트웨어를손쉽게개발, 유지보수 코드의중복을줄일수있다.
상속 class Car { int speed; class SportsCar extends Car { int turbo; 상속한다는의미
수퍼클래스는서브클래스를포함
상속의예 수퍼클래스 서브클래스 Animal( 동물 ) Lion( 사자 ), Dog( 개 ), Cat( 고양이 ) Bike( 자전거 ) MountainBike( 산악자전거 ) Vehicle( 탈것 ) Car( 자동차 ), Bus( 버스 ), Truck( 트럭 ), Boat( 보트 ), Motocycle( 오토바이 ), Bicycle( 자전거 ) Student( 학생 ) GraduateStudent( 대학원생 ), UnderGraduate( 학부생 ) Employee( 직원 ) Manager( 관리자 ) Shape( 도형 ) Rectangle( 사각형 ), Triangle( 삼각형 ), Circle( 원 )
상속의예 public class Car { // 3 개의필드선언 int speed; // 속도 int gear; // 기어 public String color; // 색상, 테스트를위하여공용필드로만들자. public void speedup(int increment) { // 속도증가메소드 speed += increment; public void speeddown(int decrement) { // 속도감소메소드 speed -= decrement; class SportsCar extends Car { // Car 를상속받는다. ; boolean turbo; public void setturbo(boolean newvalue) { // 터보모드설정메소드 turbo = newvalue;
Car 와 SportsCar
상속예제 public class Test { public static void main(string[] args) { SportsCar c = new SportsCar(); c.color = "Red"; c.speedup(100); c.speeddown(30); c.setturbo(true); 서브클래스는수퍼클래스의필드와메소드를마치자기것처럼사용할수있다.
상속의계층구조
상속은중복을줄인다. 상속
접근지정자
예제 class Employee { public String name; // 이름 : 공용멤버 String address; // 주소 : 패키지멤버 protected int salary; // 월급 : : 보호멤버 private int RRN; // 주민등록번호 : 전용멤버 public String tostring() { return name + ", " + address + "," + RRN + ", " + salary; Manager Employee
예제 class Manager extends Employee { private int bonus; public void printsalary() { System.out.println(name + "(" + address + "):" + (salary + bonus)); public void printrrn() { System.out.println(RRN); public class ManagerTest { public static void main(string[] args) { Manager m = new Manager(); 오류 m.printrrn();
예제
메소드재정의 메소드재정의 (method overriding): 서브클래스가필요에따라상속된메소드를다시정의하는것
메소드재정의의예 class Animal { public void sound() { ; class Dog extends Animal { public void sound() { System.out.println(" 멍멍!"); ; public class DogTest { public static void main(string[] args) { Dog d = new Dog(); d.sound(); ; Animal 1부터멍멍! 10까지의정수의합 = 55
메소드를재정의하려면 메소드의이름, 반환형, 매개변수의개수와데이터타입이일치하여야한다. public class Animal { public void sound() { ; 재정의가아님 public class Dog extends Animal { public int sound() { ;
어노테이션 public class Animal { public void sound() { ; 재정의가아님 class Dog extends Animal { @Override void saund() { // 오류발생! System.out.println(" 멍멍!"); 1 부터 10 까지의정수의합 = 55 The method saund() of type Dog must override or implement a supertype method
중복정의와재정의
super 키워드 class ParentClass { int data=100; public void print() { System.out.println(" 수퍼클래스의 print() 메소드 "); public class ChildClass extends ParentClass { int data=200; public void print() { super.print(); System.out.println(" 서브클래스의 print() 메소드 "); System.out.println(this.data); System.out.println(super.data); public static void main(string[] args) { ChildClass obj = new ChildClass(); 수퍼클래스의 print() 메소드 obj.print(); 서브 1부터클래스의 10까지의 print() 정수의메소드합 = 55 200 100
상속과생성자 서브클래스의객체가생성될때, 서브클래스의생성자만호출될까? 아니면수퍼클래스의생성자도호출되는가? class Shape { public Shape(String msg) {... ; class Rectangle extends Shape { public Rectangle() {... ; public class RectangleTest public static void main(string[] args) { Rectangle r = new Rectangle(); ;
명시적인생성자호출 super 를이용하여서명시적으로수퍼클래스의생성자호출 class Shape { public Shape(String msg) { System.out.println("Shape 생성자 () " + msg); ; public class Rectangle extends Shape { public Rectangle(){ super("from Rectangle"); // 명시적인호출 System.out.println("Rectangle 생성자 ()"); ;
묵시적인생성자호출 class Shape { public Shape(String msg) { System.out.println("Shape 생성자 ()"); ; class Rectangle extends Shape { public Rectangle() { ; System.out.println("Rectangle 생성자 ()"); 1 부터 10 까지의정수의합 = 55 Shape 생성자 Rectangle 생성자
Object 클래스 Object 클래스는 java.lang 패키지에들어있으며자바클래스계층구조에서맨위에위치하는클래스
Object 의메소드 protected Object clone() 객체자신의복사본을생성하여반환한다. public boolean equals(object obj) obj 가이객체와같은지를나타낸다. protected void finalize() 가비지콜렉터에의하여호출된다. public final Class getclass() 객체를생성한클래스정보를반환한다. public int hashcode() 객체에대한해쉬코드를반환한다. public String tostring() 객체의문자열표현을반환한다.
getclass() class Car {... public class CarTest { public static void main(string[] args) { Car obj = new Car(); System.out.println("obj is of type " + obj.getclass().getname()); 1obj 부터 is 10까지의 of type 정수의 Car 합 = 55
equals() 메소드 class Car { private String model; public Car(String model) { this.model= model; public boolean equals(object obj) { if (obj instanceof Car) return model.equals(((car) obj).model); else return false; public class CarTest { public static void main(string[] args) { Car firstcar = new Car("HMW520"); Car secondcar = new Car("HMW520"); Object 의 equals() 를재정의 if (firstcar.equals(secondcar)) { System.out.println(" 동일한종류의자동차입니다."); else { System.out.println(" 동일한종류의자동차가아닙니다."); 동일한 1부터 10종류의까지의자동차입니다정수의합 = 55.
tostring() Object 클래스의 tostring() 메소드는객체의문자열표현을반환 public class Car { private String model; public Car(String model) { this.model = model; public String tostring() { return 모델 : + model; Object 의 tostring() 를재정의
종단클래스와종단메소드 키워드 final 을붙이면상속이나재정의할수없다. class Baduk { enum BadukPlayer { WHITE, BLACK... final BadukPlayer getfirstplayer() { return BadukPlayer.BLACK; 재정의할수없도록한다.
Q & A