티스토리 뷰

Chapter 7. 상속과 다형성

 

▶ 학습 목표

: 상속이 무엇인지 어떠한 경우에 사용하는지 그리고 어떠한 형식으로 사용하는지 알 수 있다.

 

 

 

 

7-1. 상속

: 새로운 클래스를 만들때 기존에 존재하는 클래스를 물려받아 이용한다.

클래스가 가진 멤버인 변수, 함수를 물려받아 사용할 수 있어 확장할 수 있다. (=코드의 양이 줄어든다)

 

상속받는 클래스는 자식 클래스 상속해주는 클래스는 부모 클래스라고 한다.

 

 

 

 

- 상속 선언

class Parents{}
calss Child extends Parents{}
//Parents 클래스의 멤버들을 Child 클래스가 상속 받음
//상속 받는것이 지칭한다.

 

상속은 코드를 재사용하고 코드의 중복을 줄이기 위해 사용한다.

(생성자는 상속되지 않는다.)

(상속이 클래스를 재사용하는 것이고, 함수도 재사용할 수 있음(상속에 비해 작은 단위))

단일 상속만을 허용한다.

 

 

 

package Chapter7;
class person  //person 클래스
{
	void breath() 
	{
		System.out.println("숨쉬기");
	}
	void eat() 
	{
		System.out.println("밥먹기");
	}
	void say() {
		System.out.println("말하기");
	}
}
class student extends person  //student 클래스 person 클래스를 상속 받음
{
	void learn() 
	{
		System.out.println("배우기");
	}
}
class teacher extends person  //person 클래스를 상속 받음 
{ 
	void teach() 
	{
		System.out.println("가르치기");
	}
}

public class Inheritance1 
{

	public static void main(String[] args) 
	{
		student s1 = new student();  //student 객체 생성
		s1.breath();  
		//student의 breath 실행 -> student 클래스 안에 없음 -> 상속 받은 클래스 안에 breath 함수 존재 -> 실행
		s1.learn();
		//student의 learn 함수 실행
		
		teacher t1 = new teacher();  //teacher 객체 생성
		t1.eat();
		//teacher의 eat함수 실행 -> 없음 -> 부모클래스에 eat함수 존재하는지 확인하고 실행 
		t1.teach();
		//teacher의 teach 함수 실행

	}

}

 

숨쉬기
배우기
밥먹기
가르치기

 

 

student 클래스 안에는 함수가 1개 존재한다.

하지만 student 클래스는 person클래스를 상속 받으므로 실질적으로 사용하는 함수는 4개가 된다.

(상속을 받으면 해당 클래스에 있는 변수 함수를 사용할 수 있다)

teacher 클래스 또한 안에 함수가 1개 존재하지만 person 함수를 상속 받으므로 실질적 사용함수는 4개가 된다.

 

 

 

 

 

 

 

- 상속이 불가능한 경우

 

자바에서 상속이 가능하지 않은 경우가 있다.

클래스 앞에 final이 붙은 경우 상속이 불가능하다.

 

(변수 앞에 final이 붙은 경우 값 변경 불가능)

(함수 앞에 final이 붙은 경우 오버라이딩 불가능)

(final은 상수의 선언으로 고정된 값을 의미)

 

 

 

 

 

 

7-2. 오버라이딩

: 자식 클래스가 부모 클래스로 부터 물려받은 메서드를 재정의하는 것

 

* 인스턴스 메서드만 사용가능

class parents
{
	void method1()
    {
    	//부모 클래스의 메서드
    }
}
class child extends parents{
	void method1()
    {
		//자식 클래스에서 메서드 내용 재정의
	}
}

 

 

부모 클래스의 함수와 자식 클래스의 함수가 void method1() 으로 일치하는 것을 볼 수 있다.

이러한 경우 자식 클래스에서 함수를 재정의한다. (덮어쓴다 자식 클래스의 함수를 실행)

 

 

package Chapter7;

class student2  //student 클래스
{
	void learn() 
	{
		System.out.println("배우기");
	}
	void eat() 
	{
		System.out.println("밥먹기");
	}
	void say() 
	{
		System.out.println("선생님 안녕하세요!");
	}
}
class leader extends student2  //leader 클래스는 student 클래스를 상속 받는다
{
	void lead() 
	{
		
	}
	void say() 
	{
		System.out.println("선생님께 인사"); //오버라이딩(함수재정의)
	}
}

public class Inheritance2 
{

	public static void main(String[] args) 
	{
		leader leader1 = new leader(); //leader 클래스를 객체 생성
		leader1.eat(); 
		//leader1 안의 eat()실행 leader 함수 안에 eat이 없다 생각할 수 있지만 상속 받기 때문에 
		//student의 변수 함수를 사용할 수 있다. student 안의 eat() 함수 실행한다.
		leader1.say(); 
		//leader은 student를 상속 받음 두개의 클래스에 같은 이름과 형태의 함수가 존재 -> 오버라이딩
		//오버라이딩되어 자식함수가 함수를 재정의함. leader 안의 say 함수 실행

	}

}

 

밥먹기
선생님께 인사

 

 

 

 

- super.()

: 부모 클래스의 생성자를 명시적 호출한다.

super.함수명(); 의 경우 부모 클래스의 함수명() 이라는 함수를 호출하여 실행한다.

 

* 인스턴스에서만 사용한다 (static 사용 x)

 

 

 

package Chapter7;

class student  //student 클래스
{
	void learn() 
	{
		System.out.println("배우기");
	}
	void eat() 
	{
		System.out.println("밥먹기");
	}
	void say() 
	{
		System.out.println("선생님 안녕하세요!");
	}
}
class leader extends student  //leader 클래스는 student 클래스를 상속 받는다
{
	void lead() 
	{
		
	}
	void say() 
	{
		System.out.println("선생님께 인사"); //오버라이딩(함수재정의)
		super.say();  //부모 클래스 안의 say()함수 실행한다.
	}
}

public class Inheritance2 
{

	public static void main(String[] args) 
	{
		leader leader1 = new leader(); //leader 클래스를 객체 생성
		leader1.say(); 
		//leader은 student를 상속 받음 두개의 클래스에 같은 이름과 형태의 함수가 존재 -> 오버라이딩
		//오버라이딩되어 자식함수가 함수를 재정의함. leader 안의 say 함수 실행
		//-> 실행 후 다음 코드에서 super.say() 명령어를 만남 
		//-> 부모 클래스의 say()함수를 명시적 호출해주어 실행한다.

	}

}

 

 

선생님께 인사
선생님 안녕하세요!

 

 

leader1.say()를 실행하여 leader 클래스 안의 say()함수를 호출한다.

leader 클래스는 student 클래스를 상속 받는데

student 클래스의 say()함수와 leader 클래스의 say() 함수는 형태와 함수명이 일치하다.

그렇기 때문에 오버라이딩이 되어 자식 클래스가 say() 함수를 재정의한다.

→ leader 클래스의 say() 함수 실행한다.

System.out.println을 실행하고 다음 코드에서 super.say(); 라는 명령어를 볼 수 있다.

여기서 super.() 은 부모클래스를 명시적 호출하는 것이므로 부모 클래스인 student 클래스 안의 say() 함수를 실행한다.

 

 

 

그러므로, 밑의 문자열들이 출력된다.

 

선생님께 인사

선생님 안녕하세요!

 

                          

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday