본문 바로가기
Programming/JAVA(eclipse)

java 8일차 _02. 상속

by yoon9i 2024. 3. 19.

- 상속특징
1) 반드시 is a 관계가 성립해야 된다.
2) Engineer is a Employee 경우에는
Engineer 를 자식클래스, sub 클래스, child 클래스라고 하고
Employee 를 부모 클래스, super 클래스, parent 클래스라고 부른다.

중요: 부모인 Employee 가 자식인 Engineer 보다 더 큰 타입이라고
할수 있다.( * )

3) extends 부모클래스 형식을 사용한다.
4) 단일 상속( single inheritance )만 지원됨.
==> extends 뒤에 명시한 부모클래스는 하나만 지정 가능.
5) 명시적으로 extends 가 없는 클래스는 자동으로 extends Object
   가 지정된다.
==> class Employee { } 지정하면 자동으로
       class Employee extends Object { } 가 된다.
6) 상속을 UML 로 표현할 때는 삼각형+실선 으로 표현
7) java.lang.Object 클래스는 최상위 클래스이다.
8) 상속을 하면 가장 큰 장점은 재사용이 가능하다.
   부모에서 정의한 변수 및 메서드를 자식에서 정의없이
   사용할 수 있다. 이것을 상속해서 사용한다고 말하는 것이다.
9) 상속이 안되는 2가지 경우
- 생성자
- private 로 된 변수 및 메서드
10) 자식에서 super 키워들 사용할 수 있다.
가. this 키워드
- this 는 heap 메모리에 생성된 자신의 인스턴스를 가리킨다.
- 일반적으로 this 는 생략해서 사용된다.
  반드시 this 를 명시적으로 사용해야 되는 경우
  a. 인스턴스변수와 로컬변수 이름이 동일한 경우
     ==> 문법: this.변수, this.메서드( );
  b. 다른 생성자 호출하는 경우
     ==> 특정 생성자에게 인자값을 집중화해서 초기화하는 역할.
     ==> 주의할 점은 반드시 첫 라인에서 사용해야된다.
     ==> 문법: this( ), this(10);

나. super 키워드
- super 는 heap 메모리에 생성된 부모의 인스턴스를 가리킨다.
- 일반적으로 super 는 생략해서 사용된다.
반드시 super 를 명시적으로 사용해야 되는 경우 2가지

  a. 부모의 변수와 자식의 변수 이름이 동일한 경우
     ( 부모의 메서드와 자식 메서드가 동일한 경우 )
    ==> 문법: super.변수, super.메서드( )
  b. 부모의 생성자 호출하는 경우
     ==> 부모 생성자에서 초기화하는 역할.
     ==> 주의할 점은 반드시 첫 라인에서 사용해야된다.
     ==> 문법: super( ), super(10);

11) 항상 자신보다 부모를 먼저 생성한다.
==> 매커니즘: 자식의 생성자 첫라인에서 자동으로 부모 생성자를
                    호출하는 코드가 삽입이 된다. 그 코드가 super( ) 이다.
==> 명시적으로 super( ); 사용할 수 있다.
       반드시 첫라인에서 사용해야된다.

결국은 Object 클래스가 가장 먼저 생성이 된다.

12) 오버라이딩(overriding) 메서드가 가능하다.
개념: 부모의 메서드를 자식이 재정의하는 것을 의미한다.
규칙:

부모: 접근지정자 리턴타입 메서드명(변수,...) { }

@Override ==> 어노테이션( annotation )
자식:           X         리턴타입 메서드명(변수,...) { }

X 에는 부모에서 지정된 접근지정 레벨과 같거나
덜 엄격한 레벨값을 지정할 수 있다.
* @Override (==> 어노테이션( annotation )) 을 지정하여
오버라이딩된 메서드인걸 알려준다.

public - 원활
protected 
(default) 
private - 엄격

    부모: 접근지정자 리턴타입 메서드명(변수,...)
        throws 예외클래스 { }

    자식:        X       리턴타입 메서드명(변수,...) Y { }

Y 에는 부모에서 지정된 예외클래스와 같거나
자식 예외클래스만 지정할 수 있다.

object
    |
Exception
    |
RuntimeException
    |
ArrayIndexOutofBoundsException, NullPointerException,...

 

package exam12_상속전;

public class TestMain {

	public static void main(String[] args) {
		
		Engineer eng = new Engineer("홍길동",100,"JAVA");
		Manager m = new Manager("이순신", 200, "인사");
		Secretary s = new Secretary("유관순", 200);
		
		System.out.println(eng.getEngineer());
		System.out.println(m.getManager());
		System.out.println(s.getSecretary());
	}

}
package exam12_상속전;

