Super

Mia Lee·2021년 12월 13일
0

JAVA

목록 보기
73/98
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();
			
		}
		
	}
	
}














0개의 댓글