romworld

Chapter 07 상속 본문

JAVA/개념정리

Chapter 07 상속

inderrom 2022. 10. 4. 11:03

상속

- 자식 클래스가 부모 클래스가 가지고 있는 요소들에 접근 할 수 있도록 하고 요소들을 가질 수 있는 것을 상속이라 한다.

- 상속 방법 : extends

- 기존의 클래스를 물려받아 새로운 클래스를 만드는 것

- 자식클래스명 extends 부모클래스명{} 

- 부모 클래스의 생성자와 초기화블럭을제외한 모든 멤버를 물려받는다.

- 하나의 클래스만 상속받을 수 있다.

- 상속받지 않는 모든 클래스는 object클래스를 상속받는다(extends Object) //컴파일러가 알아서 추가해준당

- 자식 클래스는 부모 클래스의 멤버 외의 새로운 멤버(전역변수 등)를 가질 수 있으므로

    자식 클래스는 부모 클래스보다 크거나 같다.

- 두 개 이상의 클래스를 만드는데 공통된 멤버가 있는 경우 부모클래스로 만든다

- 부모 클래스로부터 상속 받을수 있는 요소는 변수와 메서드다.

 

String var;
	int score;
	String name;
	{	/*
	 	 *초기화 블럭
	 	 *- 생성자보다 먼저 실행되는 블럭
	 	 *- 다양한 생성자를 이용하여 클래스를 만들때, 공통된 멤버를 초기화하기 위해 사용함
	 	 */
		var = "초기화블럭은 물려주지 않는다.";
		this.score =0;
		
	}
      //이게 초기화블럭
	public SampleParent() {	
		var = "생성자도  물려주지 않는다.";
		System.out.println("부모클래스 생성!");
	}
	//이게 생성자
	public SampleParent(String name) {
		this.name = name;
		
	}

 

생성자

 

- 생성자는 상속받을 수 없다.

- 부모 클래스에서 생성자가 명시적으로 선언되어 있는 경우 자식 클래스에서 필수적으로 부모의 생성자를 호출해야한다.

- super()를 이용해서 호출한다!

 

public class ParentDog {
    String name;

    ParentDog(String name) {
        this.name = name;
    }
}
public class ChildDog extends ParentDog {
    ChildDog(String name) {
        super(name); // 부모 ParentDog 클래스의 생성자 호출
    }
}

- super() 메서드는 자식 생성자 내부에서만 호출 가능, 메서드에서는 호출 불가능

- 매개변수가 없는 생성자는 기본 생성자다! 명령어의 존재여부와 상관 없음

 

super()메서드를 명시적으로 호출하지 않아도 되는 경우는

1. 부모클래스의 생성자가 명시적으로 선언되어 있지 않은 경우

2. 부모 클래스의 생성자가 명시적으로 선언되어 있어도 기본 생성자만 명시되어 있는 경우

public class ParentDog {
    String name;

    ParentDog() {
        this.name = "이쁜 강아지"
    }

}
public class ChildDog extends ParentDog {
    ChildDog(String name) {
        // super(); 생략 가능
   }

    ChildDog(String name1, String name2) {
       // super(); 생략 가능
   }
}

supre는 슈퍼 클래스의 인스턴스에 접근할 수 있도록 하는 포인터를 뜻한다.

즉 super라는 포인터를 통하여 슈퍼 클래스의 생성자를 호출할 수 있도록 한다.

 

다형성

(is-a 관계라고 볼 수 있다)

*웰시코기는 개이다. 개는 웰시코기다

public class Dog {
    protected String color;

    public void bite() {
        System.out.println("깨물다");
    }

    public void bark() {
        System.out.println("짖는다");
    }
}

public class Bulldog extends Dog {

}

public class Retriever extends Dog {
    public void swim() {
        System.out.println("수영하다");
    }
}
Bulldog bulldog = new Bulldog();
Dog dog = new BullDog();

// 또는

Retriever retriever = new Retriever();
Dog dog = new Retriever();

Bulldog 클래스는 Dog클래스를 상속받고있고, Retriever클래스도 Dog클래스를 상속받고 있다. 이런 상속 구조가 있을 때 다형성을 이용할 수 있다. 

 

객체의 형 변환

 

인스턴스를 생성할 때 자료형을 따라가는 것이 아니라 new 키워드를 이용해 생성한 인스턴스가 메모리에 적재된다.

객체의 형 변환은 ' 형변환하는 자료형으로 사용하겠다'라는 의미만 존재한다

인스턴스 자체가 변환되는 것이 아니라 참조 자료형은 단순히 참조값만 저장한다.

 

Dog dog = new Retriever();
Retriever retriever = (Retriever)dog;
retriever.swim();

Dog dog = new Bulldog();
Bulldog bulldog = (Bulldog)dog;

Dog dog = new Dog();
Retirever retriever = (Retriever)dog; // 에러 발생, 개는 리트리버가 될 수 없다.

 

 

instanceof연산자

[변수or인스턴스 instanceof 클래스이름]

해당 인스턴스가 특정 인스턴스가 맞는지 확인할 수 있는 연산자이며

맞으면 true 틀리면 false를 반환한다.

 

Dog dog = new Retriever();

System.out.println(dog instanceof Retriever); // true
System.out.println(dog instanceof Dog); // true
System.out.println(dog instanceof Bulldog); // false

 

'JAVA > 개념정리' 카테고리의 다른 글

예외처리  (0) 2022.10.10
추상 클래스와 인터페이스  (0) 2022.10.09
Chapter 06 객체지향 프로그래밍 (2)  (0) 2022.09.30
Chapter 06. 객체지향 프로그래밍(1)  (1) 2022.09.23
Chapter 05-4. 다차원 배열, for each  (0) 2022.09.19
Comments