상속 활용

부모의 매개변수, 메소드를 상속받고, 추가되는 소스나 중복코드는 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
*/

 

 

 

+ Recent posts