Binary World

JAVA CLASS : 상속(Inheritance) 본문

개발자의 길/JAVA

JAVA CLASS : 상속(Inheritance)

모쿠 2017. 1. 2. 16:38

<상속(Inheritance)>


* 자바에서 상속의 개념은 부모(super) 클래스의 멤버를 자식(sub) 클래스에 물려주는 것을 의미

* 자식클래스는 부모에서 선언된 멤버 변수와 메소드들을 사용할 수 있음

* 부모클래스는 자식 클래스의 멤버 변수와 메소드를 사용할 수 없음


<Java Practice>


1. 상속의 기본 형태(기본 티비를 스마트 티비 등에 상속하는 기본 코드


* BasicTv.java (기본 티비, 부모 클래스)


package edu.java.inherit01;


public class BasicTv {

// 멤버 변수(필드, 프로퍼티)

private boolean powerOn;

private int channel;

private int volume;

// 생성자

public BasicTv() {}

// 메소드

public void turnOnOff() {

if (powerOn) {

powerOn = false;

System.out.println("TV가 꺼졌습니다...");

} else {

powerOn = true;

System.out.println("TV가 꺼졌습니다...");

}

} // end turnOnOff()


} // end class BasicTv



* SmartTv.java (스마트 티비, 자식 클래스)


package edu.java.inherit01;


// 상위(super) 클래스, 부모(parent) 클래스

// 하위 (sub) 클래스, 자식(child) 클래스, 유도(derived) 클래스

// class Subclass extends Superclass


public class SmartTv extends BasicTv {

// 멤버 변수

private String ip;

// 생성자

public SmartTv() {}

// 메소드

public String getIp(){

return ip;

}

public void setIp(String ip){

this.ip = ip;

}

} // end SmartTv 



* InheritMain01


package edu.java.inherit01;


public class InheritMain01 {


public static void main(String[] args) {

// SmartTv 클래스의 인스턴스 생성

SmartTv tv1 = new SmartTv();

tv1.turnOnOff();

tv1.setIp("192.168.11.31");

System.out.println(tv1.getIp());

BasicTv tv2 = new BasicTv();

tv2.turnOnOff();

// tv2.setIp(""); // 부모 클래스가 자식 클래스의 메소드를 사용할 수 없음.


} // end main()


} // end class InheritMain01 



* 출력화면


TV가 꺼졌습니다...

192.168.11.31

TV가 꺼졌습니다...


코멘트 : 부모 클래스로 부터 변수와 메소드를 받았기 때문에 사용 가능



2. 부모 클래스와 자식 클래스의 생성자 출력



*person.java


package edu.java.inherit02;


public class Person {

// 멤버 변수

private String name;

// 생성자

public Person() {

System.out.println("Person 생성자");

}

public Person(String name) {

this.name = name;

System.out.println("Person(name) 생성자");

}

// 메소드

public String getName() {

return name;

}

public void setName(String name){

this.name = name;

}

} // end Person

 



* BusinessPerson.java


package edu.java.inherit02;


// Person 클래스를 상속받는 BusinessPerson 클래스를 선언

public class BusinessPerson extends Person {

// 멤버 변수

private String company;

// 생성자

// 자식 클래스의 생성자가 호출되면, 부모 클래스의 생성자가 먼저 호출되어야 함.

// 부모 클래스의 생성자를 명시적으로 호출할 때는 super();

// 부모 클래스의 생성자를 명시적으로 호출하지 않으면,

// 부모 클래스의 "기본 생성자"가 자동으로 호출됨!

// 부모 클래스의 매개 변수가 있는 생성자는 자동으로 호출되지 않기 때문에, 

// 필요한 경우는 반드시 명시적으로 호출해야 함!

// 예) super(name);

// 자식 클래스의 생성자에서 부모 클래스의 생성자를 호출할 때는

// 다른 어떤 코드보다 먼저 부모 클래스를 호출해야 함

public BusinessPerson() {

super();  // 부모 클래스 생성자 호출 -> 생략 가능

System.out.println("BusinessPerson 생성자");

}

public BusinessPerson(String name, String company){

super(name); // 부모 클래스의 매개변수 생성자를 명시적으로 호출 -> 생략 불가

//setName(name); // 부모 클래스의 기본 생성자를 호출 후 setter 메소드 호출됨

this.company = company;

System.out.println("BP(name, company) 생성자");

}

public String getCompany(){

return company;

}

public void setCompany(String company) {

this.company = company;

}

} // end class BusinessPerson 



* InheritMain02.java


package edu.java.inherit02;


public class InheritMain02 {


public static void main(String[] args) {

// person 클래스의 인스턴스 생성

Person p1 = new Person();

System.out.println(p1);

p1.setName("진혁");

System.out.println(p1.getName());

System.out.println("====================");

// BusinessPerson 클래스의 인스턴스 생성

BusinessPerson p2 = new BusinessPerson();

System.out.println("===================");

BusinessPerson p3 = new BusinessPerson("진혁", "아이티윌");

System.out.println(p3.getName());

System.out.println(p3.getCompany());



} // end main()


} //end InheritMain02 



* 출력화면


Person 생성자

edu.java.inherit02.Person@15db9742

진혁

====================

Person 생성자

BusinessPerson 생성자

===================

Person(name) 생성자

BP(name, company) 생성자

진혁

아이티윌

 

코멘트 : 메소드 변수 타입에 따라 출력되는 생성자가 다름



3. 부모 클래스에 기본생성자가 없을 때 호출하는 방법


* Phone.java (부모 클래스)


package edu.java.inherit03;


public class Phone {

// 멤버 변수

private String phoneNo;


// 생성자

// 생성자를 하나라도 생성하면 컴파일러는 기본 생성자를 제공하지 않음


// public Phone() {}

public Phone(String phoneNo) {

this.phoneNo = phoneNo;

System.out.println("Phone(phoneNo) 생성자 호출");

}


// 메소드

public String getPhoneNo() {

return phoneNo;

}


public void setPhoneNo(String phoneNo) {

this.phoneNo = phoneNo;

}


} // end class Phone 



* SmartPhone.java (자식 클래스)


package edu.java.inherit03;


public class SmartPhone extends Phone {

// 멤버 변수

private String ip;


// 생성자

// 생성자의 호출 :

// 자식 클래스의 생성자가 호출되면,

// 부모 클래스의 생성자가 먼저 실행된 후, 자식 클래스의 코드들이 실행됨

//  1) 부모 클래스의 생성자를 명시적으로 호출하지 않을 때는 super()가 자동으로 호출됨

//  2) 부모 클래스의 생성자를 명시적으로 super(); 또는 super(매개변수); 호출할 수 있음

// 만약에 부모 클래스가 기본 생성자를 가지고 있지 않은 경우에는 

// super()가 자동으로 호출될 수 없기 때문에,

// 자식 클래스의 생성자에서 super(매개변수)를 호출하는 코드(아래)가 반드시 있어야됨


public SmartPhone() {

super(null); // 부모 클래스의 기본생성자가 없을 때 에러를 없애줄 수 있음

System.out.println("SmartPhone() 생성자 호출");

}

public SmartPhone(String phoneNo) {

super(phoneNo); // 생략 불가

setPhoneNo(phoneNo); // 컴파일 에러

System.out.println("SmartPhone(phoneNo) 생성자 호출");

}

public SmartPhone(String phoneNo, String ip){

super(phoneNo);

this.ip = ip;

System.out.println("SmartPhone(phoneNo, ip) 생성자 호출");

}

} // end class SmartPhone 



*InheritMain03.java (메인 클래스)


package edu.java.inherit03;


public class InheritMain03 {

public static void main(String[] args){

SmartPhone phone1 = new SmartPhone();

SmartPhone phone2 = new SmartPhone("010-1111-1222");

System.out.println(phone2.getPhoneNo());

SmartPhone phone3 = new SmartPhone("1234", "1111.222.123.131");

System.out.println(phone3.getPhoneNo());

} // end main()


} // end class InheritMain03 



* 출력화면


Phone(phoneNo) 생성자 호출

SmartPhone() 생성자 호출

Phone(phoneNo) 생성자 호출

SmartPhone(phoneNo) 생성자 호출

010-1111-1222

Phone(phoneNo) 생성자 호출

SmartPhone(phoneNo, ip) 생성자 호출

1234


코멘트 : - 



4. 메소드 오버라이딩 하는 코드



* Animal.java (부모 클래스)


 package edu.java.inherit04;


public class Animal {

private String name;

// 생성자

public Animal() {}

public Animal(String name) {

this.name = name;

}

// 메소드

public void speak() {

System.out.println("동물이 말합니다...");

}


}



* Dog.java (자식 클래스)


package edu.java.inherit04;


public class Dog extends Animal {

// 멤버 변수

private String type;

// 생성자 overloading

public Dog() {}

public Dog(String name, String type){

super(name);

this.type = type;

}

// 메소드 재정의(override)

// 부모 클래스가 가지고 있는 메소드를 자식 클래스에서 재정의(다시 정의)

// 메소드의 리턴 타입, 이름, 매개변수 모두 일치해야 함.

@Override // annotation(어노테이션):자바 컴파일러에 알려주는 역할

public void speak() {

System.out.println("멍멍...");

}

// 메소드 오버로딩(overloading):

// 매개 변수가 다른 메소드를 여러개 정의하는것

public void speak(String str){

System.out.println(str);

}

} // end class Dog 



* InheritMain04(메인 클래스)


package edu.java.inherit04;


public class InheritMain04 {

public static void main(String[] args){

Animal animal = new Animal("애완동물");

animal.speak(); // Animal 클래스의 speak()가 출력됨

System.out.println();

Dog dog = new Dog("달리", "포메리안");

dog.speak(); // dog 클래스의 speak()가 출력됨

} // end main()


} // end class InheritMain04 



* 출력화면


동물이 말합니다...


멍멍...


코멘트 : 메소드 오버라이딩 되면 부모 메소드의 내용을 덮어 씌운다고 생각하는게 좋다. 



5. Object 클래스 오버라이딩



* Person.java (person 클래스의 toString이 주소값이 아닌 name 값을 출력하게 오버라이딩)


package edu.java.inherit05;


public class Person {

private String name;

public Person(String name){

this.name = name;

}

public String getName(){

return name;

}

@Override

public String toString(){

return name;

} // toString()이 name값을 출력하도록 변환시켰음


} // end class Person


// 자바의 모든 클래스의 java.lang.Object 클래스를 상속받아서 만들어짐!

// 자바의 모든 클래스는 Object 클래스의 public 메소드들을 상속받아서 사용 가능

// Object 클래스의 toString() 메소드 :

//   패키지이름.클래스이름@참조값(주소값) 



* Point.java (point 클래스의 toString이 좌표형태로 리턴되게 오버라이딩)


package edu.java.inherit05;


public class Point {

private double x;

private double y;

public Point(double x, double y){

this.x = x;

this.y = y;

}

@Override

public String toString() {

return "(" + x + ", " + y + ")";

}


} // end class point  



* InheritMain05


package edu.java.inherit05;


public class InheritMain05 {


public static void main(String[] args) {

// 

String str = new String("문자열");

System.out.println(str);

System.out.println();

// Person 클래스의 인스턴스 생성

Person p1 = new Person("진혁");

System.out.println(p1);

// println(Object):

// Object 클래스의 toString() 리턴값을 화면 출력하도록 만들어져 있음

System.out.println();

Point pt = new Point(1,1);

System.out.println(pt);


} // end main()


} // end class InheritMain05 


Comments