자료구조(java) 2_1. 객체지향 프로그래밍
1.3 객체지향 프로그래밍
객체의 메모리 할당 방법
int i = 10;
java에서 int는 4byte를 차지한다.
short : 2byte
int : 4byte
long : 8byte
new를 사용하여 객체(인스턴스) student를 만들면,
JVM은 코드를 읽고 메모리가 얼마나 필요한지 계산하고 그만큼의 공간을 힙(Heap)*에 할당한다.
그리고 힙에 있는 그 공간을 가리키는 4Byte 포인터를 하나 만든다.
Student s = new Student();
힙(Heap)*
- 최소값 및 최대값을 최대한 빠르게 찾아내기 위한 자료구조.
참조형(Reference Type)의 데이터 타입을 갖는 객체(인스턴스), 배열 등은 Heap 영역에 데이터가 저장된다.
👉실제 데이터를 갖고 있는 Heap 영역의 참조 값을 Stack 영역의 객체가 갖고있다.
상속
상속은 여러 객체들의 객체 간의 관계를 나타낸다.
<Undergraduate ⊂ Student ⊂ Person>
public class Person{
}
public class Student extends Person{
}
public class Undergraduate extends Student{
}
extends를 통해 부모 클래스의 변수와 메소드를 모두 가져온다.
특징 1. Java에서 각각의 클래스는 하나의 클래스만 상속받을 수 있다.(다중 상속 불가)
두개의 클래스에서 상속 받은 변수 중, 이름이 중복되는 변수가 있다면, 둘 중 어느것을 의미하는 것인지 알 방법이 없다. 이러한 문제를 방지하기 위해 다중상속을 허용하지 않는다.
특징 2. 상속받는 클래스의 정보만 갖고있다.
이러한 계층 구조에서 Student는 다른 Faculty나 Admin에 대한 정보를 가지고 있지 않는다.
즉, 트리를 올라갈 수만 있다.
특징 3. 상속받는 클래스의 공간을 함께 할당한다.
Undergradute u = new Undergraduate();
상속을 받은 상태로, 새로운 객체 Undergraduate u 를 정의하면, u에는 4Byte가 할당된다. 그리고 이 포인터가 가리키는 힙에는 Undergraduate에 맞는 공간이 할당된다.
👉이 힙에는 Undergraduate의 변수(ex. year)와 Student 클래스의 모든 변수(ex. studentid), Person 클래스에 들어있는 변수(ex. name, email)등이 함께 들어간다.
Student s = new Undergraduate();
이렇게 s라는 이름의 Student를 만들 수도 있다.
Undergraduate 객체에 필요한 만큼 공간을 할당받고, Person의 변수, Student의 변수, Undergraduate의 변수를 모두 알 수 있다.
👉Student 클래스의 변수를 파악하고 메모리를 계산할 수 있다.
Undergraduate u = new Student(); //컴파일 불가능한 에러코드
이 코드에서, 힙에 할당되는 공간은 Student에 해당하는 만큼이다.
하지만! 이렇게 되면 Student에 포함된 내용과 그에 부모 내용(Person 클래스)에 포함된 내용만 알 수 있다.
Undergraduate 클래스의 내용은 접근할 수 없기 때문에, 이 코드는 컴파일되지 않는다.
👉Undergraduate이 할당하는 메모리 공간 > Student가 할당하는 메모리 공간
👉좌항의 선언되는 객체 변수의 자료형은 항상 우항의 new객체보다 부모단계 (메모리가 더 작은)이거나 같아야한다.
객체 생성에서,
-
개념상의 관계 : 좌항(선언할 객체) ⊃ 우항(힙 공간)
-
실제 할당 메모리 관계 : 좌항(선언할 객체) ⊂ 우항(힙 공간)
//올바른 예제
Animal animal = new Dog();
Vehicle vehicle = new Car();
//틀린 예제
Dog dog = new Animal();
Car car = new Vehicle();
생각해보기
\1) Person u = new Student();이라 정의하였을 때, 컴파일이 될까요?
컴파일이 가능하다.
Person이 가지고 있는 변수나 메소드는 사용할 수 있지만,
Student가 가지고 있는 변수나 메소드는 사용할 수 없다.
References
자바로 구현하고 배우는 자료구조 -Rob Edwards (boostcourse)
Leave a comment