본문 바로가기

웹 개발/Java

[Web_JAVA] 18

● 상속(inheritance)

1. 기존에 선언된 클래스의 필드를 새롭게 만들 클래스의 필드로 사용하고자 할 때 사용한다.

2. 여러 클래스 선언 시 필드가 겹치는 경우, 부모 클래스를 먼저 선언하고 공통필드를 묶어서 자식 클래스에게 상속해준다.

 

 

 

● 상속 문법

- extends 키워드를 사용한다.

(ex)

class A{

    A 필드

}

class B extends A{

    A, B 필드

}

 

- A : 부모 클래스, 상위 클래스, 슈퍼 클래스, 기반 클래스

- B : 자식 클래스, 하위 클래스, 서브 클래스, 파생 클래스

 

 

 

● super()

- 부모 생성자

- 자식 클래스 타입의 객체로 부모 필드에 접근할 수 있다.

- 하지만 자식 생성자만 호출하기 때문에, 자식 필드만 메모리에 할당된다고 생각할 수 있다.

- 사실 자식 생성자는 항상 부모 생성자를 호출하기 때문에 자식 생성자 호출 시 부모와 자식 필드 모두 메모리에 할당된다.

- 이 때 부모 생성자를 호출하는 방법은 super()를 사용하는 것이다.

- super()를 작성하지 않더라도 컴파일러가 자동으로 작성해준다.

 

 

 

● 다형성(polymorphism)

1. 오버로딩

2. 오버라이딩(재정의)

- 부모 필드에서 선언한 메소드를 자식 필드에서 수정하고자할 때 재정의를 해야 한다.

- 이는 자식에서 부모 필드의 메소드와 동일한 이름으로 선언하는 것이다.

- 부모 필드가 메모리에 먼저 할당되고 a 라는 메소드가 먼저 올라간다고 하면,

   자식 필드가 메모리에 할당되면서 재정의한 a 메소드가 새롭게 만들어지는 것이 아닌

   기존에 할당된 a 메소드 저장공간에 새롭게 재정의한 소스코드의 주소가 들어가게 된다.

- 따라서 자식 객체로 a 메소드에 접근하면 자식 필드에서 재정의한 소스코드의 내용이 읽히게 된다.

 

 

 


 

실습(상속(1))

class A{

	String nameA = "A";
	int data = 10;
	
	public A() {
		System.out.println("부모 생성자 호출");
	}

}

class B extends A{

	String nameB = "B";
	
	public B() {	
		// ※ this : 접근한 객체의 주소값
		// super() : 부모 필드의 주소값, A타입이므로 A클래스(부모 클래스)의 생성자이다.
		// 자식보다 먼저 출력되야하므로 최상단에 적어준다.
		super();  //  부모 생성자, 생략 시 컴파일러가 컴파일할 때 자동으로 작성한다.
		System.out.println("자식 생성자 호출");
	}
	
	void printData() {
		System.out.println(data);
	}

}


public class InheritanceTest {
	public static void main(String[] args) {
		
		B b = new B();
		b.printData();
		System.out.println(b.nameA);
		System.out.println(b.nameB);
		
	}

}

 

결과

 

 

 

 

실습(상속(2))

//부모 클래스
class Human{

	void eat() {
		System.out.println("먹기");
	}
	
	void sleep() {
		System.out.println("자기");
	}
	
	void walk() {
		System.out.println("두 발로 걷기");
	}

}


//자식 클래스
class Monkey extends Human{

	void eatLouse() {
		System.out.println("냠냠");
	}
	
	@Override
	void walk() {
		//덮어 쓰기 전에 부모의 기능을 가져와 사용한다.
		//부모의 기능을 그대로 쓰면서 몇가지를 추가할 때 사용한다.
		//하지만 부모의 기능을 완전 다 갈아 엎을 때는 쓰지 않는다.
		super.walk();
		System.out.println("네 발로 걷기");
	}

}

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

		Monkey kingkong = new Monkey();
		kingkong.walk();

	}

}

 

결과

 

 

 

'웹 개발 > Java' 카테고리의 다른 글

[Web_JAVA] 20  (0) 2022.03.06
[Web_JAVA] 19  (0) 2022.03.05
[Web_JAVA] 17  (0) 2022.03.03
[Web_JAVA] 16  (0) 2022.03.02
[Web_JAVA] 15  (0) 2022.03.01