자동차 예시로 상속을 뜯어보자.
Car class (부모 클래스),
Super class (자식 클래스, Car class를 상속받는다.),
CarTest class (MainClass) 3개의 클래스를 만들었다.
먼저 Car class에서 변수4개를 지정해주고 초기화를 해주었다.
wheel : 자동차 바퀴는 항상 언제나 4개이다. 바뀌지 않는 사실이기 때문에
밑에서 새롭게 수정할 수 없게 해줘야 한다.
private으로 써도 되지만 이건 접근 권한제어자이기 때문에
아예 못하게 하려면 상수(final)로 선언해주면 된다.
final int wheel = 4;
4개의 변수에 대한 초기화는 오버로딩으로 한다.
(ctrl + shift + s + o)
그리고 자동차기능 메서드 2개를 추가해주고 price의 getter,setter을 추가해준다.
price(private)만 getter,setter 추가 이유.
다른클래스가 경고는 해주되 접근을 할 수 있게끔 price에 대한 getter,setter을 만들어준다.
SuperCar 클래스로 넘어가자.
String mode;
supercar만 가진 변수를 추가도 해보았다.
SuperCar에서도 brand color price를 사용하려면 초기화를 해야한다.
여기서 this.~~~로 초기화 하는 것이 아닌 이미 상속받는 부모에서 this로 초기화를 했기 때문에 부모에서 만들어진거를 사용하자!
부모에 있는 생성자를 호출하는 keyword : super을 사용해서 초기화.
super(brand, color, price);
< 초기화가 되는 방법 >
얘는 중괄호 없으니 얘는 사용하는 것이다. (선언아니다!!)
사용할때 매개변수에 값을 전달한다. 외부에서 받아온 값들을 부모클래스의 생성자에 넘긴다.
SuperCar를 객체화했을때 넘겨준 값들이 부모 생성자에서 초기화 된다.
price(private)는 setPrice(price);
set으로 접근해서 초기화해도 된다. (getter,setter을 만들었기 때문이다.)
this.mode = mode;
supercar만 가진건 이렇게 초기화해준다.
superCar 클래스에서 supercar는 음성으로 시동킴 시동끔이 되도록 engineStart/Stop을 Overriding해서 재정의도 해주었다.
초기화를 완료했다면 main에서 불러오도록 하자.
< 출력 결과 >
SuperCar superCar = new SuperCar();
기본생성자를 호출했을때는 부모걸 가지고 온다.
=> 출력
부모 클래스의 기본 생성자
자식 클래스의 기본 생성자
SuperCar ferrari = new SuperCar("ferrari","Red",45000,"sport");
=> 출력(주소값이 출력 된다.)
inheritance.SuperCar@379619aa
객체 출력시 주소값이 출력된다..
객체를 출력했을때도 안에 있는 정보가 나오면 좋을텐데..
그럴 경우엔! toString을 오버라이딩해야한다.
toString이 뭐야??
< object클래스 > 에서 확인이 가능하다.
toString의 return값이 객체명 찍었을때 나왔던 값이랑 같다.
=> 객체명 뒤에는 "객체명.toString"이 생략되어있다.
클래스 이름 + @ +클래스의 주소값
(@을 구분점으로 한다.)
즉, toString 메서드의 return타입은 String이다.
toString은 object에 상속되어 있으므로 모든 객체에는 .toString 생략되어있다.
즉, object클래스에서 toString이 선언되었고 모든 클래스는 object를 상속받기 때문에 toString을 재정의(overriding) 할 수 있다.
toString을 오버라아딩해서 재정의하였다.
tostring의 return타입을 String으로 주는 이유는 사용하는 부분 전체를 문자열 값으로 알려주기 위해서.
toString의 return타입은 String이기 때문에 부모 클래스의 return타입과 매개변수는 건들수없다.
return부분에 내가 출력하고 싶은메세지를 넣으면 된다.
private인 price는 게터세터이용해서 가져와야한다.( getPrice() )
this.brand
this는 객체가 마침표를 찍었을때 자동으로 넘어가는 주소값을 가진다.
=> 주소값으로 비교한다.
toString오버라이딩해서 재정의한것에 return에 값을 넣어 주었다.
SuperCar ferrari = new SuperCar("ferrari","Red",45000,"sport");
메인클래스에 적힌 정보 그대로 출력이 된다.
객체명을 뽑았는데 안에있는 정보가 나오니 편하다!!!