class Animal{
String name;
void setName(String name){
this.name = name;
}
}
class Dog extends Animal{ // 상속
}
public class Sample{
public static void main(String[] args){
Dog dog = new Dog();
dog.setName("bob");
System.out.println(dog.name); // bob 출력
}
}
클래스 상속을 위해 extends 키워드를 사용한다.
Dog은 Animal 클래스를 상속하므로 Animal클래스의 setName메소드 사용 가능하다.
부모 클래스의 기능 확장
class Animal{
String name;
void setName(String name){
this.name = name;
}
}
//sleep 메서드 추가
class Dog extends Animal{
void sleep(){
System.out.println(this.name+" zzz");
}
}
public class Sampele{
public static void main(String[] argd){
Dog dog = new Dog();
dog.setName("bob");
System.out.println(dog.name);
dog.sleep(); // bob zzz 출력
}
}
Dog 클래스는 Animal 클래스에 비해 기능이 많아졌다. 이처럼 보통 부모 클래스를 상속받은 자식 클래스는 부모 클래스의 기능에 비해 좀 더 많은 기능을 갖도록 작성한다.
Dog 클래스는 Animal 클래스를 상속했다.
Dog는 Animal에 포함되기 때문에 "Dog is a
Animal"과 같이 말할 수 있는 관계를 Is-A 관계라 하며, 이렇게 Is-A 관계(상속관계)에 있을 때 자식 클래스 객체는 부모 클래스의 자료형인 것 처럼 사용할 수 있다.
Animal dog = new Dog; // Dog is a Animal
이번에는 Dog 클래스를 더 구체화시키는 HouseDog 클래스를 생성한다.
class Animal{
String name;
void setName(String name){
this.name = name;
}
}
class Dog extends Animal{
void sleep(){
System.out.println(this.name+" zzzz");
}
}
// Animal > Dog > HouseDog 생성
class HouseDog extends Dog{
}
public class Sample{
public static vod main(String[] argd){
HouseDog housedog = new HouseDog();
housedog.setName("shop");
housedog.sleep(); // shop zzzz출력
}
}
dog를 상속받는 HouseDog을 생성했다. 그러나 Dog의 sleep
메소드를 변경하고 싶다면 HouseDog의 sleep 메소드에 다른 기능으로 덮어쓰는(변경) 오버라이딩(overriding)을 통해 변경하면 된다.
class Animal{
String name;
void setName(String name){
this.name = name;
}
}
class Dog extends Animal{
void sleep(){
System.out.println(this.name + " zzz");
}
}
// 메소드 오버라이딩
class HouseDog extends Dog{
void sleep(){
System.out.println(this.name + " zzz home alone")
}
}
public class Sample{
public static void main(String[] args){
HouseDog houseDog = new HouseDog();
houseDog.setName("tom");
houseDog.sleep(); // tom zzz home alone 출력
}
}
이렇게 부모클래스의 메소드를 자식 클래스가 동일한 형태로 재구현하는 것을 메소드 오버라이딩이라 한다.void sleep(int hour){
System.out.println(this.name+" zzz at home for "+hour+"hours");
}
입력 인자가 다른 경우 동일한 이름의 메소드 생성이 가능하다.(오버로딩)class Animal{
String name;
void setName(String name){
this.name = name;
}
}
class Dog extends Animal{
void sleep(){
System.out.println(this.name+" zzz");
}
}
class HouseDog extends Dog{
void sleep(){
System.out.println(this.name+"zzz in house");
}
// 메소드 오버로딩
void sleep(int hour){
System.out.println(this.name+" zzz in house for "+hour+" hours");
}
}