CH04 자바가 확장한 객체 지향
챕터 소개
자바의 키워드 중심으로 자바가 객체 지향을 어떻게 구성하고 있는지를 확인하는 챕터이다. 그냥 자바 일부 키워드 알아보기 정도로 보면 된다. 내용을 다 정리하지 않고 책을 보면서 내가 생각을 정리해놓으면 좋겠다 싶은 부분만 따로 정리해봤다.
abstract
abstract 왜 사용하나
다형성을 구사하기 위해서 사용한다. 다형성을 구사하기 위해선 abstract 만 유일한가? interface 도 있다.
그러면 언제 abstract 를 쓰고, 언제 interface 를 쓰는게 좋을까(=무엇이 언제 적합할까)
'일부만 sub class 가 정의하도록 쓰게 하고, 일부는 공통된 메소드로 지정하고 싶을때 abstract 를 사용한다' 라는 말은 할 수 없는 것이 자바 8 이후로 default 메소드가 나왔기 때문에 interface 로도 얼마든지 일부만 추상화 시키는 것이 가능하다.
이를 구분하기 위한 기준은 근본적으로 interface 가 왜 존재하고, abstract 가 왜 존재하는지를 생각해보면 쉽게 구분되는 것 같기도 하다.(완전 내생각)
interface 행위에 초점이 맞춰져 있다. 말 그대로 '맞닿아 있는' 의 어원처럼 꼭 인식되는 논리적 개념 및 단위가 동일한 범주에 속하지 않아도 단지 그 '행위'만 맞닿아 있으면 동일한 interface 를 구현하는 것이 말이 되는 것이다.
예를 들어 사람과 개가 완전히 다른 분류지만(물론 이것도 어느 관점으로 보냐에 따라 다르지만) 사람과 개는 둘다 '
먹는다'는 행위는 한다. 그래서 사람과 개 각각은 완전히 다른 분류이지만 적어도 '먹는다'는 행위만 놓고 봐서는 두 벤다이어 그램이 이루는 교집합이 생긴다. '먹는다'는 행위로 맞닿아 있는 것이다. 이런 경우 interface 사용을 통해서 사람과 개가 모두 '먹는다' 라는 행위를 하도록 만들 수 있다. 이 순간 '먹는다' 라는 행동을 해야하는 순간이 오면 (=이 행위를 요구받는 메세지를 받게 되면) 동일한 시그니처로 반응하지만 결과적으로 각각 다른 행동(다형)이 발생할 수 있다. 다형성을 이룬 것이다.
abstract 의 경우 인터페이스와는 각 객체만의 상태값을 가질 수 있다. Student 의 sub class 로 초등학생, 중학생, 고등학생, 대학생이 있을 수 있다. 각 학생들은 학교에서 공부한다는 공통된 특성이 있고 학교라는 공통된 상태값이 있을 수 있지만 적어도 해당 각 학생이 다니는 학교(각 상태)는 다를 수 있다. 이런 경우 abstract 가 더 적절하다고 할 수 있다.
생성자
기본 생성자는 언제 만들어지는 걸까?
생성자를 만들어 주지 않아도 기본적으로 생성자가 생기는 것은 매우 상식적인 이야기이다. 그런데 이게 언제 생기는 걸까? 컴파일러가 컴파일 하는 과정에서 따로 명시된 생성자가 없는 경우 바이트코드에 기본 생성자를 만들어 준다.
그럼 왜 다른 생성자가 존재하면 기본 생성자를 만들어 주지 않는 걸까?
이게 1+1=2 처럼 정해진 건 아니고 서치 자료 및 추측성 결론이다.
결론부터 말하자면 '생성자를 1개 이상 선언해 놨다는 것은 해당 객체 생성시 원하는 프로세스 또는 validation 이 있다는 거니까 의도치 않게 객체가 생성되지 않도록 기본 생성자는 만들어 주지 않겠다' 는 것이다.
보통 객체가 생성될때 특정 필드를 초기화 시킨다던가 인자로 받은 파라미터에 대해서 validation 등을 하는 등 여러 행위를 하게 될 수 있는데, 이 말인즉 객체가 생길때 어떠한 비즈니스 이슈가 있을 수 있다는 것이다. 그래서 괜히 기본 생성자를 만들면 의도치 않은 결과가 생길 수 있으니 아예 처음부터 만들어주지 않는다는 것이다.
static 블록의 실행 시점은 언제인가
클래스 로딩 단계에 한 번만 실행된다.
final 키워드가 적용되는 대상과 각 대상에서의 작용
기본적인 내용이지만 한 번 짚고 넘어간다. final 이라는 단어 뜻이 결국 '마지막' 이라는 뜻임을 인지하고 각 대상에서의 의미를 기억하자.
클래스
저자가 상속이라는 단어는 잘못 전파된 것이라고 해놓고 상속이라는 단어를 쓰고 있다. 아무튼 클래스에 final 이 적용되면 확장하지 못하게 한다.(extends 금지)
메소드
재정의 불가능하다.
변수
재할당이 불가능하다.
Last updated