JAVA

23.01.06 - 상속관계(this(),super()) / Overloading, Overriding

softPattern 2023. 8. 2. 15:34

Bean / Application

Bean

class A ~
Field 속성, 특성
Method 행위

Application

class Test~
Main {
A a = new ~
}

원래는 Bean만으로 실행 안된다. <= Main method가 없으므로

하지만 Application을 Bean안에 대입해주면 실행가능하다.

class A ~
Field 속성, 특성
Method 행위

class Test
Main {
A a = new ~
}

상속관계

💡 상속관계가 설정된 상태라면 하위 클래스의 생성자 default 뿐만 아니라 상위 클래스의 생성자 default도 함께 실행된다!!

 

하위 class는 상위 class의 속성(Field)와 행위(Method)를 공유하며, 추가적인 구체적인 속성 및 행위를 갖는다.

 

Has A 관계⇒ Association Realationship

Other과 Father은 상속관계가 아님. 다른 class.

Other 에서 Father a = new Father(); 로 Father라는 DataType(=클래스)를 받는 a 객체를 생성.

둘은 상속관계가 아니지만 Has A 관계가 된다.

 

Other이 Father의 private Field에 접근가능 ?

⇒ Other에서도 **a.getMethod()** 사용하면 가능.

원래 Other가 Father의 하위 클래스라면 Other에서 getMethod() 실행해도 됨.

why? 하위에 없으면 상위것을 자동으로 호출.

 

but Other는 has A 관계이므로 변수 a를 참조하는 getMethod를 실행해주어야한다.


super(), this()

  1. 개발자가 생성자를 1개라도 만들면 생성자는 개발자 책임
    • Human01()를 주석처리하고 compile ==> default 생성자를 항상 만들어 주는 습관을 들이자.
  2. 생성자를 명시적으로 호출 할 수 있는 method
    • this() ==> 자신의 default 생성자 명시적으로 호출
    • super() ==>상위의 default 생성자 명시적 호출

this(1) ==> 자신의 생성자중 int 인자값을 1개 받는 생성자 명시적 호출

super(1) ==> 상위의 생성자중 int 인자값을 1개 받는 생성자 명시적 호출

 

