본문 바로가기

Java

[Java] 22

super

- 부모클래스를 의미한다.

부모클래스에 있는 메소드 호출하는 방법

- super.메소드()

부모클래스의 생성자를 호출하는 방법

- super();

- 항상 부모생성자가 가장 먼저 호출되어야 한다.

instanceof( : 연산자)

- 해당 타입의 인스턴스인지 판별해준다.

(ex) myCar instanceof Car : myCar는 Car 타입의 instance인가?

맞으면 true, 틀리면 false

Object 클래스

- 최상위 클래스

- 자바의 모든 클래스는 Object 클래스를 상속받는다.

형변환(casting)

1. up casting

- 부모타입에 자식 값을 넣는 문법(자식타입 부모타입)

2. down casting

- 자식타입에 부모 값을 넣는 문법(부모타입 자식타입)

casting의 목적

- 여러 타입을 하나로 묶어 관리할 수 있다.

 

 


 

 

실습(부모 클래스의 메소드 및 생성자 호출)

1. 부모 클래스(Car.java) 생성

public class Car {
	String name;
	int price;
	String color;
	
	public Car(String name, int price, String color) {
		this.name = name;
		this.price = price;
		this.color = color;
	}
	
	public void go() {
		System.out.println("앞으로 갑니다");
	}
	
	public void engineOn() {
		System.out.println("열쇠로 시동을 켰습니다");
	}
	
	public void show() {
		System.out.println("-----자동차 정보-----");
		System.out.println("차주 : " + this.name);
		System.out.println("색깔 : " + this.color);
		System.out.println("가격 : " + this.price);
	}
	
}

 

2. 자식 클래스(SuperCar.java) 생성

public class SuperCar extends Car{
	String mode;
	
	public SuperCar(String name, int price, String color, String mode) {
		// 항상 부모생성자가 제일 먼저 호출되어야 한다.(super와 this 순서르 바꿀 수 없다.)
		super(name, price, color);  // super() : 부모생성자를 의미한다.
		this.mode = mode;
	}
	
	@Override
	public void show() {
		// super.메소드()로 부모클래스의 메소드를 사용할 수 있다.
		super.show();  // super : 부모클래스를 의미한다.
		
		System.out.println("모드 : " + this.mode);
	}
	
	@Override
	public void engineOn() {
		System.out.println("버튼으로 시동을 켰습니다.");
	}
	
	public void openRoof() {
		System.out.println("지붕을 열었습니다.");
	}
	
}

 

3. Main.java 에서 실행

public class Main {
	public static void main(String[] args) {

		Car momCar = new Car("엄마", 100, " blue");
		SuperCar myCar = new SuperCar("홍길동", 1000, "red", "sports");
		
//		myCar.mode = "normal";  // 	자식에서 새롭게 정의된 변수는 부모타입에서 사용 불가능	
		
		momCar.show();
		momCar.go();
		momCar.engineOn();
//		momCar.openRoof();  // 자식에서 새롭게 정의된 메소드는 부모타입에서 사용 불가능

		myCar.show();
		myCar.go();
		myCar.engineOn();
		myCar.openRoof();

	}
}

 

결과

 

실습(instanceof)

public class Main {
	public static void main(String[] args) {

		Car momCar = new Car("엄마", 100, " blue");
		SuperCar myCar = new SuperCar("홍길동", 1000, "red", "sports");

		System.out.println(momCar instanceof Object);  //true
		System.out.println(momCar instanceof Car);  //true
		System.out.println(momCar instanceof SuperCar);  //false

		System.out.println(myCar instanceof Object);  //true
		System.out.println(myCar instanceof Car);  //true
		System.out.println(myCar instanceof SuperCar);  //true

	}
}

 

결과

 

실습(casting)

1. up casting

public class Main {
	public static void main(String[] args) {

		Car momCar = new Car("엄마", 100, " blue");
		SuperCar myCar = new SuperCar("홍길동", 1000, "red", "sports");

		Car c = (Car)myCar;  // (Car)는 생략 가능하다.

		c.go();  // 부모에도 원래 있던 메소드는 사용이 가능하다.

//		c.openRoof();  // 자식에서 새롭게 만든 메소드는 up casting 후 사용이 불가능하다.

//		c.mode = "normal";  // 자식에서 새롭게 추가된 인스턴스 변수는 사용이 불가능하다.

		c.engineOn();  // 자식에서 오버라이딩 된 메소드는 재정의가 된 상태 그대로 사용된다.

		System.out.println(c instanceof SuperCar);

	}
}

 

결과

 

 

​​

2. down casting

public class Main {
	public static void main(String[] args) {

		Car momCar = new Car("엄마", 100, " blue");
		SuperCar myCar = new SuperCar("홍길동", 1000, "red", "sports");

		Car c = (Car)myCar;

		// 애초에 부모를 자식에 넣는 것은 말이 되지 않는다(타입도 일치하지 않고 부족하기 때문)
//		SuperCar s = momCar;

		SuperCar s = (SuperCar)c;  // (Super)는 생략할 수 없다.

		
	}
}

3. object 타입의 배열 생성

public class Main {
	public static void main(String[] args) {

		String test = "test";

        // 자동 up casting(Object에 있는 메소드만 사용할 수 있다.)
		Object[] ar = {myCar, momCar, test};  

	}
}

 

 

'Java' 카테고리의 다른 글

[Java] 24  (0) 2022.01.24
[Java] 23  (0) 2022.01.23
[Java] 21  (0) 2022.01.21
[Java] 20  (0) 2022.01.18
[Java] 19  (0) 2022.01.17