상속 이충기 명지대학교컴퓨터공학과
상속 Q: 건설회사는기존아파트와조금다르거나추가적인특징들을가진새아파트를지을때어떻게하는가? A: 2
상속 상속 (inheritance) 은클래스들을연관시키는자연스럽고계층적인방법이다. 상속은객체지향프로그래밍의가장중요한개념중의하나이다. 상속은 은 이다 라는관계 (is-a relationship) 를나타낸다. 이관계를적용하여클래스들을상하관계로연결하는것이상속이다. 3
상속 상속은기존클래스로부터새로운클래스를만드는것이다. 기존클래스는부모클래스혹은상위클래스 (superclass) 라고부른다. 새로만들어진클래스는자식클래스혹은하위클래스 (subclass) 라고부른다. 자식클래스는부모클래스에정의된변수들과메소드들을상속받는다. 4
상속의목적 한클래스를처음부터새로만들려고하면필요한변수들과메소드들을전부다새로만들어야한다. 그러나상속을이용하여기존클래스로부터새클래스를만들면일이훨씬수월해진다. 왜냐하면기존클래스의변수들과메소드들중수정할필요가있는것만재정의하고새로필요한변수들과메소드들만정의하면되기때문이다. 상속의주목적은새로운소프트웨어를만들기위해기존의소프트웨어를재사용함으로써기존소프트웨어의설계, 구현및시험에투입된모든시간과노력을재활용하는것이다. 5
하위클래스만들기 상속관계를설정하기위해서 extends 라는키워드를사용한다. // subclass_name 라는클래스의정의 class subclass_name extends superclass_name { // 변수들과메소드들 6
하위클래스만들기 subclass_name 클래스는 superclass_name 이라는클래스로부터변수들과메소드들을자동적으로상속받는다. 상속받은변수들과메소드들중수정할필요가있다면재정의하여사용할수있다. 새로필요한변수들과메소드들이있다면새로정의하여사용한다. 7
예 : 하위클래스만들기 // 예금계좌를모델한다 public class Account { double balance; // 잔고 public double getbalance() { return balance; public void deposit( double amount) { balance = balance + amount; public void withdraw(double amount) { balance = balance - amount; 8
예 : 하위클래스만들기 // 저축예금계좌를모델한다 public class SavingsAccount extends Account { double interestrate; // 이율 public double getinterestrate() { return interestrate; public void setinterestrate(double rate) { interestrate = rate; 9
상속 상속관계는자주클래스그림 (class diagram) 으로보여진다. 화살표가부모클래스를가리킨다. 예금 저축예금 위에서 저축예금은예금이다 라는관계가성립한다. 그러나반대방향으로의관계는성립하지않는다. 10
메소드재정의 (Overriding) 하위클래스는필요하다면상속받은메소드의정의를바꿀수있다. 새메소드는상위클래스의메소드와같은머리부를가져야하나메소드몸체는달라야한다. 메소드를호출하는객체의유형이어느메소드가호출되었는지를결정한다. 11
메소드재정의 부모메소드는 super 참조를사용하여명확하게호출될수있다. 한메소드가 final 메소드로선언된다면재정의될수없다. 재정의의개념은변수들에도적용될수있다. 그러나일반적으로권장되지않는다. 12
메소드다중정의대재정의 메소드다중정의 (Overloading) 는같은클래스안에같은이름을가지나다른머리부를갖는여러메소드들이있다는것을의미한다. 메소드재정의 (Overriding) 는같은머리부를갖는두메소드를다룬다. 한메소드는부모클래스에있고다른메소드는자식클래스에있다. 메소드다중정의는우리가비슷한연산을다른데이터에대해다르게정의하게한다. 메소드재정의는우리가비슷한연산을다른객체유형에대해다르게정의하게한다. 13
클래스계층 한클래스의자식클래스가또다른클래스의부모클래스가될수있다. 이와같이부모자식관계를확장시켜계층구조로만든것이클래스계층 (Class Hierarchy) 이다. 같은부모클래스의두자식클래스들은형제들 ( 자매들 ) 이라고부른다. 클래스들의공통적인특징들은클래스계층의가능한위에놓여져야한다. 14
예 : 클래스계층도 교직원 교원 직원 전임교원시간강사계약직원 15
Object 클래스 Object 클래스는모든클래스의최상위클래스이다. 이클래스는 java.lang 패키지에정의되어있다. 모든클래스는 Object 클래스로부터상속받는다. Object 클래스는몇개의유용한메소드들을가지고있다. 예 : public boolean equals (Object o) public String tostring () 한클래스내에 tostring( ) 메소드를정의하면 Object 클래스가제공하는 tostring( ) 메소드를재정의하는것이다. 위의메소드들이어떤객체에서도호출되도록한다. 16
상속과범위 변수나메소드의범위 (Scope) 는변수나메소드가의미를가지는코드의블록이다. 상속으로말미암아이범위가상위클래스혹은그이상으로확장될수있다. 17
상속과범위 변수 : 자바는먼저변수가나온메소드를조사한다. 지역변수혹은매개변수인지를확인한다. 다음으로현클래스의변수인지를확인한다. 다음으로상위클래스의변수인지를확인한다. 자바는더이상확인할상위클래스가없을때까지상속계층구조를올라가면서확인한다. 메소드 : 메소드가클래스내에정의된메소드인지를확인한다. 다음으로상위클래스에서정의된메소드인지를확인한다. 자바는더이상확인할상위클래스가없을때까지상속계층구조를올라가면서확인한다. 18
범위명시 자바는변수나메소드가두가지의범위규칙중하나를따르라고명시할수있다 : super 예약어 : 상위클래스의변수나메소드를나타내는예약어예 : super.setname( ) this 예약어 : 현객체의메소드나변수를나타내는예약어예 : this.setname( ) 19
예 : 상속과범위 super(xxx) // 상위클래스의생성자메소드를호출한다 super.xxx // 상위클래스의변수를나타낸다 super.xxx( ) // 상위클래스의메소드를호출한다 this(xxx) this.xxx this.xxx( ) // 현클래스의생성자메소드를호출한다 // 현클래스의변수를나타낸다 // 현클래스의메소드를호출한다 주 : 다음과같이할수없다 super.super.<somemethod> 20
예제프로그램 : 직원 // 직원을모델한다 class Employee { public String name; public double salary; public Employee (String name, double salary) { this.name = name; this.salary = salary; public String getname() { return name; public void raisesalary() { salary *= 1.3; 21
예제프로그램 : 매니저 // 매니저를모델한다 class Manager extends Employee { public double bonus; public Manager (String n, double s, double b) { super(n, a); bonus = b; public void raisesalary() { // 재정의 salary *= 1.2; 22
예제프로그램 : 임원 // 임원을모델한다 class Executive extends Manager { public double stock_option; // 스톡옵션 public Executive (String n, double s, double b, double so) { super(n, s, b); stock_option = so; public void raisesalary() { // 재정의 salary = salary * 1.1; 23
예제프로그램 : 드라이버프로그램 // Employee, Manager 와 Executive 객체를만들어시험한다 class InheritanceTest { public static void main(string[] args) { Employee emp = new Employee(" 홍길동, 1000.0); Manager mng = new Manager(" 강감찬, 2000.0, 500.0); Executive exc = new Executive( 이순신, 4000.0, 1000.0, 100.0); emp.raisesalary(); mng.raisesalary(); exc. raisesalary(); System.out.println(emp.getName() + " " + emp.salary); System.out.println(mng.getName() + " " + mng.salary + " " + mng.bonus); System.out.println(exc.getName() + " " + exc.salary + " " + exc.bonus + " " + exc.stock_option); 24
생성자메소드와상속 자바의규칙 : 생성자메소드의첫줄이상위클래스의생성자메소드를호출하는문장이아니라면자바는 super( ) 를첫줄로넣는다. 따라서상위클래스의기본생성자메소드가처음에호출된다. 이규칙의예외 : this(params) 를통해다른생성자메소드를호출한다면 super( ) 에대한호출을연기할것이다. 상위클래스의다른생성자메소드를호출하기위해서그메소드를직접호출하라예 : super(name) 25
가시성수정자 가시성수정자 (Visibility Modifier) 는클래스, 변수, 메소드앞에위치하여그러한것들이이용될수있는접근의범위를나타낸다. public 으로선언된변수들과메소드들은어디서나이용할수있다. private 로선언된것들은정의된클래스내에서만이용할수있다. protected 로선언된것들은자식클래스들혹은자손클래스들내에서이용할수있다. 26
가시성과접근성 가시성수정자 : 접근여부 : public protected private 모든클래스 Yes No No 하위클래스 Yes Yes No 현클래스의 Yes Yes Yes 객체 항상가시성수정자를명시하라 27
요약 상속 하위클래스만들기 클래스계층 상속과범위 가시성수정자 28