// 엔지니어 클래스

public class Engineer {
	
	String name;
	int salary;
	String skill;
	
	public Engineer(String name, int salary, String skill) {
		this.name = name;
		this.salary = salary;
		this.skill = skill;
	}
	
	// getter & setter 작성
	
	// 3가지 변수를 한번에 리턴해주는 메서드 작성
	public String getEngineer() {
		return name+"\t"+salary+"\t"+skill;
	}
}
package exam12_상속전;

// 관리자 클래스
public class Manager {
	
	String name;
	int salary;
	String depart; // 부서명
	
	public Manager(String name, int salary, String depart) {
		this.name = name;
		this.salary = salary;
		this.depart = depart;
	}
	
	// getter & setter 작성
	// 3가지 변수를 한번에 리턴해주는 메서드 작성
	public String getManager() {
		return name+"\t"+salary+"\t"+depart;
	}
}
package exam12_상속전;

// 비서 클래스
public class Secretary {
	
	String name;
	int salary;
	
	public Secretary(String name, int salary) {
		this.name = name;
		this.salary = salary;
	}
	
	// getter & setter 작성
	// 2가지 변수를 한번에 리턴해주는 메서드 작성
	public String getSecretary() {
		return name+"\t"+salary;
	}
}

 

################################################################################################

 

package exam12_상속후_1_기본;

public class TestMain2 {

	public static void main(String[] args) {
		
		Engineer2 eng = new Engineer2("홍길동",100,"JAVA");
		Manager2 m = new Manager2("이순신", 200, "인사");
		Secretary2 s = new Secretary2("유관순", 200);
		
		System.out.println(eng.getEngineer());
		System.out.println(m.getManager());
		System.out.println(s.getSecretary());
	}

}
package exam12_상속후_1_기본;

// Engineer, Secretary, Manager 클래스들의
// 공통적인 속성과 메서드를 뽑아서
// 더 큰 개념의 클래스를 만들자...
public class Employee2 {
	String name;
	int salary;
	
	// getter, setter
	
	public String getEmployee() {
		return name+"\t"+salary;
	}
}
package exam12_상속후_1_기본;

// 엔지니어 클래스
//'Engineer is a Employee' 성립이 되면 상속이 가능
public class Engineer2 extends Employee2 {
	
	String skill;
	
	public Engineer2(String name, int salary, String skill) {
		this.name = name;
		this.salary = salary;
		this.skill = skill;
	}
	
	// getter & setter 작성
	
	// 3가지 변수를 한번에 리턴해주는 메서드 작성
	public String getEngineer() {
		return name+"\t"+salary+"\t"+skill;
	}
}
package exam12_상속후_1_기본;

// 관리자 클래스
public class Manager2 extends Employee2 {
	
	String depart; // 부서명
	
	public Manager2(String name, int salary, String depart) {
		this.name = name;
		this.salary = salary;
		this.depart = depart;
	}
	
	// getter & setter 작성
	// 3가지 변수를 한번에 리턴해주는 메서드 작성
	public String getManager() {
		return name+"\t"+salary+"\t"+depart;
	}
}
package exam12_상속후_1_기본;

// 비서 클래스
public class Secretary2 extends Employee2 {
	
	String name;
	int salary;
	
	public Secretary2(String name, int salary) {
		this.name = name;
		this.salary = salary;
	}
	
	// getter & setter 작성
	// 2가지 변수를 한번에 리턴해주는 메서드 작성
	public String getSecretary() {
		return name+"\t"+salary;
	}
}

 

################################################################################################

 

package exam12_상속후_2_super;

public class TestMain3 {

	public static void main(String[] args) {
		
//		Engineer3 eng = new Engineer3("홍길동",100,"JAVA");
		Manager3 m = new Manager3("홍길동", 100, "인사");
		System.out.println(m.getManager());
		
		Secretary3 s = new Secretary3("이순신", 200);
		System.out.println(s.name);
		System.out.println(s.getSecretary());
	}

}
package exam12_상속후_2_super;

// Engineer, Secretary, Manager 클래스들의
// 공통적인 속성과 메서드를 뽑아서
// 더 큰 개념의 클래스를 만들자...
public class Employee3 {
	String name;
	int salary;
	
	// getter, setter
	
	public Employee3() {
		super(); // 자동삽입됨. 명시적으로 지정할 때는 반드시 첫라인에 사용해야함.
		System.out.println(" Employee3 생성자 ");
	}
	
	public Employee3(String name, int salary) {
		this.name = name;
		this.salary = salary;
	}
	
	public String getEmployee() {
		return name+"\t"+salary;
	}
}
package exam12_상속후_2_super;

