기록 저장소
[Java #13] inheritance 본문
[ 상속 (inheritance) ]
1. 기본개념
형식)
접근제어자 class ClassName extends ClassName {
}
>> 앞의 것 : 하위class, 뒤의 것: 상위class
▷ 상위class의 filed와 method를 하위class에서 사용 (객체생성 없이)
단, private field와 private method 및 생성자는 상속 불가!! (객체 생성시 상위class의 생성자가 자동으로 호출됨)
▷ extends keyword 사용
▷ class간의 상속은 단일 상속만 가능 (다중상속 불가) → 상위class는 하나만 쓸 수 있다는 의미
▷ 계층적 상속은 가능
▷ 모든 클래스의 최상위 클래스는 Object class임 (default!)
▷ method overriding(method의 재정의) : 하위class의 기능에 맞게 재정의
method의 선언은 그대로 유지 : 인자값, 개수 등은 유지 (외형은 바꾸면 안되고, 그 안의 기능만 재정의 한다는 의미)
단, 접근제어자는 넓은 의미로 변경 가능 (ex. default를 public으로 변경 가능)
but private는 상속이 불가하므로 private → default는 불가
▷ super. / super()
- this
- super : 상위클래스 참조변수
- this()
- super() : 상위클래스의 생성자 호출
>> 상속관계에 있을 경우, 생성자를 생성하면 default로 super();가 있음
▷ 다형성 : 하위class를 참조하여 상위class의 객체를 생성 (추상클래스에서는 A a = new A();가 안됨! 다형성으로 객체 생성해야함)
A.class(상위) B.class(하위)
A a = new A();
B b = new B();
A a = new B();
▷ class의 관계
- has a : 집합 (비행기는 자동차이다 X → 객체 생성하여 가져다 쓸 수는 있음)
- is a : 상속 (택시는 자동차이다 → 택시는 자동차를 상속할 수 있음)
상위 자동차 - 차이름, 색상, 제조사, 속도
(Car) 가속(), 감속(), 정지()
하위 택시(Taxi) 150 버스(Bus) 110 트럭(Truck) 100
요금(price) 승객수(pcount) 중량(weight), 총중량(maxWeight)
요금계산() 타다() 상차()
calcPrice(int km) getOn(int pcount) loadUp(int weight)
내리다() 하차()
getOut(int pcount) loadDown(int weight)
- 생성자가 호출되는 순간, 객체가 메모리에 올라가며, 객체가 메모리에 올라가야 해당 객체의 필드와 메소드를 사용할 수 있게됨
2. 상세내용 & 예제
▷ method의 overriding
@Override
@ : annotation. 의미를 부여하는 주석. 하위클래스에서 method이름 다르게 쓰면 에러 발생함
(cf. //등은 컴파일시에 제외하라는 의미)
@Override
public int speedUp(int speed) {
this.speed += speed;
if(this.speed > 150)
this.speed = 150;
return this.speed;
}
// ↓↓
@Override
public int speedUp(int speed) {
super.speedUp(speed); //중복되는 부분을 호출로 해결함!
if(this.speed > 150)
this.speed = 150;
return this.speed;
}
▷ toString()
- object를 string으로 변환해주는 object 클래스의
System.out.println(t1.toString() + " " + t2.toString()); //object는 모든 클래스의 상위클래스이므로, 하위클래스 객체명.toString으로 호출가능
System.out.println(t1 + " " + t2);//toString() 생략하더라도, 객체를 문자열과 더하면 자동 호출하면 안됨
- toString의 overriding
@Override
public String toString() { //object class의 method를 override
return maker +"에서 만든 " + color + " " + carName ;
}
▷ hashcode()
- 객체의 주소값을 반환해주는 object 클래스의 method
System.out.println(t2.hashCode() + " " + t3.hashCode());
▷ equals()
- 객체의 주소값을 비교
if(t2.equals(t3))
System.out.println("t2와 t3는 차이름이 같은차이다.");
else
System.out.println("t2와 t3는 차이름이 다른차이다.");
-equals의 overriding
@Override
public boolean equals(Object obj) {
Car car = (Car) obj;
//if(carName == car.carName)//""일 경우는 true, new String("")일 경우는 false.
if(carName.equals(car.carName))
return true;
return false;
}
'kitri 노트 > java' 카테고리의 다른 글
[Java #15] interface (0) | 2019.03.25 |
---|---|
[Java #14] abstract (0) | 2019.03.25 |
[Java #12] method (0) | 2019.03.22 |
[Java #11] field, constructor (0) | 2019.03.21 |
[Java #10] Class (0) | 2019.03.21 |