프로그래밍 언어/C & C++ 정리

Java와 C++/C 차이 개체 배열, 선언문 관례

뽀또치즈맛 2024. 10. 28. 14:13

 

//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가 아래.