Java

JAVA Method Overriding, super 키워드

leopard4 2023. 1. 19. 17:53

위그림과 같은 클래스를 만들것이다

 

보아하니 겹치는부분(중복)이 많다.

그런것들은 상속의 개념으로 부모로 만들고 물려주면 된다.

때문에 비슷한것들을 묶을 부모클래스 person을 만들고.

물려줄 자식클래스들을 만든다.

 

 

Person의 코드를 보자

package model;

public class Person {

 

protected int num;

protected String name;

protected String dept;

protected String address;

}

 

우선 기본적인 공통사항을 작성하고. 

 

교수 클래스를 만들려고 보니. 

공통사항 외에 과목이 보인다. 

때문에

Professor(상속받을 클래스)로 이동해서

다음과 같이 과목들을 받을 subjects 리스트 멤버변수를 생성했다.

package model;

public class Professor extends Person{

 

String[] subjects;

}

 

그리고

실행 코드인 EduMain으로 간다.

아래 콘솔과 같이 나오게 하기 위해 

우선 패키지가 다르므로 import model.Professor; 로 패키지와 클래스를 가져오고.

Professor 객체를 생성하고 데이터를 입력하였다 . 

 

그런데 아직 Professor 클래스에서 데이터를 받아서 저장하는 코드를 완성하지 않았다 

때문에 해당 클래스로이동해야하는데 

다른 클래스 에서도 사용할것 같으니 애초에 부모 클래스로 가보자.

public Person() {

 

}

public Person(int num, String name, String dept,

String address ){

 

this.num = num;

this.name = name;

this.dept = dept;

this.address = address;

 

}

public void print() {

System.out.println("사번 : "+ num);

System.out.println("이름 : "+ name);

System.out.println("학과 : "+ dept);

System.out.println("주소 : "+ address);

}

이와 같은 코드를 추가했다.

해석하자면 . 우선 다른 패키지에서 임포트할 예정이기 때문에 

public 으로 디폴트 생성자를 만들고.

데이터를 받아 저장할 생성자도 만든것.

Person 이란 메소드가 두개지만 오버로딩 으로 둘다 사용 가능한것.

출력도 할것이기 때문에 print() 메소드도 정의한다. 반환을 하진않을것이기 때문에 void 로 만든다.

 

자 이제 부모클래스의 메소드를 만들었으니 .

Professor 클래스로 이동해보자.

public Professor(){

}

public Professor(int num, String name, String dept,

String address, String[] subjects){

// 수퍼클래스의 생성자 호출하는 코드.

super(num, name, dept, address);

 

this.subjects = subjects;

}

@Override

public void print() {

 

super.print();

 

for (int i = 0 ; i < subjects.length; i++) {

System.out.println( subjects[i] );

}

}

마찬가지로 디폴트 생성자를 만들고 생산자를 오버로딩한다.

그런데 부모 생성자 메소드에는 num, name, dept, address 는 있지만.

subjects는 없다 . 

때문에 추가해준다.

super 라는것은 부모클래스를 의미한다.

this 라는것은 멤버변수를 정확히 특정하는것 왜냐면 같은이름의 변수가 많아 헷갈리기 때문.

 

데이터를 받는것은 만들었는데,

출력을 하는것도 새로만들려고 보니 귀찮고 이미 부모클래스에는 출력하는 메소드가 있다.

때문에 메소드 오버라이딩 한다.

메소드 오버라이딩이란. 

상속에서만 있는 개념인데.

부모로부터 상속을 받은 자식 클래스는 

@Override 를 선언함으로 써 

같은 이름의 print() 메소드에 

기능을 추가 할 수 있다.

 

오버로드와 다른점은 오버로드는 클래스 내에서 함수명이 같은걸 여러개 정의하겠다는것이고 

오버라이딩은 자식클래스가 부모의 함수를 재정의 한다는것.

 

그리고 for 부분은 과목이 여러개일수도 있기때문에 

전부 출력하려고 한것이다.

 

이제다시 EduMain 으로 돌아가서 해당 코드를 실행시키면 

console 과 같이 나옴을 확인할 수 있다.

 

그리고 eclipse 툴에서 오버라이딩을 쉽게 작성하는 방법은 

상속받을 클래스에서 우클릭

이렇게 지금은 이미 상속을 받아서

오브젝트 밖에 없지만 

상속받을수 있는 메소드가 있다면

해당 메소드를 선택하면 자동으로 오버라이딩 코드가 작성된다.

 

마지막으로 protected  부분을 얘기를 못햇는데 

이것은 쉽게 말해 상속받은 클래스에서만 멤버변수를 다룰 수 있게 한다는것.