22.5.06 [HackerRank]Java Inheritance I

서태욱·2022년 5월 6일
0

Algorithm

목록 보기
32/45
post-thumbnail

✅ 문제 분석

상속에 관한 아주 간단한 문제.
Animal 클래스를 상속 받아 새로운 메소드를 추가해주는 문제다.
기존 주어진 walk, fly외에 sing() 메소드를 추가하고,
"I am singing" 문자열을 프린트 해주면 된다.

🌱 배경지식

상속

수퍼 클래스의 모든 멤버를 서브 클래스가 물려받는다.
재사용성과 코드 간결성을 향상시킬 수 있다.
직접 만들 클래스, JDK가 지원하는 클래스 모두 상속 가능하다.
(최상위 클래스는 java.lang.Object)
다중 상속은 지원되지 않으므로 extends 뒤에는 하나의 수퍼 클래스만 온다.

상속의 형식

[public/final/abstract] class 클래스이름 extends 상위클래스이름 {

	멤버 변수;

	멤버 메소드;

}

접근제한자 private을 제외한 수퍼 클래스의 모든 필드와 메소드는 상속된다.
변수 이름이 동일하게 수퍼,서브 클래스에 모두 존재하면 수퍼 클래스 변수는 가려진다.

메소드 오버라이딩(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 in house");
    }
}

public class Sample {
    public static void main(String[] args) {
        HouseDog houseDog = new HouseDog();
        houseDog.setName("happy");
        houseDog.sleep();  // happy zzz in house 출력
    }
}

Animal 클래스를 상속받은 Dog 클래스는 이름 zzz이 프린트 되는 sleep이라는 메소드를 구현하고 있다.
이때, 집에서 기르는 HouseDog이라는 클래스를 만들어 Dog 클래스를 상속시키고,
sleep 메소드를 재정의해준다. 집에서 기르는 개는 in the house에서 잔다고 프린트해주는 것이다.
이렇게 되면 HouseDog 클래스의 sleep 메소드를 호출할 경우에는 수퍼 클래스(Dog)의 메소드는 호출되지 않는다.

메소드 오버로딩(overloading)

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");
    }
}

public class Sample {
    public static void main(String[] args) {
        HouseDog houseDog = new HouseDog();
        houseDog.setName("happy");
        houseDog.sleep();  // happy zzz in house 출력
        houseDog.sleep(3);  // happy zzz in house for 3 hours 출력
    }
}

오버로딩은 메소드를 변경하는 것이 아니라 하나 더 추가하는 것이다.
자료형이 다르다면 동일한 메소드 명으로 또 하나를 생성해줄 수 있다.
여기에서도 int형을 자료형으로 받는 sleep 메소드를 만들어 주고, 메소드에 정수값이 입력되면 오버로딩된 메소드가 출력된다.

✏️ 해설

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

class Animal{
	void walk() {
		System.out.println("I am walking");
	}
}
class Bird extends Animal {
	void fly() {
		System.out.println("I am flying");
	}
    
     void sing() {
        System.out.println("I am singing");
    }
}

public class Solution{

   public static void main(String args[]){

	  Bird bird = new Bird();
	  bird.walk();
	  bird.fly();
      bird.sing();
	
   }
}

👉 참고

profile
re:START

0개의 댓글