[JAVA에서 생성자도 상속이 되는 걸까❓]
자식 클래스에서 부모 클래스의 생성자가 상속되는지를 확인해봤다.
두가지 관점에서 생각해봐야 한다고 생각이 들었다.
첫번째 관점은, 상속을 단지 추상적으로 자식클래스에서 부모클래스의 필드나 메서드를 사용할 수 있게 하는 행위
정도로만 본다면 상속이 안되는 것이 맞는 것 같다. 왜냐하면 자식인스턴스에서 부모 생성자를 부를 수 없기 때문이다.
두번째 관점은, 메모리적 관점인데 메모리 확인 사이트 여기서 실행 코드가 stack, heap 메모리에 어떻게 쌓이는 지 확인 할 수 있다. 부모 클래스를 상속 받은 자식클래스의 인스턴스를 생성했을때 stack Frames에 자식 생성자가 먼저 쌓인 후 부모 생성자가 쌓이는 것을 확인 할 수 있다. 그리고 부모클래스의 Field와 자식클랫의 Field가 Heap 메모리에 자식 인스턴스에서 관리 되는 것을 확인 할 수 있다. 메모리적 관점으로 볼 때도, 부모클래스의 생성자가 따로 관리되는것을 미뤄보아 생성자가 자식 클래스의 종속 되는 것이 아닌 것 같다. 따라서 메모리적 관점으로도 부모 생성자를 자식 클래스에서 상속 받는 것은 아닌 것 같다.
[Override 어노테이션을 붙이는 이유❓]
어노테이션을 붙이나 안붙이나 똑같이 오버라이딩이 정상적으로 동장함에도 불구하고 어노테이션을 붙이는 이유에 대해 궁금해 졌다.
많은 테스트 결과 어노테이션을 붙이면 컴파일러에게 오버라이드하고 있음을 명시적으로 알려줌으로써 오타를 컴파일단계에서 잡아낼 수 있다.
[구현과 개발의 용어 차이가 뭘까❓]
개발은 (요구사항분석, 설계, 구현, 테스트, 배포, 유지보수) 프로세스 전단계를 개발한다는 부분에서 개발이라고 표현하고, 구현은 설계를 기반으로 실제 코드를 구현하는 단계를 말한다.
[자바에서 클래스가 두가지로 분류할 수 있다고 하는데 왜 그럴까❓]
흔히 알고 있는 메인 메서드 public static void main(String[] args)
를 포함하는 클래스를 Executable Class라고 부르고 프로그램의 시작점이다.
그리고 특정 기능이나 서비스 로직을 제공하는 클래스를 Library Class라고 부른다.
크게는 이렇게 두개로 분류되는 것 같고 데이터를 담당하는 Domain Class, 모듈 전체적인 공통기능을 정의해놓은 Utility Class, Spring에서 Controller기능을 하는 Controller Class로 세부적으로 나눌 수 있다.
프로그램의 진입점을 기준으로 본다면 두가지로 분류 할 수 있다고 생각 한다.
[추상클래스와 인터페이스 왜 둘 다 존재할까❓]
추상클래스에서는 기본 메서드에 모든 접근제한자를 사용할 수 있고, 인터페이스 에서는 JAVA 8 이후로 기본 메서드에 default, private 두가지 접근 제한자를 사용할 수 있다.
추상클래스에서는 default를 제외한 접근 제한자를 사용할 수 있고, 인터페이스에서는 public 이외의 접근제한자는 사용할 수 없다.
추상 클래스에서는 단일 상속만 가능하고 인터페이스는 다중 구현이 가능 하다.
결론: 현업에서는 주로 인터페이스를 사용한다고 한다. 인터페이스만으로 추상클래스의 대부분의 기능을 대체 할 수 있기 때문이라고 생각한다. 단지 여러개의 인터페이스를 구현받아 사용하는 것이 다중 구현된 클래스의 코드만으로 봤을 때 가독성이 좋지 못한다고 생각한다. 추상클래스로 다중 구현을 한번 감싼 뒤 그 추상 클래스를 상속받아 사용한다면 더 가독성이 좋은 코드가 될 것 같다.(개인적 의견)
(추가 의견 7.30)
인터페이스에서 다른 인터페이스 여러개를 다중 구현하는 것이 불가능하다고 알고 있었다. 하지만 extend
를 통해 인터페이스에서 다중 인터페이스를 상속받을 수 있었다. 단순히 JAVA 문범에 미숙했을 뿐... 인터페이스에서 추상클래스 기능을 98퍼센트 대체가 가능하다고 생각이 들었다.
(추가 의견 7.31)
추상 클래스와 인터페이스의 큰 차이점 중 또 한가지는 생성자를 생성할 수 있느냐 없느냐의 차이가 있다.
[post-implement 단계가 무엇일까❓]
geeksforgeeks: Post-implement 단계 이 사이트에서 설명하는 인수 후 구현 단계는 프로젝트가 구현 또는 배포된 후에 발생하는 단계를 의미한다고 한다. 구현된 솔루션을 장기적으로 보장하기 위해 유지보수 및 최적화를 하는 단계로 프로젝트의 안정성 보장을 위해 Waterfall 프로세스를 지향하는 금융권에서 꼭 필요한 단계라고 생각된다.