본문 바로가기

Java/[패스트캠퍼스] 100% 환급 챌린지

패스트캠퍼스 환급챌린지 40일차 미션 (3월 11일) : 시그니처 백엔드 Path 초격차 패키지 Online. 강의 후기

https://fastcampus.co.kr/dev_online_besignature
수강 강의명

강의 내용

[1] 상속 관계에서 객체 초기화(1)
[2] 상속 관계에서 객체 초기화(2)
[3] 학습 정리 퀴즈
 

[1] 상속 관계에서 객체 초기화(1)

상속 관계에서 생성자를 통해 객체를 초기화하는 방법(정보 은닉 X)

자식 클래스가 접근할 수 있도록 허용하기 위해 protected 접근 제어를 사용한 상태
*protected : 하위(자식) 클래스가 상위(부모) 클래스에 접근 가능한 접근 제한자
*초기화 : 객체에 값을 집어넣는 것
 

문제점

자식 클래스가 부모 클래스의 상태 정보에 접근하여 데이터를 변경할 수 있음(잘못된 데이터가 들어갈 가능성 높음)
예) RempVO vo = new RempVO("홍길동", 500, "010-1111-1111", "2010.01.01", "홍보부", true);
       age(나이)에 500을 넣으면 부모 클래스의 age(나이)에 500이 저장된다.

Q. 상속 관계를 이용하여 사원 정보를 초기화(자식이 부모의 공간을 접근)하고 출력하시오(정보 은닉X)
자식 클래스가 부모 클래스의 상태 정보에 직접 접근하여 값을 넣음
부모의 상태 정보를 사용하는 건 좋지만, 잘못된 데이터가 들어갈 수 있음(정보 은닉에 위배)
// 사원(VO, DTO)
public class Employee {  // extends Object(생략)
    protected String name;  // 이름
    protected int age;  // 나이
    protected String phone;  // 전화번호
    protected String empDate;  // 입사일
    protected String dept;  // 근무부서
    protected boolean marriage;  // 결혼여부

    public Employee() {
        super();  // 상위 클래스의 생성자 호출 : new Object()
    }

    @Override
    public String toString() {
        return "Employee{" +
            "name='" + name + '\'' +
            ", age=" + age +
            ", phone='" + phone + '\'' +
            ", empDate='" + empDate + '\'' +
            ", dept='" + dept + '\'' +
            ", marriage=" + marriage +
            '}';
    }
}
public class RempVO extends Employee {
    public RempVO() {
        super();
    }

    public RempVO(String name, int age, String phone, String empDate, String dept, boolean marriage) {
        // 초기화(자식이 부모의 기억 공간에 초기화하는 경우)
        // this : 부모의 멤버 변수(RempVO에는 없음)
        this.name = name;
        this.age = age;
        this.phone = phone;
        this.empDate = empDate;
        this.dept = dept;
        this.marriage = marriage;
    }
}
public class EmployeeInitTest {
    public static void main(String[] args) {
        RempVO vo = new RempVO("홍길동", 33, "010-1111-1111", "2024-01-01", "홍보부", true);
        System.out.println(vo);
    }
}
기본적인 상속 관계에서 자식이 부모가 갖는 상태 정보에 어떻게 접근해야 할까?
// 사원(VO, DTO)
public class Employee {  // extends Object(생략)
    private String name;  // 이름
    private int age;  // 나이
    private String phone;  // 전화번호
    private String empDate;  // 입사일
    private String dept;  // 근무부서
    private boolean marriage;  // 결혼여부

    public Employee() {
        super();  // 상위 클래스의 생성자 호출 : new Object()
    }

    @Override
    public String toString() {
        return "Employee{" +
            "name='" + name + '\'' +
            ", age=" + age +
            ", phone='" + phone + '\'' +
            ", empDate='" + empDate + '\'' +
            ", dept='" + dept + '\'' +
            ", marriage=" + marriage +
            '}';
    }
}​
public class RempVO extends Employee {
    public RempVO() {
        super();
    }

