- 상속특징
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 |