package day16;
class A{
int data=10;
public A() {
System.out.println("부모 클래스 생성자");
}
void show() {
System.out.println("A 클래스");
}
}
class B extends A{
void check() {
show(); //부모 클래스 상속해서 사용하기
}
}
public class InhTest {
public static void main(String[] args) {
B instance =new B(); //B 타입의 객체 만들기
instance.check();
}
}
부모 클래스 생성자
A 클래스
show();만 호출 했는데 "부모 클래스 생성자" 가 출력 되는 이유?
B instance =new B();
자식 생성자를 사용하는 부분 (기본 생성자가 안보일 뿐, 부모 생성자를 호출하는 super()가 자동으로 있다!)
부모 클래스 먼저 호출 한 후, 자식 클래스가 나온다
package day16;
class A{
int data=10;
public A() {
System.out.println("부모 클래스 생성자");
}
void show() {
System.out.println("A 클래스");
}
}
class B extends A{
//부모 클래스의 메서드명과 똑같이 사용하고 싶을 때 오버라이드 (재정의)
@Override
void show() {
System.out.println("B 클래스");
}
void check() {
show(); //부모 클래스 상속해서 사용하기
}
}
public class InhTest {
public static void main(String[] args) {
B instance =new B(); //B 타입의 객체 만들기
instance.check();
}
}
부모 클래스 생성자
B 클래스
package day16;
public class Car {
final int wheel=4; //자동차 바퀴 수는 고정! 외부에서 변경하지 못하도록 상수 선언 final
public String brand;
protected String color;
private int price;
public Car() {
System.out.println("부모 클래스의 기본 생성자");
}
public Car(String brand, String color, int price) {//초기화
this.brand = brand;
this.color = color;
this.price = price;
}
void engineStart() {
System.out.println("열쇠로 시동 킴");
}
void engineStop() {
System.out.println("열쇠로 시동 끔");
}
//price에 접근할 수 있도록 하기 위해 getter / setter (경고는 하되, 접근은 할 수 있게!) art+shift+s>r
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
package day16;
public class SuperCar extends Car {
String mode; //슈퍼카에만 존재하는 기능
public SuperCar() {
System.out.println("자식 클래스의 기본 생성자");
}
public SuperCar(String brand, String color, int price, String mode) {
super(brand,color,price); //부모클래스 super 이름 뒤의 소괄호는 부모클래스의 생성자, 부모클래스Car를 불러옴
//setPrice(price); //price는 초기화 할 때 생성자를 통해서 해도 되지만, setPrice를 통해서 해도 된다 (getter/setter)
this.mode = mode; //mode는 슈퍼카에서만 추가된 메서드이므로 따로 초기화 해야 한다
}
@Override
void engineStart() {
System.out.println("음성으로 시동 킴");
}
@Override
void engineStop() {
System.out.println("음성으로 시동 끔");
}
}
package day16;
public class CarTest {
public static void main(String[] args) {
//SuperCar superCar = new SuperCar();
SuperCar ferrari = new SuperCar("ferrari", "Red", 45000, "sport");
ferrari.engineStart();
ferrari.engineStop();
}
}
//부모 클래스의 기본 생성자
//자식 클래스의 기본 생성자
음성으로 시동 킴
음성으로 시동 끔
기본 생성자를 호출 했을 때만, 부모생성자를 한번 찍고 온다
하지만 오버라이딩을 사용하여 매개변수가 하나라도 있다면 기본생성자가 호출 안된다
계층 관계도
클래스를 클릭하고 ctrl + T 를 누르면 클래스가 어떤것을 상속하고, 상속 받고 있는지 알 수 있다
모든 클래스는 Object라는 클래스를 자동으로 상속 받는다
객체명을 뽑을때 다른 메서드를 생성하지 않고, 원하는 메세지를 출력할 수 있다
@Override
public String toString() { //toString 재정의
return "브랜드 : " + brand + "\n색상 : " + color + "\n가격" + getPrice() + "만원"; //toString의 리턴타입이 String이기 때문에 부모클래스에 있는 리턴타입과 매개변수는 건들 수 없다
}
//price 는 프라이빗이라서 getPrice() 이렇게 사용해준다
package day16;
public class CarTest {
public static void main(String[] args) {
//SuperCar superCar = new SuperCar();
SuperCar ferrari = new SuperCar("ferrari", "Red", 45000, "sport");
System.out.println(ferrari);
}
}
브랜드 : ferrari
색상 : Red
가격45000만원
다형성(polymorphism)
다형성이란 하나의 메소드가 서로 다른 클래스에서 다양하게 실행 되는 것을 말한다
다형성을 구현하기 위해서는 다형성을 구현할 메소드를 포함한 클래스에게 부모 클래스가 상속해 줘야 한다
부모 클래스와 자식 클래스에 같은 이름의 메소드가 있어야 하고,
자식 클래스에서는 재정의(Overrideing) 해야한다
따라서 다형성의 종류에는 Overloading, Overriding이 있다
메서드가 다양한 형태의 성질을 띄고 있다
이름은 똑같지만 기능들이 다양한 형태로 바뀐다!
'Dev. > java' 카테고리의 다른 글
Java 클래스 배열 (0) | 2022.06.11 |
---|---|
Java 상속 (0) | 2022.06.11 |
지역변수/전역변수/static변수 (0) | 2022.06.06 |
Java 항공 관리 프로그램 (0) | 2022.05.26 |
Java :: 접근 권한 제어자 (0) | 2022.05.23 |
댓글