Post

상속

객체 메모리 할당

자바에서 객체를 만들면 JVM은 코드를 통해 필요한 메모리의 공간을 메모리의 힙에 할당하고 4바이트 포인터를 만든다.

상속

상속은 기존 클래스를 재사용하여 새로운 클래스를 작성하기 때문에 객체 간의 관계를 보여준다. 예를 들어, Person, Student, Undergraduate의 관계는 다음과 같다.

$ Undergraduate \ \in \ Student \ \in \ Person $

코드로 나타내면,

1
2
3
4
5
6
7
8
9
public class Person{
    int i;
}
public class Student extends Person{
    int j;
}
public class Undergraduate extends Studnet{
    int z;
}



자손인 Undergraduate 클래스는 조상인 Person,Person의 메소드와 변수를 사용할 수 있고 자손 Studnet 클래스조상 Person의 메소드와 변수를 사용할 수 있다. 하지만, 조상인 Person자식인 Undergraduate, Person의 메소드와 변수를 사용할 수 없고 조상인 Student 클래스는 자손인 Undergraduate의 메소드와 변수를 사용할 수 없다.

자손은 조상의 메소드와 변수를 사용 가능하지만 반대는 불가능하다.

자바에서 상속의 특징은 다음과 같다.

  1. 클래스는 하나의 클래스만 상속이 가능하다.
    하나의 클래스가 여러 개의 클래스를 상속하는 것을 다중상속이라 하는데 이는 자바에서는 불가능하다. 예를 들어, A,B,C의 클래스가있고 관계는 다음과 같다.

$ A \ \notin \ B $
$ C \in \ A$
$ C \in \ B$
$ \text{A has id() and B also has the same name of method, id()} $



C가 id()를 사용할 때 id()가 A의 메소드인지 B의 메소드인지 알 수 없어서 자바는 다중상속을 허용하지 않는다.

  1. 자손은 조상의 모든 맴버를 상속받는다. (생성자, 초기화 블럭 제외)


이는 위에서 설명한 것과 같이 자손만 조상 클래스의 메소드,변수를 사용할 수 있다. 자손의 멤버 변경은 조상에게 영향을 미치지 않지만 조상의 멤버 변경은 자손에게 영향을 끼친다.

  1. 조상의 멤버 공간을 함께 할당한다.
    2번의 특징와 일관된 이야기인데 Undergraduate객체를 정의하면 그 객체에는 4바이트의 포인터가 생성된다. 이 포인터가 가르키는 힙메모리 공간에는 Undergraduate, Student, Person의 메소드와 변수가 저장되어있다. 그래서 자손의 멤버개수는 조상보다 같거나 많다.
1
2
3
4
5
6
7
8
Undergraduate u1 = new Undergraduate();
Student s1 = new Undergraduate();
Person p1 = new Undergraduate();

Student s2 = new Student();
Person p2 = new Student();

Person p3 = new Person();


는 가능하지만

1
2
3
4
5
Undergraduate u2 = new Person();
Undergraduate u3 = new Student();

Student s2 = new Person();
//모두 에러


위 의 경우는 조상은 자손의 메소드와 변수가 힙에 저장되어있지 않기 때문에 접근이 불가능하다.

  1. 공통부분, 즉 조상의 멤버는 조상클래스에서 관리한다.
    조상의 생성자는 자손에게 상속되지 않는다. 이를 위해 생성자 super()을 사용한다. 자식 생성자 첫 번째 줄에 작성해야 한다. 참조변수 super은 조상의 변수와 자손의 변수를 구별할 때 사용한다.

  2. 모든 클래스의 root에는 Object클래스가 있다.
    상속하는 클래스가 없는 경우 컴파일러가 자동적으로 extends Object를 추가한다. 따라서 해당 클래스 생성자 가장 맨 첫번째 줄에도 생성자 super()이 추가된다.

오버라이딩

오버라이딩은 조상 클래스의 메소드를 변경하는 것을 말한다.

1
2
3
4
5
6
7
8
9
10
11
Class Dogs{
    String hi(){
        System.out.println('hi dogs');
    }
}

Class Coco extends Dogs {
    String hi(){
        Sytem.out.println('hi coco');
    }
}
  • 선언부는 변경할 수 없다.
  • 조상의 접근제어자보다 좁은 범위로 변경할 수 없다.
  • 조상의 메소드보다 예외를 많이 선언할 수 없다.
 오버라이딩오버로딩
기존 존재유무조상 클래스에
이미 만들어져있는
메소드
새로운 메소드
 change, modifiynew
1
2
3
4
5
6
7
8
9
10
11
12
class Parent{
    void parentMethod() {}
}

Class Child extends Parent{
    void parentMethod() {} // 오버라이딩
    void parentMethod(int i){} // 오버로딩

    void childMethod() {} // 생성자
    void childMethod(int i){} // 오버 로딩
    void childMethod() {} //중복정의 --> 에러
}
This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.