DAY 19 ★★★upcasting(상속의 목적) _1

NA YE SOM·2023년 7월 25일
0

review

person 생성 2가지 방법
1. 디폴트 생성자 이용

-> 파라미터 name을 필드 name으로 보내주기

사람이 할 수 있던 일을 '메소드'로 구현함

getter : 반환타입 + getName, return name;

setter : 반환타입 x +set필드명, (파라미터로 name 받아오기) this.name = ㅜname (받아온 name을 필드로 보내줌)

Getter, Setter : 실무에서 쓰임

★(하드코딩 안하는것!)


생성자 다음자리에 만들어주겠다


-> getter setter쌍으로 묶어서 만들어주겠다

상속관계를 짓고 자식 클래스가 부모클래스를 부르는 suepr 사용!

-> student를 person의 서브클래스로 만들어주는것

-> 서브클래스에서는 부모 클래스를 super라고 부름 !(이름 Person이라고 부르지 않음)


super () 슈퍼클래스의 생성자 호출
person의 생성자 호출


person 클래스의 eat 메소드
super.eat() 슈퍼 클래스가 가지고 있는 멤버(필드,메소드) 호출
-> 필드는 private처리되어있어서 직접적 호출 x


-> Person의 생성자 호출이 됨


-> school은 person한테 넘길 필요없음


-> 서브클래스의 생성자가 호출되기 전에 반드시 부모 클래스의 생성자가 호출(만들어져야 한다 )


-> person이 생성되고 그 다음에 student 처리


-> super의 호출이 없음



-> 인수x, 파라미터 x
-> 디폴트 없는 건 자바가 호출 x


-> 자바에 의해서 사용되었을 것

-> public Person() 디폴트 생성자 지움
-> 오류남
-> 디폴트 생성자만 자바가 직접 부를 수 있다
-> 디폴트 어디있니?


-> 적어도 되고 안적어도 되고 상관없음
-> 자동을 호출된다. 개발자가 작성하지 않아도


-> 개발자가 생략해도 자바에 의해서자동으로 호출될 수 있음



-> 학생이 하는일 만들기

Student는 Person의 기능을 가질 수 있다.

호출할 수 있는 메소드 4개

Student 는 총 7개의 메소드를 가지고 있는 class( 4개 + 자기거 3개)

이름, 학교 채워주는 메소드


-> 상속

이름, 학교를 바로 지정하는 생성자 -> setter를 호출할 필요가 없다

student 밑에 하나더 추가



-> Alba입장에서 personddms studnet임

-> super(); 있어도 그만 없어도 그만



-> 메소드 하나 더(working )만듦

오버라이드(Override) 부모가 가진 메서드를 다시 만드는 것 -> 이유: 부모의 메서드를 사용할 수 없어서(목적이 안맞아서)


-> person에 info() information추가함
-> person의 info()는 student, alba의 메소드 이기도 함

-> student 지금상태에서는 person info() 호출하면 name만 출력

-> 학교까지 출력되기를 바람

person info는 student info에 맞지 않으니까
student에 가서 info 메소드 다시 만들기


-> 부모가 가진 메소드를 자식이 한번 더 만들어서 덮어쓰기 하는것 (오버라이드 )
-> 슈퍼클래스 모형을 서브클래스가 동일한 모형으로 다시 만드는 것



-> private이라 적을 수 없음(나만 가능, 상속관계라도)


-> school은 자기 필드값이니까 get할 필요없음



-> Alba도 마찬가지임
@ annoation : ctrl +_ space (자동완성 기능)

-> 확실하게 오버라이딩 잘 되면 ) alba거라고 알려줌

alba 생성자가 student부르고 student가 다시 person 부름
부모를 계속 부름
제일 꼭대기 부모 부르고 순차적으로 내려옴

★★★upcasting


-> 위로 casting(형변환)


-> 서브클래스가 가진 메소드는 호출이 안된다

-> 다운 캐스팅은 나중에 설명


-> Student 타입이 필요하지만 이제는 그럴 필요 없음


-> 자식객체를 부모타입으로 저장시키는 것!


-> Person 타입으로 관리할 수 있다

(ex)

학생이 10명, 알바생 5명
Student[]
Alba[]

준비해서 처리해야 했지만)

따로

타입이 다른 객체를 하나의 타입으로 모을 수 있다는 장점!

-> 개발이 가능해짐
-> 따로 준비해서 처리해야 한다면) 엄청 복잡해질 것 !

-> ★★★자식 객체를 부모 객체로 저장할 수 있다!