내부적으로 생성자의 1번째 line super()가 생략되어 있는 구조이다. public Iam1(){ //super() <==생략된구조 }

생성자를 호출하는 super(), this()의 규칙

 

💡 생성자내부에서만 , 1번째 line에만 기술할 수 있으며. 1번만 사용 할 수 있다.

 


super()

super() 부모 생성자를 찾아가는 코드

  1. public static void main() 실행
  2. Iam01 iam = new Iam01();
  3. Iam01()문으로 이동
  4. super() ⇒ 상위 클래스로 이동 된다.‘Human class default Constructor’ 출력
  5. 상위 클래스의 Human(); 실행
  6. 하위 클래스로 다시 돌아가서 super() 아래 코드 실행
  7. ‘Iam class default Constructor’ 출력

super() + String

super( String )

  1. string 문자가 입력되면 Iam(String str)문으로 이동해서 코드 실행
  2. super() ⇒ 상위 생성자로 이동 Human(String str)문으로 이동해서 코드 실행
  3. ‘Human class의 String인자를 받는 Constructor’ 출력
  4. name 변수를 ‘str’로 초기화 해준다. ⇒ encapsulation !
  5. 다시 하위 생성자로 복귀
  6. ‘Iam class의 String인자를 받는 Constructor’ 출력
  7. job 변수를 str로 초기화 ⇒ encapsulation 을 위하여 !

this()

this() : 상위생성자가 아닌 본인의 생성자로 이동

  1. Iam01() 문 시작.
  2. this() ⇒ 본인의 생성자로 이동
  3. Iam01() 문 다시 시작
  4. this() ⇒ 본인의 생성자로 다시 이동

무한 루프 ⇒ 콘솔에 에러 발생. recursive(재귀)

과정 확인

class BusCharge{
	String section;
	public BusCharge(){
	}
	public BusCharge(String str){
		section=str;
	}
	public void information() {
		System.out.println("버스요금안내");
	}
	public void charge(){
		System.out.println("학생:300,일반인:500,어르신:공짜");
	}
}
class Student extends BusCharge{
	public Student(){
		super("학생");
	}
	public void charge(){
		System.out.println("::300원\\n");
	}
}
class Adult extends BusCharge{
	public Adult(){
		super("일반인");
	}
	public void charge(){
		System.out.println("::500원\\n");
	}
}
class Old extends BusCharge{
	public Old(){
		super("어르신");
	}
	public void charge(){
		System.out.println("::공짜\\n");
	}
}

public class Display{
	public static void main(String args[]) {
		Student b1 = new Student();
		Adult b2 = new Adult();
		Old b3 = new Old();

		b1.information();
		System.out.print(b1.section);
		b1.charge();

		b2.information();
		System.out.print(b2.section);
		b2.charge();
        
		b3.information();
		System.out.print(b3.section);
		b3.charge();
	}
}

b1만 설명 !

  1. b1변수가 참조하는 Student Class의 information() 생성자 호출
    1. Student Class에 없으니 상위 클래스의 information() 생성자 호출
  2. b1변수가 참조하는 section변수 호출
    1. Student 클래스의 default 생성자 Student()가 이미 실행되며 section 변수에 “학생”이라는 값이 들어가 있는 것 !
  3. Student 클래스의 charge() 호출
    1. 상 하위 모두 존재하나 Overriding 되어 하위 클래스의 charge() 호출

OverLoading / OverRiding

OverLoading

한 클래스내에서 같은 이름의 메소드를 여러개 정의하는 것 ⇒ Polymorphism

(원래는 변수처럼 각기 다른 하나의 이름을 가져야한다.)

overloading의 조건

매개 변수의 개수나 타입이 달라야한다.

public class Employee{
	String part;
	String name;
	int age;
	int baseSalary;

	public Employee(){
		System.out.println("Emp의 default Constructor");
	}
	public Employee(String name){
		this.name=name;
		System.out.println("Emp의 name을 받는 Constructor");
	}
	public Employee(String name,String part){
		this(name);
		this.part=part;
		System.out.println("Emp의 name,part을 받는 Constructor");
	}
	public Employee(String name,String part,int age){
		this(name,part);
		this.age=age;
		System.out.println("Emp의 name,part,age을 받는 Constructor");
	}
}

클래스명이 같은 Employee의 생성자 메소드에 data type이나 인자 수가 다르게 overloading하였다.


OverRiding

상위 클래스로부터 상속 받은 메서드의 내용을 변경하는 것

상속 받은 메소드를 그대로 사용하기도 하지만 하위 클래스 자신에 맞게 변경해야하는 경우가 있기 때문에 오버라이딩 한다.

상위 메소드의 내용만을 새롭게 작성하는 것이므로 다른것은 조상것과 일치해야한다.

오버라이딩의 조건

  1. 메소드 이름이 같아야한다.
  2. 매개변수가 같아야한다.
  3. 반환 타입이 같아야한다.

class SonGeneration extends FatherGeneraton

⇒ SonGeneration은 FatherGeneration의 하위 클래스이다.

💡 !! 메소드 실행 시 하위에 없고 상위에만 있으면 상위 것을 출력하지만, 하위 클래스에 메소드가 존재하면 하위 것을 출력한다 !

  1. public static void main 문 실행
  2. sg.getUpTime(); 실행⇒ 오전 6시 기상
  3. 하위 클래스에 없으니 상위 클래스 것 실행
  4. sg.returnHomeTimeRule(); 실행
  5. returnHomeTimeRule이 상위 클래스에도 존재하고 하위 클래스에도 존재한다.
  6. ⇒ 상위가 아닌 하위 것을 출력한다!

💡 OverLoading : 기존에 없던 새로운 매소드를 정의하는 것 new

💡 OverRiding : 상속받은 메소드의 내용을 변경하는 것 change modify