본문 바로가기
Java 공부 기록

상속(Inheritance), 오버라이딩

by moonchance 2023. 6. 14.

상속이란?

 

클래스간의 관계 상속관계(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 오버라이딩