JAVA

[자바] 상속

yujin0517 2021. 7. 9. 23:53

상속이란? 

-> 자식 클래스가 부모 클래스의 필드와 메소드를 물려받는 것. (자식 클래스가 부모 클래스를 선택하여 물려받음.) 

* '자식 클래스 extends 부모 클래스' 형식으로 extends 키워드를 사용함. 

* 상속을 사용하는 이유 : 서로 다른 클래스가 중복되는 타입(카테고리)의 필드를 가지고 있을 경우 상속을 사용하면 훨씬 간결해진 클래스 구조를 만들 수 있음.

* 상속의 효과

  • 부모 클래스를 재사용하여 자식 클래스를 빠르게 개발 가능
  • 유지 보수 편리
  • 코드 중복 줄임. 

* 상속 대상 제한 

  • private, 디폴트 접근 지정자 사용시 상속이 제한됨
  • final 클래스는 아무한테도 상속 안 함
  • 단일 상속 (자식 클래스 입장에서는 하나의 부모 클래스에서만 상속받을 수 있음.) 

 

Ex)

'학생', '선생님', '친구'라는 필드는 사람이라는 공통된 타입으로 묶을 수 있기 때문에 서로 다른 클래스에서 중복되어 사용된 경우 상속을 사용하여 간결한 클래스 구조를 가질 수 있다.  

- 학생 클래스

public class Student {
    String name;
    int age;
    int studentNumber;
    int grade;
    
    public static void main(String[] args) {
    	student.name = "A";
        student.age = 15;
        student.studentNumber = 1234;
        student.grade = 2;
    }
}

 

- 선생님 클래스 

public class Teacher {
    String name;
    int age;
    String subject;
    
    public static void main(String[] args) {
    	Teacher teacher = new Teacher();
        teacher.name = "B";
        teacher.age = 30;
        teacher.subject = "Math";
    }
}

 

위의 두 클래스를 보면 name, age 필드가 공통으로 들어가 있고, 학생과 선생님은 사람(공통된 타입)이라는 타입으로 묶을 수 있기 때문에 사람 클래스를 선언하여 상속받을 수 있음.

- 사람 클래스

public class Person {
    String name;
    int age;
    
    ...
}

 

- 상속 받기 

//Person 클래스를 상속받은 Student 클래스
public class Student extends Person{

    int studentNumber;
    int grade;
    
    public static void main(String[] args) {
    	Student student = new Student();
        student.name = "A";
        student.age = 15;
        student.studentNumber = 1234;
        student.grade = 2;
    }
}

//Person 클래스를 상속받은 Teacher 클래스
public class Teacher extends Person {
 
    String subject;
    
    public static void main(String[] args) {
    	Teacher teacher = new Teacher();
        teacher.name = "B";
        teacher.age = 30;
        teacher.subject = "Math";
    }
}

 

* 같은 타입으로 묶을 수 없을 경우 포함 관계로 연결.

Ex) 자동차와 엔진의 경우, 학생과 선생님처럼 상속 관계가 아닌 포함 관계로 연결되기 때문에 자동차 클래스를 선언하여 엔진을 멤버 변수로 받는 것이 바람직함. 

 

접근 지정자로 인해 상속이 제한 되는 경우

- 같은 패키지

public class A {
    private int aa;
    int bb;
    protected int cc;
    public int dd;
}
public class B extends A {
	public void set() {
    	//aa = 1;  private 접근 지정자를 사용하기 때문에 다른 클래스 상속 불가능
        bb = 2;
        cc = 3;
        dd = 4;
    }
}

 

- 다른 패키지

public class A {
    private int aa;
    int bb;
    protected int cc;
    public int dd;
}
public class B extends A {
	public void set() {
    	//aa = 1;  private 접근 지정자를 사용하기 때문에 다른 클래스 상속 불가능
        //bb = 2;  디폴트 접근 지정자를 사용하기 때문에 다른 패키지에 있는 클래스에 상속 불가능
        cc = 3;
        dd = 4;
    }
}

* protected 접근 지정자는 같은 패키지와 다른 패키지의 자식 클래스에 접근이 가능함. 

 

부모/ 자식 클래스 호출 및 실행

new에 의해 자식 클래스 객체가 생성될 때, 부모 클래스와 자식 클래스의 생성자 모두 실행됨. 

- 호출 순서 : 자식 클래스의 생성자가 먼저 호출되고, 실행 전에 부모 클래스의 생성자가 호출됨.

- 실행 순서 : 부모 클래스의 생성자가 먼저 실행된 후 자식 클래스의 생성자가 실행됨. 

 

- 생성자 호출, 실행 순서

public class A {
	public A() {
    	System.out.println("생성자A");
    }
}
public class B extends A {
	public B() {
    	System.out.println("생성자B");
    }
}
public class C extends B {
	public C() {
    	System.out.println("생성자C");
    }
}
public class MainTest {
	public static void main(String[] args) {
    	C c = new C();  // C 생성자 호출
    }
}

MainTest 클래스 실행

  1.  C 생성자 호출(B자식)
  2.  B 생성자 호출(A자식, C부모)
  3.  A 생성자 호출(B부모)
  4.  A 생성자 실행(B부모)
  5.  B 생성자 실행(A자식, C부모)
  6.  C 생성자 실행(B자식)

콘솔창

 

- super()를 이용하여 실행

public class A {
    
    	public A() {
    		System.out.println("A");
    	}
    	public A(int x) {
    		System.out.println("매개변수 A" + x);
    	}
        
}
public class B extends A{

	public B() {
		System.out.println("B");
	}
	public B(int x) {
		super(x);  //항상 첫 줄에 와야함. super를 사용하여 부모 생성자를 먼저 실행
		System.out.println("매개변수 B" + x);
	}

}
public class MainTest {
	public static void main(String[] args) {
		B b = new B(5); //x에 5를 대입하여 객체 생성
	}
}

MainTest 클래스 실행

  1.  B 클래스에 접근하기 위해 객체를 생성하면서, 동시에 x에 5라는 값이 들어옴.
  2. x에 5가 대입되면서 B 클래스에 매개변수가 있는 생성자가 호출됨.
  3. super(x) (부모 생성자)가 먼저 실행되고, 그다음 자식 생성자가 실행됨. 

콘솔창

 

 

2021.07.09

'JAVA' 카테고리의 다른 글

예외 처리  (0) 2021.07.13
[자바] 공격 프로그램 구현해보기  (0) 2021.07.11
[자바] 업캐스팅, 다운캐스팅 / instanceof 연산자  (0) 2021.07.08
this 레퍼런스  (0) 2021.07.08
static멤버 , non - static 멤버  (0) 2021.07.07