[스프링 입문을 위한 자바 객체지향의 원리와 이해] 4장 정리
2022.03.24 - [IT 책 독서록] - [스프링 입문을 위한 자바 객체지향의 원리와 이해] 3장 정리
[스프링 입문을 위한 자바 객체지향의 원리와 이해] 3장 정리
2022.03.14 - [IT 책 독서록] - [스프링 입문을 위한 자바 객체지향의 원리와 이해] 1 ~ 2장 정리 [스프링 입문을 위한 자바 객체지향의 원리와 이해] 1 ~ 2장 정리 1장 : 온고지신. 청출어람 1장에서 얘기
blog.robinjoon.space
4장은 이전 장에서 등장하지 않은 자바에서 사용하는 키워드와 개념에 대해 설명한다.
대부분의 키워드와 개념은 이미 자바 문법을 공부하면서 보았던 개념이기에 따로 정리하지 않고, 신선한 내용만 정리해 보았다.
instanceof 연산자
이 연산자는 다음과같이 사용한다.
객체_참조_변수 instanceof 클래스
객체_참조_변수가 어떤 타입으로 선언되어있는 것과 관계없이, 어떤 클래스의 인스턴스로 생성되었는지를 보고 판단한다. 즉, 어턴 클래스의 생성자를 통해 생성된 객체인지를 확인한다.
아래의 경우 모두 true를 반환한다.
class 동물{
}
class 조류 extends 동물{
}
class 펭귄 extends 조류{
}
public class Driver {
public static void main(String[] args) {
동물 동물객체 = new 동물();
동물 조류객체 = new 조류();
동물 펭귄객체 = new 펭귄();
System.out.println(동물객체 instanceof 동물);
System.out.println(조류객체 instanceof 동물);
System.out.println(조류객체 instanceof 조류);
System.out.println(펭귄객체 instanceof 동물);
System.out.println(펭귄객체 instanceof 조류);
System.out.println(펭귄객체 instanceof 펭귄);
System.out.println(펭귄객체 instanceof Object);
}
}
위 코드에서 조류객체, 펭귄객체의 타입이 각각 조류와 펭귄이여도 결과는 같다.
이상의 instaneof 연산자 동작 방식보다도 더 중요한 것은, 코드 상에서 instanceof 연산자를 만나는 경우 LSP 원칙을 위반하는 코드일 가능성이 아주 높다는 사실이다. 이는 리팩토링 대상인 것이다. LSP 원칙에 대한 자세한 내용은 5장에서 나온다.
객체의 메모리구조에 대한 고찰
앞선 장에서 힙영역에 대한 설명을 할 때, 객체는 힙에 생성되고, 그 안에 객체의 메서드도 다 저장되어있다고 했다. 하지만 생각해보면 한 클래스의 인스턴스로 생성된 객체들은 모두 같은 메서드를 가지기 때문에 이를 객체별로 따로 저장할 필요가 없다. 단지, 메서드 내부에서 사용하는 변수들의 값만 다르다. 따라서 실제 JVM 에서는 메서드를 스태틱영역에 클래스 내부에 저장해둔다. 그리고, 각 객체에서 메서드를 호출할때 자기 자신을 인자로 넘긴다.
package stack;
class 펭귄 {
void test() {
System.out.println("Test");
}
}
public class Driver {
public static void main(String[] args) {
펭귄 뽀로로 = new 펭귄();
뽀로로.test();
}
}
위 코드의 5번째 줄을 실행했을 때 메모리 구조는 다음 그림처럼 표현할 수 있다.