person 생성 2가지 방법
1. 디폴트 생성자 이용
-> 파라미터 name을 필드 name으로 보내주기
사람이 할 수 있던 일을 '메소드'로 구현함
★(하드코딩 안하는것!)
생성자 다음자리에 만들어주겠다
-> 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개)
이름, 학교 채워주는 메소드
-> 상속
student 밑에 하나더 추가
-> Alba입장에서 personddms studnet임
-> super(); 있어도 그만 없어도 그만
-> 메소드 하나 더(working )만듦
-> 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 부름
부모를 계속 부름
제일 꼭대기 부모 부르고 순차적으로 내려옴
-> 위로 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 + 메소드 클릭
본문없는 메소드로 만드는 것 : 최종 목적
-> {중가로} 없앰
-> is a 관계이지만 범위로 생각하면 편리함
-> 둘의 부모 - 자식 관계 만듦
select all 누르기
-> 하드코딩 하지말기
-> getarea 메소드 호출해서 구하기
첫번째 정사각형 단점 보완한 두번째 정사각형
단점) 이런 코드진행 막을 수 없음
-> 보완
넓이와 높이를 둘다 주지말고 하나만 주기
-> 더 안전하게 정사각형 관리 가능
정사각형도 추가로 필요한 코드가 없음
-> 필요한 정보는 rectangle(슈퍼클래스)에 있음
정사각형은 필드가 없어도 됨
필드값의 입출력위해서 getter,setter필요 : square는 필드가 없으니 getter,setter필요없음
정사각형 넓이 계산법 = 사각형 넓이 계산법
-> 만들필요없음
-> 코드 재활용 관점 : 부모의 코드를 다 가져다 쓰면되서 가져다 쓸 것이 없음
-> 두가지 생성자만 만들면 됨
-> Retangel(슈퍼클래스) 생성자 호출은 super();로 하기로함(생략도 가능)
넓이로 받든 높이로 받든 상관없음
-디폴트는 디폴트로, 높이도 넓이도 없는 텅빈 객체 만들어서
밑에 setter만든것
:넓이와 높이가 모두 6인아이로 -> 필드값 채우고 사용가능
super클래스의 생성자는 super라고 부름
전달해야 하는거 2개(넓이, 높이)
-> 의자에 앉은 사람 한명
-> 의자에 이렇게 사람을 앉히고자 함
-> 의자에 앉은 사람 정보를 출력하고자 함
필드 이름 생성
생성자 2개 (디폴트타입, 파라마터 가져올 수 있는 타입)
PERSON 생성할 수 있는 타입이 2가지
-> name은 person의 상속관계 가져다주고, school은 알아서
getter, setter
원래는_
-> 이미하고있는일
바꾸기
-> 슈퍼클래스 의 파라미터 중 생성자가 2개인 아이 호출
이번에 info는 직장까지해야함
-> 새로 만들어야 함
student info 호출이랑 name, age모두 출력되는 상태
-> 내걸로 직장만 보여주면 됨
-> 호출되는데 setter, getter인데
Chair 는 디폴트 타입이라 안만들어도 됨
-> 부모는 자식을 모두 저장할 수 있다(upcasting) **
setperson이면 person에 저장하겠다.
-> 부모타입으로 자식들을 저장받을것
(상속이 없다면)
-> chiar하나 만들고 둘다 앉히는게 불가능
상속이 없으면
Student 타입, Alba 타입 따로 따로 만들어야 함
-> 디폴트라 만들필요 없음
-> 이렇게 하면 같은 의자에 두명이 앉은것
**타입이 다른 객체를 하나의 타입으로 저장하는 능력 필요