//Java
Vector[] list = new Vector[10]
//C++
Vector* list = new Vector
위는 실질적으로 다른 코드이다
Java의 new는 실제 vector 10개의 공간만 있고
아무런 값도 들어있지 않은 nullprt이 10개 만들어진다.
그마다 vector를 만들어주려면
for문 돌면서 Vector 10개 만들어 줘야한다.
C++에서는 이런 혼돈이 없다.
new Vector하면 진짜 Vector를 10개 만들어준다.
즉, 포인터를 담을 수 있는 공간 10개를 만들어주는 것이 아니라
오브젝트 10개를 진짜 만들어준다.
글로 말하면 이해가 조금 안되는데 다음 그림을 보면 이해가 쉬울 것이다.
때문에 Java에서는 Vector 포인터라고 하는 것과 같다.
따라서 Java에서의 코드를 C++로 표현하면 다음과 같다.
// Java와 다름
Vector* list = new Vector[10]
// Java와 같음
Vector** list = new Vector*[10]
Java와 같은 코드는 더블 포인터이다.
포인터 하나는 배열이고 다른 하나는
배열이 아닌 실제 포인터
Vector 포인터의 배열이란 의미이다.
Java는 포인터를 삭제해주지 않아도 되지만
C++는 지워주지 않으면 메모리가 평생 남아있다.
따라서 delete꼭 해줘야하고,
delete 이후에는 NULL해줘야 이상한 접근을 하는 것을 막을 수 있다.
근데 이런 복잡하고 귀찮은 언매니지먼트를 왜 쓰냐?
언매니지먼트 언어가 아니면,
가비지컬렉터가 일을 따로 하기 때문에
성능이 느려졌다 빨라졌다한다.
따라서 고성능을 요하는 리얼 타임 프로그램에서는 적합하지 않을 수도 있다.
하지만 언매니지먼트는 실수 안하고, 내가 직접 관리만 잘 해준다면
성능이 빠른 프로그래밍을 작성할 수 있다.
이러한 것 외에도
//Java
public class Vector
{
private int x; // 자동으로 0의 값으로 초기화
private int y; // 자동으로 0의 값으로 초기화
}
//C++
class Vector
{
private:
int mX; // 초기화를 해주지 않는다면 쓰레기 값
int mY; // 초기화를 해주지 않는다면 쓰레기 값
}
Jave는 변수 선언시
1. 선언
2. 초기화
2 단계를 거쳐야 하는 반면에,
C++은 선언과 동시에 초기화해주지 않는다.
메모리 잡아왔으면 잘 모르는 값이 들어있다.
이는 C++과 Java 모두 메모리 잡아왔으면 잘 모르는 값이 들어가는 것은 똑같겠지만,
Java는 들어가는 값을 다시 초기화해주는 것이다.
C++은 왜그럴까?
성능 때문이다.
Java처럼 C에서 쓰려면 memset으로 할당해주면 된다.
Vector a = new Vector();
// C 의사코드
void* ptr = malloc(sizeof(Vector));
memset(ptr, 0, sizeof(Vector));
a = (Vector*)ptr
즉 C에 없는 기능이 있다면
1. 컴퓨터가 알지 못하는 것이다.
2. 다른 엔지니어가 구현한 것이다.
-> 그렇다면 진정한 프로그래머라면 그 사람처럼 생각할 수 있어야 한다.
그렇다면 나도 고급 프로그래머가 될 것이니.
새로운 기능을 위해 하드웨어 잘 돌게하려면 어떻게 해야할까? 고민해야 한다.
선언문 관례는
자바는 변수가 위에, 함수가 아래
C++는 public이 위에 private가 아래.
'프로그래밍 언어 > C & C++ 정리' 카테고리의 다른 글
Java와 C++의 차이로 배우는 소멸자와 const 멤버 함수 (4) | 2024.10.31 |
---|---|
Java와 C++ 로 비교하는 - 초기화 리스트와 기본 생성자 (1) | 2024.10.31 |
C++ 에서 가상 함수가 필요한 이유는 무엇인가? (0) | 2024.10.24 |
* const 와 reference (0) | 2024.09.27 |
함수 뒤에 const? 너 누군데 (0) | 2024.09.25 |