23.01.06 - 상속관계(this(),super()) / Overloading, Overriding
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개라도 만들면 생성자는 개발자 책임
- Human01()를 주석처리하고 compile ==> default 생성자를 항상 만들어 주는 습관을 들이자.
- 생성자를 명시적으로 호출 할 수 있는 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() 부모 생성자를 찾아가는 코드
- public static void main() 실행
- Iam01 iam = new Iam01();
- Iam01()문으로 이동
- super() ⇒ 상위 클래스로 이동 된다.‘Human class default Constructor’ 출력
- 상위 클래스의 Human(); 실행
- 하위 클래스로 다시 돌아가서 super() 아래 코드 실행
- ‘Iam class default Constructor’ 출력
super() + String
super( String )
- string 문자가 입력되면 Iam(String str)문으로 이동해서 코드 실행
- super() ⇒ 상위 생성자로 이동 Human(String str)문으로 이동해서 코드 실행
- ‘Human class의 String인자를 받는 Constructor’ 출력
- name 변수를 ‘str’로 초기화 해준다. ⇒ encapsulation !
- 다시 하위 생성자로 복귀
- ‘Iam class의 String인자를 받는 Constructor’ 출력
- job 변수를 str로 초기화 ⇒ encapsulation 을 위하여 !
this()
this() : 상위생성자가 아닌 본인의 생성자로 이동
- Iam01() 문 시작.
- this() ⇒ 본인의 생성자로 이동
- Iam01() 문 다시 시작
- 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만 설명 !
- b1변수가 참조하는 Student Class의 information() 생성자 호출
- Student Class에 없으니 상위 클래스의 information() 생성자 호출
- b1변수가 참조하는 section변수 호출
- Student 클래스의 default 생성자 Student()가 이미 실행되며 section 변수에 “학생”이라는 값이 들어가 있는 것 !
- Student 클래스의 charge() 호출
- 상 하위 모두 존재하나 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
상위 클래스로부터 상속 받은 메서드의 내용을 변경하는 것
상속 받은 메소드를 그대로 사용하기도 하지만 하위 클래스 자신에 맞게 변경해야하는 경우가 있기 때문에 오버라이딩 한다.
상위 메소드의 내용만을 새롭게 작성하는 것이므로 다른것은 조상것과 일치해야한다.
오버라이딩의 조건
- 메소드 이름이 같아야한다.
- 매개변수가 같아야한다.
- 반환 타입이 같아야한다.
class SonGeneration extends FatherGeneraton
⇒ SonGeneration은 FatherGeneration의 하위 클래스이다.
💡 !! 메소드 실행 시 하위에 없고 상위에만 있으면 상위 것을 출력하지만, 하위 클래스에 메소드가 존재하면 하위 것을 출력한다 !
- public static void main 문 실행
- sg.getUpTime(); 실행⇒ 오전 6시 기상
- 하위 클래스에 없으니 상위 클래스 것 실행
- sg.returnHomeTimeRule(); 실행
- returnHomeTimeRule이 상위 클래스에도 존재하고 하위 클래스에도 존재한다.
- ⇒ 상위가 아닌 하위 것을 출력한다!
💡 OverLoading : 기존에 없던 새로운 매소드를 정의하는 것 new
💡 OverRiding : 상속받은 메소드의 내용을 변경하는 것 change modify