본문 바로가기
Coding/JAVA

[명품자바] 05 상속 개념/ 예제

by 찡콩찡 2022. 4. 19.
상속의 개념

  →  상속은 부모 클래스에 만들어진 필드와 메소드를 자식 클래스가 물려받는 것

  → 상속 선언만 하면 자식 클래스는 부모 클래스에 만들어진 필드와 메소드를 만들지 않고도 만든 것과 같은 효과를 얻는다.

 

상속의 필요성

  → 코드중복을 제거하여 클래스를 간결하게 구현할 수 있음

  → 소프트웨어의 생산성 향상: 클래스 재사용과 확장 용이

5.2 클래스 상속과 개체

  ▶ 자바의 상속 선언

       → 부모클래스 = 슈퍼클래스 

       → 자식클래스 = 서브클래스

  ▶ 상속과 개체

     

  • 상속선언
class ColorPoint extends Point {
      .....
}

: Point를 상속받는  ColorPoint 클래스

서브 클래스 객체 생성 : 서브클래스 객체 모양을 잘 볼것!

Point p = new Point ( );
ColorPoint cp = new ColorPoint( );  // 서브 클래스 객체 생성

 

 : 객체 p는 Point 클래스 멤버만 가지고 cp는 point 클래스와 colorpoint 클래스 멤버 모두를 가진다.

  상속은 바로 cp 객체 처럼 슈퍼 클래스의 멤버와 서브 클래스의 멤버를 모두 갖고 있는 것

 

 

  • 서브 클래스 객체 활용
  • 서브 클래스에서 슈퍼 클래스 멤버 접근 : 서브 클래스는 슈퍼 클래스의 private 멤버를 제외하고 모든멤버를 접근할 수 있다.

 << check time>>

1. 자바에서 상속을 선언하는 키워드는?
  extends
2. 슈퍼클래스를 가지지 않은 유일한 자바 클래스는?
 java.lang.object
3. 서브클래스에서 슈퍼 클래스에 pricate으로 선언된 멤버를 접근가능?
 nope!!!
5.3 상속과 protected 접근 지정자
자바의 접근 지정자 4 가지
   public, protected, 디폴, private 
-> 상속 관계에서 주의할 접근 지정자는 private protected

○ 슈퍼 클래스의 private 멤버
   슈퍼 클래스의 private 멤버는 다른 모든 클래스에 접근 불허
   클래스내의 멤버들에게만 접근 허용

 슈퍼 클래스의 디폴트 멤버
  슈퍼 클래스의 디폴트 멤버는 패키지내 모든 클래스에 접근 허용

슈퍼 클래스의 public 멤버
  슈퍼 클래스의 public 멤버는 다른 모든 클래스에 접근 허용

 슈퍼 클래스의 protected 멤버
  같은 패키지 내의 모든 클래스 접근 허용
  다른 패키지에 있어도 서브 클래스는 슈퍼 클래스의 protected 멤버 접근 가능

예제 5-2  

클래스 person을 아래와 같은 필드를 갖도록 선언하고 , 클래스 Student는 Person을 상속받아 각 멤버별 필드에 값을 저장하라 

  • private int weight;
  • int age;
  • protected int height;
  • public String name;
package chapter05;

import java.security.PublicKey;

class person{
	private int weight;  //private 접근지정. Student
	public int getWeight() {return this. weight;}  
	public void setWeight(int weight) {	this.weight = weight;}
	int age; //default 접근 지정. student 클래스 접근 가능
	protected int height; //protected 접근 지정 student 클래스에서 접근 가능
	public String name;
}

class Student extends person{ //student가 서브클래스 person이 부모 클래스
	public void set() {
		
		super.age =30;
		super.name ="홍길동";
		super.height=75;
		super.setWeight(99);
		
		}
	//todo- set 통해 세팅된 값을 출력하는 메소드 추가 1. source -> generate toStirng 클릭
 
	@Override
	public String toString() {
		return "Student [age=" + age + ", height=" + height + ", name=" + name + ", getWeight()=" + getWeight() + "]";
	}
	//나만의 타입을 만들어줘도 된다
//	public void print(age + "" + height + "" + getWeight());
	
	
}


public class InheritanceEx {

	public static void main(String[] args) {
          //main안에 객체를 만들어야 함 출력도 하려면
		Student s = new Student(); //생성자는 공간을 만들어, 공간 생성 후 s가 위치값을 가리키게 함, 생성자 student
		s.set();
		System.out.println(s.toString());
		
	}

}
//​


결과 값

<< chect time >>
1. 서브 클래스와 슈퍼 클래스가 같은 패키지 않에 있을 때, 슈퍼 클래스의 멤버가 어떤 접근 지정자로 선언된 경우 서브클래스에서 접근할 수 없는가?
 private
2. 서브 클래스와 슈퍼 클래스가 다른 패키지에 있을 때 슈퍼 클래스의 멤버가 어떤 접근 지정자로 선언된 경우 서브 클래스에서 접근할 수 있는가?
 protected / public
5.4 상속과 생성자 ★ 그림 자주 보며 숙지

▶ super()를 이용하여 명시적으로 슈퍼클래스 생성자 선택

 : 서브 클래스의 생성자에서 슈퍼 클래스의 생성자를 명시적으로 선택하는 것이 원칙

 : super( )슈퍼 클래스 생성자호출하는 코드

1)  main에서 B(int x)생성자 호출

    b= new B (5);

2)  B(int x)의 생성자는 첫코드로 다음 코드 실행

    super(x);  //x값은 5 , 상속받는 애가 있으니 부모님 찾아가자 라는 의미

3) super(X)는 슈퍼클래스 A의 다음 생성자 호출 x에 5를 전달

4) A(int x) { ... }  // x에 5를 전달받음

★ super( ) 는 반드시 생성자의 첫 라인에 사용되어야 한다는 것

예제 5-3 : super()를 이용하여 ColorPoint 클래스의 생성자에서 슈퍼 클래스 point의 생성자를 호출하는 예

결과 값