package ex_super;
public class Ex1 {
public static void main(String[] args) {
/*
* super
*
* 1. 레퍼런스 super
* - 슈퍼클래스의 인스턴스에 있는 멤버(변수, 메서드)에 접근
* - 오버라이딩으로 은닉된 슈퍼클래스의 변수 또는 메서드에 접근하기 위한 용도로 사용
* - 기본 사용법
* super.멤버변수 또는 super.메서드()
*
*/
Employee emp = new Employee("홍길동", 3000);
System.out.println(emp.getEmployee());
System.out.println("=================================");
Manager man = new Manager("이순신", 4000, "개발1팀");
System.out.println(man.getEmployee());
System.out.println("=================================");
Engineear eng = new Engineear();
System.out.println(eng.getEmployee());
System.out.println("=================================");
eng.print("박장범");
}
}
/*
* 직원(Employee) 클래스 정의
* - 멤버변수 : 이름(name, 문자열), 연봉(salary, 정수)
* - 생성자
* 1) 기본 생성자 - 아무 작업도 수행하지 않음
* 2) 이름, 연봉 전달받아 초기화하는 생성자
* - 메서드
* 1) getEmployee() : 파라미터 없음, 리턴타입 String
* => 이름, 연봉을 문자열 결합 후 리턴
*
*/
class Employee {
String name;
int salary;
public Employee() {}
public Employee(String name, int salary) {
this.name = name;
this.salary = salary;
}
public String getEmployee() {
// 이름, 연봉을 문자열로 결합하여 리턴
return name + ", " + salary;
}
}
/*
* Manager 클래스 정의 - Employee 클래스를 상속
* - 멤버변수 : 부서명(depart, 문자열)
* - 생성자 : 이름, 연봉, 부서명 전달받아 초기화하는 생성자
* - 메서드
* 1) getEmployee() 메서드 오버라이딩
* => 이름, 연봉, 부서명을 문자열로 결합 후 리턴
*
*/
class Manager extends Employee {
String depart;
public Manager(String name, int salary, String depart) {
this.name = name;
this.salary = salary;
this.depart = depart;
}
@Override
public String getEmployee() {
// 이름, 연봉, 부서명을 문자열로 결합하여 리턴하도록 오버라이딩
return name + ", " + salary + ", " + depart;
// 현재 Manager 클래스 내에서 더 이상 슈퍼클래스인 Employee 클래스의 getEmployee() 메서드는
// 보이지 않는다!
// => 슈퍼클래스인 getEmployee() 메서드에서 이미 이름(name), 연봉(salary)을 문자열로
// 결합하여 리턴하므로 슈퍼클래스의 getEmployee() 메서드를 호출한 뒤 부서명만 별도로
// 결합해도 된다!
// => 이 때, 슈퍼클래스의 동일한 메서드를 호출하려면 super.메서드명()을 통해
// 은닉된 메서드 호출이 가능
// return super.getEmployee() + ", " + depart;
}
// @Override
// public String getEmployee() {
// return super.getEmployee() + ", " + depart;
// }
}
// Engineear 클래스 정의 - Employee 클래스 상속
class Engineear extends Employee {
// 메서드와 마찬가지로 멤버변수도 슈퍼클래스와 동일한 변수 선언 시
// 슈퍼클래스의 멤버변수는 은닉되어 보이지 않게 됨
String name = "엔지니어이름"; // 슈퍼클래스와 동일한 멤버변수 선언
String skill;
@Override
public String getEmployee() {
// return super.getEmployee();
// return name + ", " + salary;
// => 동일한 이름을 통해 부모의 변수가 은닉되면
// 서브클래스에서 해당 변수 사용 시 서브클래스의 변수가 호출
// 만약, 슈퍼클래스의 은닉된 멤버변수에 접근하려면
// super.변수명 의 형태로 부모의 은닉된 변수에 접근 가능
return super.name + ", " + salary;
}
// 로컬변수, 멤버변수, 슈퍼클래스의 멤버변수를 각각 호출하는 방법
public void print(String name) {
// 로컬변수, 멤버변수, 슈퍼클래스의 멤버변수 이름이 모두 같을 때
// 로컬변수
System.out.println("name = " + name);
// 자신의 멤버변수
System.out.println("this.name = " + this.name);
// 부모의 멤버변수
System.out.println("super.name = " + super.name);
}
}
연습
package ex_super;
public class Test1 {
public static void main(String[] args) {
SpiderMan s = new SpiderMan();
// 스파이더모드 설정
s.isSpider = true;
// SpiderMan 클래스의 점프 기능 호출
s.jump();
// 스파이더모드 해제
s.isSpider = false;
s.jump();
// => SpiderMan 클래스의 jump() 메서드에서 슈퍼클래스인 Person 클래스의 점프 기능이 호출!
}
}
/*
* 사람(Person) 클래스 정의
* 멤버변수
* 1) 이름(name)
* 2) 나이(age)
* 메서드 정의
* 1) 점프(jump)
* - 매개변수 없고, 리턴값 없음
* - "일반인의 점프!" 출력
*
* 스파이터맨(SpiderMan) 클래스 정의 - Person 클래스 상속
* 멤버변수
* 1) 스파이터맨모드(isSpider, boolean)
* 메서드 정의
* 1) 점프(jump) 메서드 오버라이딩
* => 스파이더모드가 true 일 때 "스파이더맨의 엄청난 점프!" 출력하고
* 아니면 Person 클래스의 점프 메서드를 호출
*
*/
class Person {
String name;
int age;
public void jump() {
System.out.println("일반인의 점프!");
}
}
class SpiderMan extends Person {
// 스파이더맨모드 여부를 저장하는 boolean 타입 변수 isSpider 선언
boolean isSpider;
@Override
public void jump() {
if (isSpider) { // isSpider == true 와 동일
System.out.println("스파이더맨의 엄청난 점프!");
} else {
// 슈퍼클래스의 jump() 메서드 호출
// => 은닉되어 있으므로 레퍼런스 super를 사용하여 접근
super.jump();
}
}
}