본문 바로가기

자바 프로그래밍

[JAVA] 배열 & 반복문 조금

for문에 이름을 지정할 수 있음 → break로 for문을 지정할 수 있음!

                                                        switch도 지정할 수 있음!

이건 자바만 가능함. 다른 언어들은 flag 값을 지정해야 하는데... 

 

 

컴퓨터는 변수를 '변수의 시작 주소'로 구분한다.

            (실제 메모리에 있는 주소를 의미함)

자바에서는 포인터의 개념이 없는 이유 ?

실제 주소를 개발자는 알 수 없다.

메모리의 주소값을 개발자에게 제공하지 않고, 개발자는 가상의 주소에 매핑된 해시값으로 데이터에 접근을 한다.

(그러므로 자바가 느려질 수 밖에 없다)

 

시작 주소값만 기억하고 자료형의 사이즈 만큼 데이터를 인식하기 때문에 동일한 자료형의 데이터가 저장된 

나머지 배열에 저장된 값을 알 수 있다. (시작 주소의 값만 알고 있다면 ... )

 

키워드 → (연속적인 공간, 같은 자료형, 변수 집합)

 

 

 

자바에서는 2차원배열을 잘 사용하지 않고, 1차원배열의 객체 배열 형태로 만들어줌.

스택, 힙 - 변수명의 존재 유무로 구분

 

힙은 변수명을 기억하고 있지 않기 때문에 스택에 heap의 변수명을 저장한다.

new 키워드로 만든 공간은 모두 힙에 저장된다 → new 키워드로 만든 것을 통합하여 객체라고 부른다.

 

그러므로 배열은 힙에 만들어짐.

힙은 변수명이 존재하지 않는다. 주소값을 모른다! 주소를 저장할 수 있는 변수가 스택에 필요!!

 

int [] prime ( 이 방식이 스택에 힙의 변수명을 기억하는 작성 방식 ) -> 프라임은 배열의 값을 가지고 있지 않고

                                                                                            주소만 가지고 있음.

 

stack     int [] prime  ← 여기까지는 배열이 만들어진 것이 아니다.

heap      / / / / / / / / ← 주소공간 

 

int [] ar;

ar = new int[3];

ar[0], ar[1], ar[2] .. 와 같이 표현한다.

ar[0] = 100, ar[1] = 30, ar[2] =5;

 

ar = 200 이렇게 하면 그냥 연결이 끊어짐. 

 

 

 

0x50 이 가리키고 있던 사이즈 3인 배열은 메모리 손실이 발생한다.

컴퓨터는 이 메모리를 사용하고 있다고 간주하기 때문이다.

그런데 자바에서는 가비지 커렉터가 이 메모리를 관리해준다. 우리가 별도로 할 필요가 없다.

 

스택의 변수 값들은 쓰레기 값을 가지고 있으나,

힙 영역에 new 키워드로 정의한 값들은 모두 0으로 초기화가 된다.

 

 

 

스택에 저장된 변수 ar은 쓰레기 값을 가지고 있는 반면

힙에 저장된 ar[0], ar[1], ar[2] 은 초기화가 없어도 0으로 초기화

@표시는 거의다 주소값을 의미함

 

 

 

 

int[] prime = new int[6];

prime.length 라고 하면 할 수 있음. (길이를 알 수 있음)

 

// prime2 배열을 크기를 고정하지 않고 선언, 초기화할 때는 [] 내부에 쓰지 않음
int [] prime3 = {1,2,3,4,5,6,7}; // 이렇게도 ok

 

 

일반적으로 이러한 형식을 자주 사용한다.

 

 

d

                                                        aptInfoList가 스택에 있음

 

aptInfoList[3][] 로 선언할 경우

 

aptInfoList[0] = new int[2]

aptInfoList[1] = new int[2]

aptInfoList[2] = new int[2]

와 같음