안녕하세요 코이킹입니다.
이번 포스트에서는 상속에 대해서 설명하겠습니다.
1. 상속이란?
부모클래스의 멤버 변수와 메서드를 자식 클래스에서 상속하여 사용할 수 있게 하는 것을 말합니다.
※ extends키워드를 사용하여 상속할 부모 클래스를 정의하여 상속관계를 설정할 수 있습니다.
public class 자식클래스 extends 부모 클래스 {
}
※ 예제코드
public class Animal {
protected String name;
protected int age;
public Animal() {}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public void printName() {
System.out.println(this.name);
}
public void printAge() {
System.out.println(this.age);
}
protected void eat() {
System.out.println("eat");
}
protected void sleep() {
System.out.println("sleep");
}
}
public class Dog extends Animal {
protected String breed;
protected String cryingSound = "Wang~!";
public Dog(String name, int age) {
super(name, age);
}
public void crying() {
System.out.println(this.cryingSound);
}
@Override
public void printName() {
System.out.println("Dog's Name : "+ this.name);
}
}
public class Person extends Animal {
public String language;
public Person(String name, int age) {
super(name, age);
}
public void speaking() {
System.out.println("speaking : "+this.language);
}
@Override
public void printName() {
System.out.println("Person's Name : "+ this.name);
}
}
2. 상속가능한 부모 클래스의 요소
public·protected·default 로 선언된 멤버 변수와 메서드
※ 단, default의 경우 같은 패키지내에서만 사용 가능.
public static void main(String[] args) {
Dog dog = new Dog("Happy", 3, "Akita");
Person person = new Person("David", 20, "English");
// System.out.println(dog.age); // privateのため、子クラスで使えない。
System.out.println(dog.name); // protectedのため、子クラスで使える。
System.out.println(dog.getAge()); // publicのため、子クラスで使える。
}
3. 상속을 사용하는 이유
부모클래스에 공통의 속성과 기능을 정의하고, 자식 클래스에서 자식 클래스만의 속성과 기능을 정의 함으로써 손쉽게 코드를 재사용 할 수 있으며, 기능의 확장이 용의 합니다.
상속은 위와 같은 장점이 있지만 부모 클래스의 필요 없는 코드까지 상속해야만 하므로 코드가 비대해질 수 있다는 단점이 존재합니다.
// 共通機能を親に定義すると、子クラスでは子クラスなりのコードを実装すればよい。
System.out.println("Dog's Age : "+dog.getAge());
System.out.println("Person's Age : "+person.getAge());
// 子クラスなりの機能
dog.crying();
person.speaking();
4. super()
부모클래스의 요소중 생성자는 상속받을 수 없습니다.
그렇다면 매개변수가 포함된 생성자가 정의된 부모 클래스를 상속하려면 어떻게 해야 할까요?
이 경우에는 자식클래스의 생성자에서 super() 메서드를 사용해서 부모의 생성자 중 하나를 호출해주면 됩니다.
public Person(String name, int age, String language) {
super(name, age); // 親のコンストラクターを呼び出す。
this.language = language;
}
public Dog(String name, int age, String breed) {
super(name, age); // 親のコンストラクターを呼び出す。
this.breed = breed;
}
5. 오버라이드
오버라이드는 부모클래스의 메서드를 자식 클래스에서 재정의 하는 것으로,
자식 클래스 별로 다르게 메서드를 재정의 하여 같은 메서드를 호출하여 다른 결과를 만들어 낼 수 있습니다.
※ 이 부분은 다형성을 설명할 때 다시 정리하려 합니다.
public class Person extends Animal {
...
@Override
public void printName() {
System.out.println("Person's Name : "+ this.name);
}
}
public class Dog extends Animal {
...
@Override
public void printName() {
System.out.println("Dog's Name : "+ this.name);
}
}
// override
dog.printName();
person.printName();
※ 예제 코드
https://github.com/leeyoungseung/algorithmBasic/tree/master/algorithm/src/objective/basic04
※ qiita에 투고한 URL
https://qiita.com/Koiking-L/items/da5793c1c8e0973e7070
'프로그래밍 > Java-문법정리' 카테고리의 다른 글
【OOP】06_추상화 (0) | 2022.01.23 |
---|---|
【OOP】05_다형성 (0) | 2022.01.20 |
【OOP】03_캡슐화 (0) | 2022.01.16 |
【OOP】02_멤버변수·메서드·생성자 (0) | 2022.01.15 |
【OOP】01_객체・클래스・인스턴스 (0) | 2022.01.10 |
댓글