개발 한번 해블로그
[Java] 17. 자바의 상속(Feat. 김탄&최영도) 본문
자바계의 상속자들(지금 공부하는 것도 드라마처럼 조금이나마 더 흥미있었으면 한다 ㅎㅎㅎ,,,)
일단, 상속이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것이다.
1. 수평적 구조와 수직적 구조의 설계 방법(자바에서 상속이란?)
- 자식과 부모는 상속 관계이기 때문에 자식은 부모의 것을 얼마든지 사용 가능
- 즉 상속이란, 부모가 자식들에게 자신의 것을 사용하라고 허락해주는 것
1) 수평적 구조
일반 사원 | 관리 사원 | 비서 | 일용직 |
이름, 나이, 전화번호, 주소, 입사일, 근무부서 | 이름, 나이, 전화번호, 주소, 입사일, 근무부서 + 관리부서 |
이름, 나이, 전화번호, 주소, 입사일, 근무부서 +상급자 |
이름, 나이, 전화번호, 주소, 입사일, 근무부서 +고용기간 |
<단점>
- 코드의 중복 발생(이름, 나이, 전화번호 ,,)
- 새로운 요구사항 발생시 반영이 어려움(일반 사원에 결혼 여부 정보를 넣는 것 등)
- 확장성 떨어짐(일반 사원, 관리 사원, 비서 외에 추가적인 다른 사원 추가의 경우)
2) 수직적 구조
<장점>
- 코드 중복 부분 최소화
- 새로운 요구사항을 반영하기 쉬움(사원에 저장하여 하위 클래스에서도 사용 가능)
- 확장성이 좋아짐
2. 메모리를 통한 상속(extends)의 이해
- 접근제한자를 protected 사용 : 상속관계에서 하위클래스가 상위클래스의 접근을 허용하는 접근 권한
- super();은 입력안하더라도 자동으로 들어감. 컴파일러는 생성자안에 super();을 넣음
- super();은 상위클래스의 생성자를 호출하는 것
- 상속관계에서 객체생성
- RempVO vo=new RempVO();
- 상속을 사용하면 하위 클래스가 상위클래스를 재활용 가능
- 하위클래스가 상위클래스를 접근하여 사용 가능
- RempVO(자식)인데 Employee(부모)의 기억공간을 사용 가능? -> Yes, 상속을 해주었기 때문
- 자식이 부모의 상태정보를 마음대로 접근 해도되나? -> No, 정보 은닉에 위배
public class Employee_01 {
private String name;
private int age;
private String phone;
private String empDate;
private String dept;
private boolean marriage;
public Employee_01(){
//super(); //상위클래스의 생성자를 호출하는 super(원래 기재 안되어있음) -> new Object() -> 최상위클래스
}
public Employee_01(String name, int age, String phone, String empDate, String dept, boolean marriage) {
this.name = name;
this.age = age;
this.phone = phone;
this.empDate = empDate;
this.dept = dept;
this.marriage = marriage;
}
@Override
public String toString() {
return "Employee_01{" +
"name='" + name + '\'' +
", age=" + age +
", phone='" + phone + '\'' +
", empDate='" + empDate + '\'' +
", dept='" + dept + '\'' +
", marriage=" + marriage +
'}';
}
}
public class EmployeeTest_01 {
public static void main(String[] args) {
//일반 사원 한명의 객체를 생성하고 데이터 저장 후 출력
RempVO_01 vo=new RempVO_01("홍길동",33,"010-1111-1111","2022-10-10","홍보부",false);
//출력
//System.out.println(vo.name+"\t"+vo.age+"\t"+vo.phone+"\t"+vo.empDate+"\t"+vo.dept+"\t"+vo.marriage);
System.out.println(vo.toString());
}
}
public class RempVO_01 extends Employee_01{ //class 자식클래스이름 extend 부모클래스이름 { ... }
public RempVO_01(){
super();
}
public RempVO_01(String name, int age, String phone, String empDate, String dept, boolean marriage){
//초기화(자식이 부모의 기억공간에 초기화를 하는 경우
super(name, age, phone, empDate, dept, marriage); //부모의 생성자를 호출
}
}
3. 상속 관계에서 객체생성
- 상속관계에서 객체 초기화
- RempVO vo=new RempVO(“홍길동”,33,“010-1111-1111”,“2022-10-10”,“홍보부”,true);
- 초기화는 해당하는 객체 자신이 하는 것이 바람직
- 해당 RempVO는 자식 클래스에서 부모의 기억공간에 자식이 초기화
- 객체를 생성할 때 생성자 메소드를 통해 자식 클래스에 넘기면 자식클래스는 부모의 생성자로 데이터를 넘겨서 부모가 자기가 가지고 있는 객체에 데이터를 저장
4. 상속관계에서 객체 초기화
- 상속관계에서 객체 초기화(정보은닉 적용 : protector말고 private)
- 부모의 생성자 호출
public class EmployeeInitTest_01 {
public static void main(String[] args) {
RempVO_01 vo=new RempVO_01("홍길동",33,"010-1111-1111","2022-10-10","홍보부",true);
System.out.println(vo.toString());
}
}
지금 강의를 빠르게 훑는중이라 정말 힘들다 ^_ㅠ,,,,
이제 진짜 무슨말인지 모르겠고,, 강사님이 공유해주시는 화면이 너무 작아서,, 눈이 빠질 지경,,
상속 관련해서 설명 들을때는 다른 강의보다 뭔가 아 이해가 잘된다고 생각을 했는데 막상 코드를 따라하면서 느낀건 나는 하나도 이해를 못했다는 것 ㅎㅎㅎ,,,
이제는 강의 하나를 볼 때 너무 기가 빨려서 진이 다 빠진다 ㅎㅎㅎㅎ,,,
(참고로 드라마 상속자들 안봤음 ㅠㅠㅠㅠㅠㅠㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ ㄴㅓ무,, 오글거려서,,, ㅎㅎㅎㅎㅎㅎ)
'Java' 카테고리의 다른 글
[Java] 19. 객체 형 변환(feat. 캐스팅) (2) | 2023.12.20 |
---|---|
[Java] 18. 상속관계에서 객체 생성 및 Override (2) | 2023.12.20 |
[Java] 16. static과 JVM 메모리 모델 이해하기 (0) | 2023.12.08 |
[Java] 15. 배열이랑 클래스의 관계 (1) | 2023.12.08 |
[Java] 14. 잘 설계된 VO 클래스 (1) | 2023.12.08 |