Problem Solving/백준

[자바 자료구조] 객체지향, 상속, 클래스, 오버라이드

예민한고라니 2022. 1. 25. 20:56

아래와 같은 코드들이 있다.

int i = 10;	// 첫째줄 
short j;	// 둘째줄 
long k;		// 셋째줄 
Student S = new Student();

첫줄, 둘째줄, 그리고 셋째줄은 4byte, 2byte, 그리고 8 byte만큼의 공간을 차지한다.
그렇다면 Student라는 객체로 선언된 s는 얼만큼의 메모리 공간을 차지할까?​
JVM은 특정 객체를 선언받았을때, 객체의 크기와 관련없이 s라는 4byte의 공간을 만든다.
그리고 이 공간은 다시 heap에 있는 실제 Student만큼의 객체 크기 만큼 할당한 부분을 가리킨다.
도식화한 모습은 다음과 같다.

 


아래와 같은 Person이라는 클래스와 Student라는 클래스가 있다고 하자

Person() {
    id 
    name 
    email 
}

Student() {
    id 
    name 
    email 
    gpa
}



위와같은 기능을 구현할때 모든 기능을 구현할 필요는 없다.
아래처럼 Person class를 상속받은 Student class를 만들면 되기 때문이다

public class Person{ 
		... 블라블라 ... 
}

public class Student extends Person{ //extends 사용!! 
		... 블라블라 ... 
}


원칙적으로 한개의 자식 class는 1가지의 부모 class만 상속받을 수 있다.
대신! 각각 class들은 hierarchy를 형성할 수 있다, 아래처럼!
그리고 모든 객체의 최상위에는 Object 라는 객체 그자체가 존재한다

 

모든 객체의 최상위는 Object이다!

 


Monkey라는 어떤 객체가 있다고 가정하자. 다음과 같은 코드가 작성되었을때, 마지막 두줄 코드은 True일까 False일까?

 

String one = "hello world"; 
String two = "hello world"; 

Monkey m = new Monkey(); 
Monkey n = new Monkey(); 

one.equals(two) // T or F? 
m.equals(n) // T or F?

String으로 선언된 객체의 equals의 경우, 우리가 알고있듯 두 문자열 자체를 비교해준다.
여기의 one 과 two는 모두 Hello world 이므로 당연 True가 될것,

하지만 어떠한 객체에서 equals는 기본으로 제공되는 연산자로, 두 객체가 가르키는 메모리의 주소를 의미한다.
당연히 m과 n이 가르키는 주소가 다를것이므로 여기서는 False일것.


"아니,, 근데 , String도 하나의 객체 아닌가 ...?"


맞다. 모든 객체들의 최상위에는 Object가 있지만, String객체와 Monkey 객체에서 작동하는 equals는 다르게 작동한다.
이것이 가능한 이유는 String 객체를 정의할 당시 Object에 정의되어있는 equals 함수를 Override 했기 때문이다(!)

 


 

본 게시물은 아래 인강의 내용을 기반합니다.

https://www.boostcourse.org/cs204