JAVA_13_상속 & Object클래스 & super & instanceof

hyeong taek jo·2023년 7월 5일

JAVA

목록 보기
13/39

📌1. 상속이란?

  • 두 클래스를 조상과 자손으로 관계를 맺어주는 것
  • 자손은 조상의 모든 멤버를 상속받는다. (생성자, 초기화블럭 제외)
  • 공통부분은 조상에서 관리하고 개별부분은 자손에서 관리
  • 조상의 변경은 자손에 영향을 미치지만, 자손의 변경은 조상에 아무런 영향을 미치지 않는다
  • private 객체변수는 상속 안됨
  • 자바에서는 단일상속만이 가능하다(부모클래스가 한 개 만 가능)
  • 부모의 생성자는 무조건 생성한다. 만일 부모를 호출하는 생성자가 없다면 부모의 기본생성자를 호출한다.
    (상속받은 부모의 끝까지 생성자를 생성해야한다.)

📌2. Object 클래스

  • 조상이 없는 클래스는 자동적으로 Object클래스를 상속.
  • 상속계층도의 최상위에는 Object클래스가 위치한다.
  • 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속.
    toString(), equals(Object obj), hashCode(), ...

📌3. super

  1. 하위 클래스에 의해 가려진 상위 클래스의 멤버 변수나 메소드에 접근할 때
    ▷ super.객체변수
    ▷ super.메소드이름(매개변수)
  2. 상위 클래스의 생성자를 호출할 때
    ▷ super(매개변수)

📌4. instanceof

  • 타입을 알아볼 때 사용한다.
  • ex : (a instanceof b) --> a는 b 타입을 가지고 있느냐

예시

public class Car2 {
	int a = 7;
	void move() {
		System.out.println("차 이동...");
	}
}

// 상속
// extend --> class를 상속할 때
// in     --> interface를 상속할 때

// 상속.1
class Bus extends Car2 {
	int a = 25;
	
	@Override
	void move() {
		System.out.println("40명 태우고 이동");
	}
}

// 상속.2
class Ambulance extends Car2 {
	int a = 100;
	
	@Override
	void move() {
		System.out.println("사이렌 울리며 이동");
	}
	
	void special() {
		System.out.println("환자를 태우고 있다");
	}
	void printa() {
		System.out.println("Ambulance a ->" + this.a);
	}
}

// 상속3
class FireEngine extends Car2 {
	int a = 11;
	
	@Override
	void move() { // 만일 이게 없는데 move를 사용하려고 하면 아버지꺼 가져옴
		System.out.println("물 뿌리면서 이동");
	}
}

public class Car2Ex {

	public static void main(String[] args) {
		Car2[] cars = new Car2[3];
		
		//부모객체에 자식 객체 대입 가능
		cars[0] = new Bus();
		cars[1] = new Ambulance();
		cars[2] = new FireEngine();
		
		for(Car2 car : cars) {
			// 메소드 실행은 부모와 같은 이름의 자식 메소드가 실행
			car.move();
			
			// 멤버변수는 부모것만 적용된다
			System.out.println("for Car2 -->" + car.a); // 
			
			// car.special(); move()메소드는 부모에 있지만 special()메소드는 부모에 없기 때문에 실행 불가능
			// 만일 special()메소드를 실행하려면 밑에 처럼 Car2 타입을 Ambulance 타입으로 변환해서
			// 별도의 Ambulance 객체를 생성해야한다.
			
			if (car instanceof Ambulance) { // car가 가지고있는 객체안에 ambulance 타입이 있느냐
				Ambulance amb = (Ambulance) car;
				amb.special();
				amb.printa();  // 여기서는 100이 나오는데 그 이유는  ambulance로 타입변환해서 가능
				System.out.println("amb Car2 -->");
			}
		}
	}
}

40명 태우고 이동
for Car2 -->7
사이렌 울리며 이동
for Car2 -->7
환자를 태우고 있다
Ambulance a ->100
amb Car2 -->
물 뿌리면서 이동
for Car2 -->7

profile
마포구 주민

0개의 댓글