아래 내용은 부스트코스 <자바로 구현하고 배우는 자료구조> 강의를 들으며 정리한 것입니다.
객체의 메모리 할당 방법
Student s = new student();
이와 같이 객체(인스턴스)를 만들었을 때 JVM은 코드를 읽고 객체가 필요로하는 메모리를 계산하여(즉 Student 객체가 무엇인지, 어디에서 상속된 것인지 확인하여) 그 만큼의 Student공간을 힙에 할당.
그리고 4byte 블록의 포인터를 만들어, 이 포인터가 힙에 할당된 공간을 가리키게 된다.
상속
여러 개의 객체가 있으면 상속을 활용하여 객체 간의 관계를 나타낸다. (extends)
예를 들어, 대학의 구성원을 People, Student, Undergraduate 3개의 클래스로 만든다고 하면 Studen가 People에 속하고 Undergraduate이 Student에 속하게 되면 Undergraduate도 People에 속하게 된다.
public class Person{
} //상위 레벨 클래스
public class Student extends Person{
}
public class Undergraduate extends Student{
}
위와 같이 상속 관계를 지정하여 Student 클래스를 만들면 JVM은 이 클래스가 Person을 상속한다는 것을 알아채고 Person 클래스에 있는 변수와 메소드를 모두 가져온다. Student를 상속 받은 Undergraduate 클래스를 만들면 Student 클래스에 있는 변수와 메소드를 모두 가져온다. Undergraduate는 Student가 상속 하는 Person 역시 상속한다.
자바는 단일 상속만을 허용한다
각 클래스는 하나의 클래스만 상속받을 수 있다.
(C++과 같은 언어에서는 다중 상속 허용)

상속받는 클래스의 정보만 갖는다
위 그림과 같이 대학 구성원의 계층 구조를 그려보면, Undergraduate과 Student는 Person에 속하지만 Faculty와 Admin에 대해서는 알지 못한다. 즉 트리를 올라갈 수만 있다.
상속받는 클래스의 메모리 공간을 함께 할당
Undergraduate u = new Undergraduate();
상속 받은 상태로 새롭게 객체 Undergraduate u를 정의한다. 이 때 u에는 4바이트가 할당되며, u가 가리키는 힙에는 Student에 들어있는 모든 변수, Person에 들어있는 변수도 포함하여 Undergraduate에 맞는 공간이 할당된다.
Student s = new Undergraduate();
위와 같이 Student s 를 만드는 것은 가능한데, Undergrduate 객체에 필요한 만큼 힙 공간을 할당 받으므로 Person, Student, Undergraduate의 변수를 모두 알 수 있다.
But, 부모 타입으로 자식 객체를 참조하면 부모가 가진 메소드만 사용할 수 있다.
자식의 메소드를 호출하고 싶다면 부모타입을 자식타입의 참조변수로 참조해야 하며, 명시적 형변환 해주어야 함
Undergraduate u = new Student();
위와 같이 코드를 작성할 수 없다. 컴파일 에러
Student에 해당하는 만큼 힙에 공간이 할당되므로 Undergraduate 클래스의 내용은 접근할 수 없게 된다. (공간 불충분)
생각해보기
Q. Person u = new Student();이라 정의하였을 때, 컴파일이 될까?
A. 컴파일 가능. Student가 Person을 상속하였으므로
Overrides
Object one = "hello world";
Object two = "hello world";
// 객체 비교
if(one.equals(two))
System.out.println("they are the same");
Object의 equals 메소드는 one과 two의 메모리 주소를 비교한다. 따라서 they are the same은 출력되지 않는다.
String one = "hello world";
String two = "hello world";
// 문자열 비교
if(one.equals(two))
System.out.println("they are the same");
반면 위의 결과 they are the same 이 출력.
String 클래스에서 Object 클래스의 equals를 Overrides 한 것이므로 메모리 주소가 아닌, 문자열 one과 two를 비교한다.
+ override 되는 메소드에 @Override 어노테이션을 붙여야 한다는 것을 알게 되었다
Comparable 인터페이스
객체간의 비교를 가능하게 해주는 인터페이스.
if(((Comparable<T>) data).compareTo(obj)==0)
Comparable 인터페이스는 같은 자료형의 다른 객체 하나를 인자로 받아와 비교하는 compareTo(T o) 메소드를 사용한다. 인터페이스를 implements한 클래스는 반드시 compareTo 메소드를 정의해야 한다.
a.compareTo(b) 는 아래와 같은 규칙을 따른다.
if ( a < b ) return < 0
if ( a == b ) return 0
if ( a > b ) return > 0
객체와 비교할 수 없는 타입의 객체가 주어지면 Throw ClassCastException
if(((Comparable<T>) data).compareTo(obj)==0) //(data를 형변환)
data를 comparable로 형변환하고 compareTo 메소드를 호출하고 비교할 객체를 인자로 넣는다. 이 둘이 같다면 0이 반환되며, 앞의 것이 크면 0보다 큰 값, 앞의 것이 작으면 0보다 작은 값이 반환된다.
'Programming > java 자료구조' 카테고리의 다른 글
| 2-1) 연결 리스트, 노드와 크기 (0) | 2022.07.25 |
|---|---|
| 1-5) Autoboxing, 예외 처리 (0) | 2022.07.23 |
| 1-4) 제너릭 프로그래밍, 매개변수화 타입 (0) | 2022.07.23 |
| 1-2) 빅 오 표기법 (0) | 2022.07.21 |
| 1-1) 자료구조의 시작, 복잡성 (0) | 2022.07.20 |