// 엔지니어 클래스
//'Engineer is a Employee' 성립이 되면 상속이 가능
public class Engineer3 extends Employee3 {
	
	String skill;
	
	public Engineer3(String name, int salary, String skill) {
		super(); // 자동삽입됨.
		
		System.out.println(" Engineer3 생성자 ");
		this.name = name;
		this.salary = salary;
		this.skill = skill;
	}
	
	// getter & setter 작성
	
	// 3가지 변수를 한번에 리턴해주는 메서드 작성
	public String getEngineer() {
		return name+"\t"+salary+"\t"+skill;
	}
}
package exam12_상속후_2_super;

// 관리자 클래스
public class Manager3 extends Employee3 {
	
	String depart; // 부서명
	
	public Manager3(String name, int salary, String depart) {
		super(name, salary); // 자동삽입; 부모에서 선언되었기 때문에 부모생성자에서 초기화하자.
		
		this.depart = depart;
	}
	
	// getter & setter 작성
	// 3가지 변수를 한번에 리턴해주는 메서드 작성
	public String getManager() {
		return name+"\t"+salary+"\t"+depart;
	}
}
package exam12_상속후_2_super;

// 비서 클래스
public class Secretary3 extends Employee3 {
	
	String name;
	
	public Secretary3(String name, int salary) {
		this.name = name;
		this.salary = salary;
	}
	
	// getter & setter 작성
	// 2가지 변수를 한번에 리턴해주는 메서드 작성
	public String getSecretary() {
		System.out.println("부모의 name 호출: " + super.name);
		return this.name+"\t"+salary;
	}
}

 

################################################################################################

 

package exam12_상속후_3_오버라이딩;

public class TestMain4 {

	public static void main(String[] args) {
		
		Engineer4 eng = new Engineer4("홍길동",100,"JAVA");
		Manager4 m = new Manager4("이순신", 200, "인사");
		Secretary4 s = new Secretary4("유관순", 200);
		
		System.out.println(eng.getEmployee());
		System.out.println(m.getEmployee());
		System.out.println(s.getEmployee());
	}

}
package exam12_상속후_3_오버라이딩;

// Engineer, Secretary, Manager 클래스들의
// 공통적인 속성과 메서드를 뽑아서
// 더 큰 개념의 클래스를 만들자...
public class Employee4 {
	String name;
	int salary;
	
	// getter, setter
	
	public String getEmployee() {
		return name+"\t"+salary;
	}
	
//	public String getEmployee() {
//		return name+"\t"+salary;
//	} 
	// 부모가 public 이기에 자식들이 전부다 public 이어야 한다.
	// 부모에서 지정된 접근지정 레벨과 같거나 덜 엄격한 레벨값을 지정할 수 있다.
}
package exam12_상속후_3_오버라이딩;

// 엔지니어 클래스
//'Engineer is a Employee' 성립이 되면 상속이 가능
public class Engineer4 extends Employee4 {
	
	String skill;
	
	public Engineer4(String name, int salary, String skill) {
		this.name = name;
		this.salary = salary;
		this.skill = skill;
	}
	
	// getter & setter 작성
	
	// 3가지 변수를 한번에 리턴해주는 메서드 작성
	@Override
	public String getEmployee() {
		return name+"\t"+salary+"\t"+skill;
	}
}
package exam12_상속후_3_오버라이딩;

// 관리자 클래스
public class Manager4 extends Employee4 {
	
	String depart; // 부서명
	
	public Manager4(String name, int salary, String depart) {
		this.name = name;
		this.salary = salary;
		this.depart = depart;
	}
	
	// getter & setter 작성
	// 3가지 변수를 한번에 리턴해주는 메서드 작성
	@Override
	public String getEmployee() {
		return name+"\t"+salary+"\t"+depart;
	}
}
package exam12_상속후_3_오버라이딩;

// 비서 클래스
public class Secretary4 extends Employee4 {
	
	String name;
	int salary;
	
	public Secretary4(String name, int salary) {
		this.name = name;
		this.salary = salary;
	}
	
	// getter & setter 작성
	// 2가지 변수를 한번에 리턴해주는 메서드 작성
	@Override
	public String getEmployee() {
		return name+"\t"+salary;
	}
}

상속
오버라이딩

 

################################################################################################

 

 

'Programming > JAVA(eclipse)' 카테고리의 다른 글

java 8일차 _03. 다형성  (0) 2024.03.19
java 8일차_ 02. 상속(2)  (0) 2024.03.19
java 8일차 _01. 클래스 관계  (0) 2024.03.19
java 8일차 _ 7일차 리뷰  (0) 2024.03.19
java 7일차_ 03. import & package (+ UML )  (0) 2024.03.18