Overriding 

부모 클래스로부터 상속받은 method나 생성자constructor의 내용을 재정의하여 사용하는 것. 

자식클래스에서 추가하거나 변경해야 할 내용이 있을 경우, 부모 클래스의 method를 override 한다. 

자식 클래스인 Child 클래스에서 Overriding 했다면

해당 부분에 '@Override'라고 표시하여 Annotation 주석처리한다. 

 

main/Main.java

package main;

import model.Child;
import model.Parent;

public class Main {

	public static void main(String[] args) {
		
		Parent p = new Parent(); // 클래스를 만들어 보자 new
		
		p.name = "봄동";
		p.age = 50;
		p.setMoney(1000000000);
		
		p.print();
		System.out.println("--------------------------------");
		
		Child c = new Child();
		c.name = "머루";
		c.age = 23;
		c.setMoney(-1000000000);
		c.hobby = "게임";
		
		// c의 데이터를 출력 
		// c.printChild();
		System.out.println("--------------------------------");
		
		c.print();
		
	}
}

 

model/Child.java

package model;

public class Parent {
	
	public String name;
	public int age;
	private int money; 
    // 머니를 프라이빗으로 설정해도 상속은 받는다. 다른 곳에서 노출을 직접적으로 안 할 뿐! 
    // 멤버변수를 private나 default로 설정하면 생성자constructor나, 
    // getter()/setter() 함수를 만들어서 사용할 수 있게 해 주어야 한다. 
	
	public Parent(){ // 다른 패키지에서 쓰니까 접근권한자 public 넣어줘야 함. 
        // 공간확보하고 찍어줘라. = 오른쪽 부분 new에서 찍음. 
		// 생성자는 타입 없음 
		System.out.println("부모 생성자 호출됨!");
	}
	
	public void print(){
		System.out.println(name);
		System.out.println(age);
		System.out.println(getMoney());
	}

	public int getMoney() {
		return money;
	}

	public void setMoney(int money) {
		if (money < 0) {
			this.money = 0;
		}else {
			this.money = money;
		}
	}
}

 

model/Child.java

package model;

public class Child extends Parent {
	
//	Parent로부터 물려받은 모든 것들. 변수와 method  
//	public String name;
//	public int age;
//	public int money;
//	
//	public void print(){
//		System.out.println(name);
//		System.out.println(age);
//		System.out.println(money);
		
	public String hobby;
	
	public Child() {
		System.out.println("자식 생성자 호출됨!");
	}

	// 부모한테 물려받은 함수 이름을 그대로 사용하되, 나에게 맞는 코드로 수정해서 사용한다.
	// Method Overriding 메소드 오버라이딩이라고 한다. 

	@Override 
    // @Override Annotation. 
    // 아, 얘는 부모로부터 상속받았구나. 오버라이드. 
    // super는 부모를 의미한다. super가 보이면 바로 상단의 parent를 본다.
	public void print() {
		super.print(); // parent의 print()함수 실행하시고
		System.out.println(hobby); // 여기서 Child가 추가하고 싶은 것 추가함.
	}

 


 

 

main/Main.java

생성자constructor를 만들어서 변수들을 입력한다. 

package main;

import model.Person;
import model.Professor;

public class Main { // cpu는 여기서 동작한다.

	public static void main(String[] args) {
		
		// 생성자 만들어서 사용하는 방법. 
		Person p = new Person(1, "홍길동", "경영학과", "인천시 서구");
		
		p.print();

		Professor pf1 = new Professor(1, "김나나", "경제학과", "인천시 서구", new String[] {"경제원론", "미시경제학"});
		
		pf1.print();
	}
}

 

 

model/Person.java

model 패키지에 있는 Person 클래스에

멤버 변수를 지정하고,  

Person 생성자를 만들어 주었다.

빈 Person() 함수도 만들어 준다.

print() 함수도 만들어 주었다.

package model;

public class Person {
	
	// heap에 저장하는 멤버변수들. 
	public int num;
	public String name;
	public String dept;
	public String address;
	
	public Person(int num, String name, String dept, String address) {
		this.num = num;
		this.name = name;
		this.dept = dept;
		this.address = address;
	}
	
	public Person() {
		
	}

	public void print() {
		System.out.println(num);
		System.out.println(name);
		System.out.println(dept);
		System.out.println(address);
	}
}

 

 

model/Professor.java

Person 클래스를 상속 받은 Professor 클래스다.

보이지는 않지만 Person 클래스의 요소들이 다 상속되어 있다. 

Professor 클래스에서도 멤버변수 subjects를 지정해 주었다. 

그리고 생성자를 생성하면 상속해준 Person 클래스의 생성자도 자동으로 생성된다. 

super는 상속받은 parent class를 지칭한다. 

this는 현재 위치를 말한다. 

 

parent class인 Person의 print 함수를 Overriding으로 재정의한다. 

@Override라고 annotation 주석을 달아주고, 

super.print();로 parent의 print()함수를 불러오고, 

Professor에서 새로 추가한 멤버변수의 print 구문을 추가해 준다.  

멤버변수 subject가 문자열 배열이므로 for문으로 모두 들어갈 수 있게 처리해 준다.  

package model;

public class Professor extends Person {

	//	int num;
	//	String name;
	//	String dept;
	//	String address;
	
	String[] subjects; // 문자열 배열로 만들겠다. 

	public Professor(int num, String name, String dept, String address, String[] subjects) {
		super(num, name, dept, address); // Person에서 만들어 둔 생성자를 불러주었다. 
		this.subjects = subjects;
	}

	@Override
	public void print() {
		super.print();
		for(int i = 0; i < subjects.length; i++) {
			System.out.println(subjects[i]);
		}
	}
}

 

Staff class도 Person class를 상속받았다. 

model/Staff.java

package model;

public class Staff extends Person{

	//	int num;
	//	String name;
	//	String dept;
	//	String address;
	
	String[] job;

}

 

Student class도 Person class를 상속받았다. 

model/Student.java

package model;

public class Student extends Person {
	
	//	int num;
	//	String name;
	//	String dept;
	//	String address;
	
	String[] subjects; // 문자열 배열로 만들겠다. 

}

 

 

Method Overloading And Overriding In Java | Board Infinity

 

Method Overloading And Overriding In Java | Board Infinity

This article is about java programming language. It explains how to use method overloading and overriding in java, helps you in the process of writing cool java programs.

www.boardinfinity.com

 

+ Recent posts