Interface
를 지원하며 하나의 class가 여러 개의 Interface
를 Implements
할 수 있으며 다중상속을 어느정도 흉내낼 수 있다참고) *다이아몬드 문제
위의 그림과 같이 D가 B,C의 다중상속을 받았을 경우 B와 C에 같은 메서드가 존재하고, 상속 받으면서 해당 메서드를 서로 다르게 오버라이딩 했다면 D입장에서는 어느 부모의 메서드를 상속받는지 예측하기 어렵다
이처럼 정확한 상속 관계를 알 수 없어 호출이 모호해져 컴파일러는 정상적으로 수행하지 못하고 이를 다이아몬드 문제라고 하고 C++에서는 이를 해결하기 위해Virtual
키워드를 사용한다.
위에서 B,C가 A 클래스를 상속받을 때 virtual 선언을 하고, B,C 클래스를 상속받는 D 클래스는 A클래스를 한 번 상속받게 된다
Garbage Collector
가 Heap영역에 있는 참조되지 않는 객체를 자동으로 해제해주고 프로그래머가 수동으로 GC를 조작할 수 없다Smart Pointer
가 Standard로 들어오면서 메모리를 직접 해제한다고 하기 어렵다. 방식은 기본 포인터 (raw pointer)가 실제 메모리를 가리키도록 초기화한 후에, 기본 포인터를 스마트 포인터에 대입하여 사용하고 이렇게 정의된 스마트 포인터의 수명이 다하면 소멸자는 delete 키워드를 사용하여 할당된 메모리를 자동으로 해제한다.참고) *컴파일 언어, 인터프리터 언어, 바이트코드 언어
컴파일 언어: 원시코드 (프로그래머가 작성한 소스코드)를 모두 기계어로 변환한 후에 기계에 넣고 기계어 코드를 실행. 소스코드를 기계어로 번역하는 빌드 과정에서는 인터프리터 언어에 비해 시간이 소요되지만 런타임 상황에서는 이미 기계어로 모든 소스코드가 변환되어 있기 때문에 빠르게 실행 가능. (C, C++, Swift, Objective-c)인터프리터 언어: 원시코드를 기계어로 변환하는 과정없이 한 줄 한 줄 해석하여 바로 명령어를 실행하는 언어. 빌드 시간이 없고 Runtime 상황에서는 한 줄씩 실시간으로 읽어서 실행하기 때문에 컴파일 언어에 비해 속도가 느림. 소스코드를 고치고 서버를 다시 시작하지 않아도 변경사항이 반영된 상태로 테스트 진행 가능, 디버깅이 쉽다 (R, Python, Ruby, JavaScript)
바이트코드 언어: 자바는 컴파일러를 이용해 우리가 작성한 Java 코드를 자바 가상 머신이 실행시킬 수 있는 자바 바이트 코드로 번역한다 (컴파일 언어)
자바 바이트 코드는 자바 가상머신의 자바 인터프리터를 이용해 한 줄씩 실행된다. 즉, 자바 바이트 코드로 되어 있는 실행 프로그램을 자바 인터프리터가 한 줄씩 읽으면서 컴퓨터가 이해할 수 있는 2진 코드로 번역한 후 실행 시킨다 (인터프리터 언어)
Reference
http://www.tcpschool.com/cpp/cpp_template_smartPointer
https://okky.kr/articles/449759
https://musket-ade.tistory.com/entry/C-%EB%8B%A4%EC%A4%91%EC%83%81%EC%86%8D-Multiple-Inheritance-%EA%B3%BC-%EA%B0%80%EC%83%81%EC%83%81%EC%86%8D-Virtual-Inheritance
https://jhkang-tech.tistory.com/136
https://jooona.tistory.com/157