상속 활용
부모의 매개변수, 메소드를 상속받고, 추가되는 소스나 중복코드는 super키워드, 오버라이딩 기법 등 을 이용한다
상속관계에서 부모, 자식클래스의 멤버변수와 메소드가같으면 어떻게 구분해서 호출할것인가?
멤버변수
: super.멤버변수 -> 부모의 것으로 인식
: this.멤버변수 -> 자식의 것으로 인식( this 생략 가능 )
메서드
: super.부모메서드 -> 부모의 메소드로 인식
: this.자식메서드 -> 자식의 메소드로 인식( this 생략 가능 )
package j23;
//this, super
class Person {
String name;
int age=20;
Person(){}
void print() {
System.out.println("person 메서드 호출=>"+name);
}
}
class Man extends Person{
//상속을 받은 변수와 같은 이름의 변수를 자식클래스에 또 선언 가능
int age=40;
//super=> 부모클래스의 객체를 가리키는 예약어
//1.부모의 멤버변수 지정=>super.멤버변수
//2.부모의 메서드 지정=>super.메서드명~
void print() {
System.out.println("자식클래스의 age:"+age);//40
System.out.println("부모클래스의 age:"+super.age);//20
super.print();
}
}
public class SuperTest2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Man m = new Man();
m.name="홍길동";
m.print();
}
}/*
자식클래스의 age:40
부모클래스의 age:20
자식의 name: 홍길동
*/
상속 예제
package j23;
//부모클래스
public class Employee {
String name;
int age;
String sung;
String addr;
long salary;
//source > generate getter and setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSung() {
return sung;
}
public void setSung(String sung) {
this.sung = sung;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public long getSalary() {
return salary;
}
public void setSalary(long salary) {
this.salary = salary;
}
//생성자
public Employee() {}
public Employee(String name, int age, String sung,
String addr, long salary) {
this.name=name;
this.age=age;
this.sung=sung;
this.addr=addr;
this.salary=salary;
}
//employee는 1.5배, manager는 3배
double bonus() {
return salary*1.5;
}
void display() {
System.out.println("직원 정보");
System.out.println("이름=>"+name);
//System.out.println("이름=>"+this.getName());
System.out.println("나이=>"+age);
System.out.println("성별=>"+sung);
System.out.println("주소=>"+addr);
System.out.println("급여=>"+salary);
System.out.println("보너스=>"+bonus());
//this.bonus() //자기클래스 내부에서는 객체명생략함
}
}
package j23;
//자식클래스
//상속 => 자식클래스명 extends 부모클래스명
class Manager extends Employee {
//다른 패키지면 패키지명도 적어준다
//ctrl+space (상속받은 목록을 확인할 수 있다)
/*
String name;
int age;
String sung;
String addr;
,,,
double bonus(){
return salary*1.5;
}
=> 상속 */
@Override
void display() {
// TODO Auto-generated method stub
/*System.out.println("직원 정보");
System.out.println("이름=>"+name);
System.out.println("이름=>"+this.getName());
System.out.println("나이=>"+age);
System.out.println("성별=>"+sung);
System.out.println("주소=>"+addr);
System.out.println("급여=>"+salary);
System.out.println("보너스=>"+this.bonus());*/
//오버라이딩 시 중복되는 부분은 super키워드를 사용하여 적절히 줄여줘야한다
super.display();//**bonus메서드가 오버라이딩 된 자식메서드로 호출됨
System.out.println("담당 부서명=>"+department);
System.out.println("부하직원의수=>"+sub.length);
}
String department;
//객체배열
//두 클래스 사이를 연결시키는 방법
Employee sub[];
//**생성자는 상속x => 따로 작성 => 따로 호출해야함
public Manager() {}
public Manager(String name, int age, String sung,
String addr, long salary, String department) {
//super();//생략되어있음
super(name,age,sung,addr,salary);
/*자식이 저장해야할 내용을 부모가 대신 저장
this.name=name;//부모클래스의 멤버변수
this.age=age;
this.sung=sung;
this.salary=salary;
this.addr=addr;
*/
//추가(department)
this.department=department;
}
//오버라이딩
//부모메서드의 내용을 자식클래스에 맞게 내용 수정
@Override
double bonus() {
return salary*3.0;
}
}
public class Company {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1. 사원 3명 정보를 저장-> 영업1과에 배정할 예정
Employee e1= new Employee("홍길동",23,"남","강북구",1500);
Employee e2= new Employee("임시",30,"여","부산",1800);
Employee e3= new Employee("임시테스트",32,"남","강북구",1500);
//2. 매니저
Manager m1 = new Manager("임시3",40,"남","부산",2000,"영업1과");
//Employee의 정보를 저장-> 배열에 데이터로 저장
m1.sub= new Employee[3];
m1.sub[0]=e1;//홍길동
m1.sub[1]=e2;//임시
m1.sub[2]=e3;//임시테스트
//부하직원의 정보, 매니저 정보 출력
for(int i=0;i<m1.sub.length;i++) {
System.out.println("---------------------------------");
m1.sub[i].display();
System.out.println();
}
System.out.println("---------------------------------");
System.out.println("Manager");
m1.display();
}
}
/*
---------------------------------
직원 정보
이름=>홍길동
나이=>23
성별=>남
주소=>강북구
급여=>1500
보너스=>2250.0
---------------------------------
직원 정보
이름=>임시
나이=>30
성별=>여
주소=>부산
급여=>1800
보너스=>2700.0
---------------------------------
직원 정보
이름=>임시테스트
나이=>32
성별=>남
주소=>강북구
급여=>1500
보너스=>2250.0
---------------------------------
Manager
직원 정보
이름=>임시3
나이=>40
성별=>남
주소=>부산
급여=>2000
보너스=>6000.0
담당 부서명=>영업1과
부하직원의수=>3
*/
'JAVA' 카테고리의 다른 글
[JAVA]자바 객체 생성/ CallByValue/ CallByReference (0) | 2021.01.25 |
---|---|
[JAVA]접근지정자 private, default, protected, public / 라이브러리 (0) | 2021.01.22 |
[JAVA]상속의 특징, 장단점, super, super(), 오버라이딩, 상속과 생성자와의 관계, toString() (0) | 2021.01.20 |
[JAVA]API 참조 (0) | 2021.01.19 |
[JAVA]고정배열, 가변배열, 동적배열(가변인자) (0) | 2021.01.18 |