Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발 한번 해블로그

[Java] 17. 자바의 상속(Feat. 김탄&최영도) 본문

Java

[Java] 17. 자바의 상속(Feat. 김탄&최영도)

hide on bush 2023. 12. 20. 10:42

자바계의 상속자들(지금 공부하는 것도 드라마처럼 조금이나마 더 흥미있었으면 한다 ㅎㅎㅎ,,,)
일단, 상속이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것이다.

 

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());
    }
}

 


지금 강의를 빠르게 훑는중이라 정말 힘들다 ^_ㅠ,,,,
이제 진짜 무슨말인지 모르겠고,, 강사님이 공유해주시는 화면이 너무 작아서,, 눈이 빠질 지경,,
상속 관련해서 설명 들을때는 다른 강의보다 뭔가 아 이해가 잘된다고 생각을 했는데 막상 코드를 따라하면서 느낀건 나는 하나도 이해를 못했다는 것 ㅎㅎㅎ,,, 
이제는 강의 하나를 볼 때 너무 기가 빨려서 진이 다 빠진다 ㅎㅎㅎㅎ,,,
(참고로 드라마 상속자들 안봤음 ㅠㅠㅠㅠㅠㅠㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ ㄴㅓ무,, 오글거려서,,, ㅎㅎㅎㅎㅎㅎ)