게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
C와 자바의 배열에 관해서
게시물ID : computer_108519짧은주소 복사하기
작성자 : 타르앤니코틴
추천 : 10
조회수 : 2086회
댓글수 : 9개
등록시간 : 2013/08/28 05:48:58
별것 아니고
http://www.todayhumor.co.kr/board/view.php?table=computer&no=100497&s_no=100497&page=3의 댓글과
http://www.todayhumor.co.kr/board/view.php?table=computer&no=100584&s_no=100584&page=1 을
보게 되었는데 두분 다 전혀 다른 것으로 오해하시는 듯해서

API님은 C을 중점으로 하시고(구체적으로 무슨 언어을 주력으로 하시는 지는 모르겠고요)
네모난감자님은 C혹은 C++ 이후 JAVA을 공부하셨던 분 같은데 
용어와 개념이 언어별차이에서 서로 오해하시는 듯 해요

문제가되는
int [] a = new int [3] ; 와
int a[3]; 이거는
자바에서는 동일한 동작입니다
자바에서 배열은 객체라서 모두 힙에 올라갑니다 
1번글의 리플중 지워진듯한데 API님은 두 내용이 다르다라고 하셨던듯 한데
이 부분은 네모난감자님 말이 맞아요

그런데 자바에서는 레퍼런스 변수의 값은 모두 동적으로 할당이 됩니다
(자바에서는 데이터형 이외로 선언된 변수는 모두 레퍼런스 변수,참고로 C에서의 레퍼런스 변수는 오직 포인터)
[]자체가 하나의 클래스에요 별도의 데이터형이 아니에요 
API에서 보면http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Array.html 이거이고요
컴파일러에서 소스을 해석할때 []나오면 위의 Array클래스의 변수 선언과와 실 메모리을 할당을 하는 것으로 
그냥 문법이에요 
자바의 []는 클래스형선언이라고 보시면 되요 안에 숫자가 있다면 생성까지 완료된거죠
그래서 데이터형[]이든 클래스형[] 이런식이으로 선언된 변수는 레퍼런스 변수고 
그래서 자바의 배열중에 정적할당인 것은 없습니다

그리구 C든 자바에서 []은 모두 정적배열로 생성됩니다 
C든 자바에서 []의 정의는 연속되는 같은 형 데이터가 나열된  길이가 정해진 구조체이거든요
길이가 동적인것은? 즉 동적배열이라고 부르는 것들은 동적배열을 구현한 것은 
자바에는 ArrayList 라는 클래스가 있습니다
그럼 C에서는? C에서는 구조체등으로 구현해야 합니다 
자료구조을 공부하셨다면 많이 해보셨을꺼라고 생각해요
 
그런데 C에서 
int a[3]; 이 구문은
이넘은 정적 배열임과 동시에 정적 할당이되요
스택에 int형의 길이3개 만큼 할당하고 시작이 되거든요
스택에 메모리을 선언하면서 정적생성이 되죠
포인터을 선언하구 malloc으로 할당하는 것은 동적할당이고요
c++컴파일러에서는 
int* a = new int [3]; 이런식으로 동적생성을 하기도 하죠

[]의미도 자바와는 상당히 다른데요 
자바에서는 Array라는 클래스을 선언하고 하위에 getter setter 메소드을  호출하기 위한 문법이라면
C,C++에서  
int a[3];
a[0]=1;
이라는 구문이 있다면
int a[3];은 스택에 할당 하고 a을 포인터로 선언
(주의하셔야 하는게 할당시 heap에 올라가지 않습니다 그래서 정적할당이죠)
a[0]의 []는 a라는 포인터을 참조하기 위한 연산자입니다 *(a+0)과 같아요 

그럼 무엇을 제가 오해라고 생각하냐면
용어의 차이입니다
정적배열,동적배열,동적할당,정적할당이 문제가 된 용어죠

솔직히 용어적으로 무엇이 맞는지는 몰겠습니다 
어짜피 참조하게된 원서의 번역자와 개인의 개념정리차이이기 때문이죠 
(갠적으로 C에서 []을 배열이라고 표현할게 아니라 
포인터참조자라고 했으면 합니다 아님 [] 없애든가;;)

자료구조의 개념쪽으로 정적배열,동적배열을 접근하면
정적배열 = 길이가 정해진 배열
동적배열 = 길이가 가변하는 배열이고
이 개념에 맞춰서 java에서는 Array,ArrayList 로 각각 심플하게 적용이 되는데요
(대부분의 자료구조체는 JAVA의 경우 이후에 나온 언어라서 클래스로 구현이 되어 있죠)

C에서는 
자료구조의 개념의 동적배열은 별도로 구조체로 구현해야 하죠 
자료구조의 개념의 정적배열은 선언시 데이터형[배열크기]; 로 선언하든 
malloc으로 할당시에 사이즈넣든 암튼 []연산자로 접근할 수 있는 녀석인데요 

언어적으로 C에서의 배열이라는게 
JAVA처럼 자료구조의 개념을 별도의 형이나 정의된것이 아닌
레퍼런스 변수에 연속된 주소에 별도 연산자 이용해 참조하는 방식이라 
포인터=배열이라는 애매한 표현법과 
학습시 동적할당과 정적할당의 차이로

용어 사용시 
정적배열=스택에 올라간 배열
동적배열=힙으로 올라가는 배열 malloc으로 생성한 배열이죠
로 사용하는 경우가 있습니다

이런 용어적 차이와 각 언어에서 
사용하는 개념차이 때문에 서로 오해하시고
논쟁을 하셨던 듯 합니다


전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호