p1 객체의 타입 Person

person 타입으로 저장하기 때문에 person 메소드만 호출할 수 있다.

단점)

student 를 저장했는데 student를 부를 수 없다


-> 해결책 : 1번에 있음) person에 study가 있어야 함


-> 내용은 없어도 됨


-> 적으면 오바라이딩 된 격


-> 덮어쓰기한 메소드가 되어버림


-> p1.study 실행이 됨

p2 객체도 person 타입이라 person에 있는것만 부를 수 있음


-> 오른쪽 working을 쓰겠다


-> person이 study, working하면 안됨
(호출의 목적)
-> 실행될 일이 없기 때문에 본문이 없음


-> 처음부터 student 호출하는게 아니라 person 호출하고 student 에서 실행한다


-> person의 study부르는 것(person에 넣어놓은건 호출만을 위해서)

ctrl + space + 메소드 클릭



본문없는 메소드로 만드는 것 : 최종 목적
-> {중가로} 없앰


연습문제_Retangle, Square(정사각형:넓이와 높이 동일)



-> is a 관계이지만 범위로 생각하면 편리함

-> 둘의 부모 - 자식 관계 만듦


select all 누르기

-> 하드코딩 하지말기


-> getarea 메소드 호출해서 구하기

첫번째 정사각형 단점 보완한 두번째 정사각형

단점) 이런 코드진행 막을 수 없음

-> 보완

넓이와 높이를 둘다 주지말고 하나만 주기


-> 더 안전하게 정사각형 관리 가능

상속을 활용시) "코드재활용" 관점: 슈퍼 클래스의 메소드를 내것 처럼 사용할 수 있음

정사각형도 추가로 필요한 코드가 없음
-> 필요한 정보는 rectangle(슈퍼클래스)에 있음

정사각형은 필드가 없어도 됨

필드값의 입출력위해서 getter,setter필요 : square는 필드가 없으니 getter,setter필요없음

정사각형 넓이 계산법 = 사각형 넓이 계산법
-> 만들필요없음


-> 코드 재활용 관점 : 부모의 코드를 다 가져다 쓰면되서 가져다 쓸 것이 없음


-> 두가지 생성자만 만들면 됨


-> Retangel(슈퍼클래스) 생성자 호출은 super();로 하기로함(생략도 가능)

넓이로 받든 높이로 받든 상관없음

-디폴트는 디폴트로, 높이도 넓이도 없는 텅빈 객체 만들어서
밑에 setter만든것


:넓이와 높이가 모두 6인아이로 -> 필드값 채우고 사용가능


super클래스의 생성자는 super라고 부름

전달해야 하는거 2개(넓이, 높이)

★★★연습문제_chair


-> 의자에 앉은 사람 한명

-> 의자에 이렇게 사람을 앉히고자 함


-> 의자에 앉은 사람 정보를 출력하고자 함

필드 이름 생성
생성자 2개 (디폴트타입, 파라마터 가져올 수 있는 타입)

PERSON 생성할 수 있는 타입이 2가지


-> name은 person의 상속관계 가져다주고, school은 알아서


getter, setter

정보출력 info (약간다르게)

원래는_


-> 이미하고있는일
바꾸기





-> 슈퍼클래스 의 파라미터 중 생성자가 2개인 아이 호출

이번에 info는 직장까지해야함
-> 새로 만들어야 함


student info 호출이랑 name, age모두 출력되는 상태


-> 내걸로 직장만 보여주면 됨


-> 호출되는데 setter, getter인데

Chair 는 디폴트 타입이라 안만들어도 됨

**★★상속시 활용 ) Person이 Student, Alba모두 저장할 수 있다 (여기가 더중요!)

-> 부모는 자식을 모두 저장할 수 있다(upcasting) **

setperson이면 person에 저장하겠다.
-> 부모타입으로 자식들을 저장받을것
(상속이 없다면)
-> chiar하나 만들고 둘다 앉히는게 불가능

상속이 없으면

Student 타입, Alba 타입 따로 따로 만들어야 함


-> 디폴트라 만들필요 없음

★(UPCASTING) new Student가 Person에 저장된다


  • 전달하는곳 따로, 받는 곳 따로


-> 이렇게 하면 같은 의자에 두명이 앉은것

** 면접) UPCASTING 설명, 슈퍼클래스로 자식타입을 관리하기 위한 목적

**타입이 다른 객체를 하나의 타입으로 저장하는 능력 필요

-> "상속" 의 목적

profile
개발자 velog

0개의 댓글