상속이란?

클래스간의 관계 – 상속관계(inheritance)

클래스의 관계 - 포함관계(composite)

클래스간의 관계 결하기 - 상속 vs 포함

관계 예제1

관계 예제2

단일상속(single inheritance)

Object클래스 – 모든 클래스의 최고조상

[출처]자바의 정석
실습을 해보자.
public class _01_Inheritance {
public static void main(String[] args) {
/* 상속 : 부모의 것을 자식에게 물려주는 것
* 클래스 상속 : 부모 클래스의 멤버변수/메서드를 물려주는 것
* 상속 : 클래스 확장 개념
* 상속을 하는 이유는 재사용을 해서 중복코드를 줄이고, 유지보수를 쉽게
* Class A(부모) / Class B(자식)
*
* Class B extends A {
*
* }
* 상속 키워드 : extends
* 상속을 받으면 부모의 멤버변수, 메서드를 사용할 수 있다.
* 접근제한자 private이면 자식 클래스에서 접근 불가능
* 접근제한자 protected : 상속받는 자식에게 허용하는 제어자
*/
A a = new A();
a.setA(10);
a.setB(20);
a.setC(50);
a.setNum(100);
a.print();
System.out.println("-----------");
B b = new B();
b.setB(40);
b.print();
b.num = 200; // 접근제어자가 protected이기 때문에 접근가능
b.print();
}
}
class A { // 부모클래스
private int a,b,c; // 나만 사용
protected int num; // 상속 가능
public void print() {
System.out.println("a : " + a + ", b : " + b + ", c : " + c);
System.out.println("num : " + num);
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
public int getC() {
return c;
}
public void setC(int c) {
this.c = c;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
class B extends A { // a b c num 사용
private int d,e,f;
// override(오버라이드) : 부모의 메서드를 재정의하여 사용
@Override
public void print() {
// a b c num
super.print(); // 부모의 값을 가져올 때 사용
System.out.println("d : " + d + ", e : " + e + ", f : " + f);
}
public int getD() {
return d;
}
public void setD(int d) {
this.d = d;
}
public int getE() {
return e;
}
public void setE(int e) {
this.e = e;
}
public int getF() {
return f;
}
public void setF(int f) {
this.f = f;
}
}
class Animal {
private String name; // 이름
private String category; // 종
public Animal() {}
public Animal(String name, String category) {
this.name = name;
this.category = category;
}
// printInfo
public void printInfo() {
System.out.printf("이름 : %s%n분류 : %s%n",name, category);
}
// 울음소리 howl()
public void howl() {
System.out.println("== " + name + " 울음소리 ==");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}
class Dog extends Animal {
public Dog() {
setName("강아지");
setCategory("개과");
}
@Override
public void howl() {
super.howl();
System.out.println("멍멍~~");
System.out.println("--------------");
}
}
class Cat extends Animal {
public Cat(String name, String category) {
super.setName(name);
super.setCategory(category);
}
@Override
public void howl() {
super.howl();
System.out.println("야옹~~");
System.out.println("--------------");
}
}
class Tiger extends Animal {
public Tiger(String name, String category) {
// 생성자 호출
super(name, category);
}
@Override
public void howl() {
super.howl();
System.out.println("어흥~~");
}
}
public class _02_Inheritance2 {
public static void main(String[] args) {
/* 오버라이딩 : 부모클래스에게 물려받은 메서드를 재정의 하는 것
* - 부모클래스의 메서드와 선언부가 일치해야 한다.
* - 접근제한자 변경은 더 넓은 범위로만 가능 => 접근제한자 축소는 안됨
*/
Dog d = new Dog();
d.printInfo();
d.howl();
Cat c = new Cat("페르시안", "고양이과");
c.printInfo();
c.howl();
Tiger t = new Tiger("호랑이", "고양이과");
t.printInfo();
t.howl();
}
}
오버라이딩(overriding)이란?

오버라이딩 조건

오버로딩 vs 오버라이딩

'Java 공부 기록' 카테고리의 다른 글
| 컬렉션 프레임(collections framework) (0) | 2023.06.20 |
|---|---|
| 다형성(Polymorphism) (0) | 2023.06.19 |
| 객체지향언어와 클래스(Class) (0) | 2023.06.09 |
| 메서드(Method), 메서드 오버로딩 (0) | 2023.06.06 |
| 지금까지 내용 요약 정리 (0) | 2023.06.06 |