    public RempVO(String name, int age, String phone, String empDate, String dept, boolean marriage) {
        // 초기화(자식이 부모의 기억 공간에 초기화하는 경우)
        // this : 부모의 멤버 변수(RempVO에는 없음)
        // this.name = name;  // 에러
        // this.age = age;  // 에러
        // this.phone = phone;  // 에러
        // this.empDate = empDate;  // 에러
        // this.dept = dept;  // 에러
        // this.marriage = marriage;  // 에러
    }
}

 

[2] 상속 관계에서 객체 초기화(2)

상속 관계에서 생성자를 통해 객체를 초기화하는 방법(정보 은닉 O)

일반적으로 상태 정보는 정보 은닉하여 보호해야 함
부모 클래스가 자신의 상태 정보를 보호(정보 은닉)하도록 private 클래스로 설계해야 함
자식 클래스가 부모 클래스에게 초기화할 데이터를 전달하여 부모 클래스가 직접 초기화 하도록 함
 
초기화는 객체 자신이 하는 게 바람직하다.
부모는 부모가, 자식은 자식이 초기화해야 함(Employee = Employee, RempVO = RempVO)
자식 클래스가 부모의 값을 초기화하는 건 바람직하지 않음

Q. 상속 관계를 이용하여 사원 정보를 초기화(자식이 부모의 생성자를 호출)하고 출력하시오.
(1) 생성자 호출
(2) 부모의 생성자 호출
(3) 부모가 자신의 멤버에 값을 초기화
// 사원(VO, DTO)
public class Employee {  // extends Object(생략)
    private String name;  // 이름
    private int age;  // 나이
    private String phone;  // 전화번호
    private String empDate;  // 입사일
    private String dept;  // 근무부서
    private boolean marriage;  // 결혼여부

    public Employee() {
        super();  // 상위 클래스의 생성자 호출 : new Object()
    }

    // 자기 자신의 멤버에 값을 넣기 위함
    public Employee(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{" +
            "name='" + name + '\'' +
            ", age=" + age +
            ", phone='" + phone + '\'' +
            ", empDate='" + empDate + '\'' +
            ", dept='" + dept + '\'' +
            ", marriage=" + marriage +
            '}';
    }
}
public class RempVO extends Employee {
    public RempVO() {
        super();
    }

    public RempVO(String name, int age, String phone, String empDate, String dept, boolean marriage) {
        super(name, age, phone, empDate, dept, marriage);  // 부모의 생성자를 호출
    }
}
public class EmployeeInitTest {
    public static void main(String[] args) {
        RempVO vo = new RempVO("홍길동", 33, "010-1111-1111", "2024-01-01", "홍보부", true);
        System.out.println(vo);
    }
}

 

[3] 학습 정리 퀴즈

Q. 클래스를 수직적 구조로 계층화하여 설계하는 방법

Q. 자바의 상속에서 사용하는 키워드

Q. 상속 관계에 있는 클래스에서 객체 생성할 때 상위 클래스의 생성자를 호출하는 메서드

Q. 상속 관계에서 하위 클래스가 상위 클래스를 접근하기 위한 접근 제한자

Q. 클래스를 수직적 구조로(상속) 설계했을 때의 장점(3가지)

더보기

Q. 클래스를 수직적 구조로 계층화하여 설계하는 방법
상속

Q. 자바의 상속에서 사용하는 키워드
extends

Q. 상속 관계에 있는 클래스에서 객체 생성할 때 상위 클래스의 생성자를 호출하는 메서드
super();  // 기본적인 형태

Q. 상속 관계에서 하위 클래스가 상위 클래스를 접근하기 위한 접근 제한자
protected

Q. 클래스를 수직적 구조로(상속) 설계했을 때의 장점(3가지)
- 코드 중복 최소화
- 유지보수 쉬움
- 확장성

 


 

수강 화면수강 화면
수강 화면

  
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
https://bit.ly/48sS29N

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr