달력

12

« 2024/12 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2018. 1. 15. 23:27

배열 스터디 Programming Language/Java2018. 1. 15. 23:27

제가 오늘 설명해드릴건 배열(Array)입니다.

1.배열이란? 2.배열의 선언과 생성 3.배열의 길이와 인덱스

4.배열의 초기화 5.배열의 복사 6.배열의 활용

[1]배열이란?..

책에는 배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것이라고 써져있는데 좀더 자세하게 얘기하면(이것이자바다,명품에센셜)

à같은 타입의 데이터를 연속된 공간에 나열시키고, 각 데이터에(index)를 부여해 놓은 자료구조

중요한건 1) ‘같은타입이어야 한다는 거고, 2)서로 다른 타입의 변수들로 구성된 배열 만들수없다.

변수와 달리 배열은 각 저장공간이 연속적으로 배치되어있다.

그리고 int배열은 int값만 저장 가능하고 String배열은 문자열만 저장가능하다. 배열은 선언과 동시에 저장할 수 있는 데이터 타입이 결정되기 때문에, 만약 다른 타이브이 값을 저장하려고 하면 타입 불일치(Type mismatch)컴파일 오류가 발생한다.

배열의 또 다른 특징은 한번생성된 배열은 길이를 늘리거나 줄일 수 없다..그래서 3개의 값을 저장하는 배열을 생성했다고 가정하면 프로그램 실행도중에 5개의 값 저장하는 배열로 수정x 반대로 2개의 값만 저장하는 배열로도 수정ㅌ 그래서 5개의 값을 저장하는 경우가 발생하면 길이 5의 새로운 배열을 생성하고, 기존 배열 항목을 새 배열로 복사해야한다..

이것으로 배열은 같은 타입의 데이터를 연속된 공간에 나열시키고, 각 데이터에(index)를 부여해 놓은 자료구조이고 1)같은 타입의 데이터만 저장할 수 있으며2)한번 생성된 배열은 길이를 늘리거나 줄일 수 없다는 것을 알 수 있다.. ㅇㅋ?

[2]배열의 선언과 생성

(1)배열의 선언

자바에서 배열을 생성할때는 두단계가 필요하다..

1.     배열에 대한 레퍼런스 변수(참조) 선언 2. 배열생성- 배열 공간 할당

배열에 선언에는 두가지 방법으로 선언이 가능하다 표[5-1]을 참고하면..

1.     타입[]변수이름; 2.타입 변수이름[]; 이렇게 원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호[]를 붙이면된다.

배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이고,

배열의 주소값을 가질 뿐이지 아직 그 자체가 배열은 아니다. 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어진다.

à이건 이따 자세하게 설명하도록 하자

(2)배열의 생성

배열 생성은 배열 공간을 할당받는 과정이다. 반드시new연산자를 이용해서 배열을 생성하며 []안에 생성할 원소의 개수를 지정한다.//그러니까 배열을 생성하기 위해서는 연산자‘new’와 함께 배열의 타입과 길이를 지정해주어야 한다.

타입[] 변수이름; //배열을 선언(배열을 다루기 위한 참조변수 선언);

변수이름 = new 타입[길이]; //배열을 생성(실제 저장공간을 생성);

근데 보통 동시에 선언과 생성하는 방법을 이용한다.

타입[] 변수이름 = new 타입[길이];  à자세한 설명은 183 184 보기

[3]배열의 길이와 인덱스

1)인덱스

생성된 배열의 각 저장공간을 배열의 요소(element)라 하며 배열이름[인덱스]의 형식으로 배열의 요소에 접근한다. 인덱스는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다.

인덱스범위à 0부터 배열의길이 -1까지 [그림 5-3]설명하기 // 185쪽 설명도 설명하기

배열의 장점은 index로 상수 대신 변수나 수식도 사용할 수 있다는 것.. 186쪽 컴파일 에러 설명

2) 배열의길이

괄호안에 배열의 길이를 적어줘야하는데 배열의 생성 부분에서 얘기했음.. 배열의 길이는 배열의 요소의 개수, 즉 값을 저장할 수 있는 공간의 개수다. 양의 정수여야하고 0도포함임

배열사용할 때 오류날수있는경우는..1)배열범위넘어서접근 2)인덱스로 음수사용  3)배열이 생성 되되있지않은 사용할 때 à레퍼런스만 선언하고 사용할 때

Int intArray[]; // \n  intArray[1]=8; 이렇게 설명하면 갑자기 헤깔릴수있는데

예를들어서int intArray = new int[5]; 라고한다면 인덱스는0~4까지 가능.. 근데 여기서 인덱스는

인덱스 =배열크기 -1이라는거 

JVM이 배열의 길이를 관리하는데

배열길이 알려면 배열이름.length를 사용하면됨 더 편함 ..근데 기억할꺼는 p.187아래에 나오는데

배열이름.length는 상수다!  P.188하단~189상단 설명하기

length필드를 이용하면 프로그램에서 배열의 크기를 따로 관리할 필요가 없다

[4]배열의 초기화 

배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화되므로 배열을 사용하기 전에 따로 초기화를 해주지 않아도 되지만. 원하는 값을 저장하려면 요소마다 값을 지정해줘야하는데..이럴 때 {}사이에 원소를 나열해서 초기화된 배열을 만들 수 있다.

P190상단설명 ..출력할때는 190아래와 같은 방법아니면 191상단에

Arrays.toString(배열이름)메서드를 사용해도됨

[5]배열의 복사

배열의 길이를 변경하지 못하기 때문에 두가지 방법을 이용해서 배열을 복사할 수 있다.

(1)   for문을 이용해 배열 복사

(2)   System.arraycopy()를 이용한 배열의 복사

2번째 방법이 더 효율적임 p.192~p.195설명..

예제5-11예제를 설명하면서 length필드에 대해서 잘생각해야함

자바는 배열을 객체로 다룬다.. 배열 공간과 함께 배열의 크기 값을 가진 length필드가 배열 객체 내에 생성된다.. 객체로 관리되는 배열과 배열의 크기를 가진 length필드..

결론 배열의 모든값을 출력하려면

For(int i=0; i<intArray.length; i++)

System.out.println(intArray[i]); intArray배열 크기만큼 루프를 돈다.

배열의 길이가 n일 때 첫번째부터n-1까지 요소에 대해 비교하는데..비교횟수가 주니까n-1-i..

 

 

자바에서 지원하는 데이터타입에 대해서 알기..기본타입과 참조타입이있다.

기본타입이란 정수,실수,문자,논리리터럴을 저장하는 타입을 말한다.

우리는 기본타입으로 변수를 선언하고 데이터를 선언했었는데 참조타입이란 객체(Object)의 번지를 참조하는 타입으로 배열,열거,클래스,인터페이스 타입을 말한다.

기본타입으로 선언된 변수와 참조타입으로 선언된 변수의 차이점은 저장되는 값이 무엇이냐임

기본타입인 byte,char,short,int,long,float,double,boolean을 이용해서 선언된 변수는 실제값을 변수안에 저장하지만 참조타입인 배열,열거,클래스,인터페이스를 이용해서 선언된 변수는 메모리의 번지를 값으로 갖는다. à번지를 통해 객체를 참조한다는 뜻에서 참조 타입이라고 부른다.

Int double로 선언된 변수 age price가 있다면 이것은 직접 값을 저장하고있고

String클래스로 선언된 name hobby가있다고하면.. 힙영역의 String객체 주소 값을 가지고 있다.

변수가 스택 영역에 생성되고 객체는 힙역영에 생성된다는 것만 알아두기

à주소를 통해 객체를 참조한다는 뜻에서 String클래스 변수를 참조 타입 변수라고 한다.

JVM메모리 영역에 대해서 간단하게 설명해드릴껀데 java.exe JVM이 시작되면 JVM은 운영체제에서 할당받은 메모리영역(Runtime Data Area)을 세부영역으로 구분해서 사용한다..

1.     메소드 영역

2.     힙영역

3.     JVM(STACK)영역

여기서 힙영역에 대해서만 간단히 설명드리면

힙영역은 객체와 배열이 생성되는 영역임 힙영역에 생성된 객체와 배열은 JVM스택 영역의 변수나 다른 객체의 필드에서 참조됨 참조하는 변수나 필드가 없으면 의미없는 객체가 되기 때문에

쓰레기로 취급하고 가비지컬렉터가 힙영역에서 자동으로 제거한다 개발자가 별도로 제거해줄필요없고 코드에서 직접 제거시키는방법 제공하지않는다.

JVM스택영역..

한가지만 말하자면 프레임 내부에 로컬변수 스택이 있는데 기본타입 변수와 참조타입 변수가 추가(PUSH)되거나 제거(POP)된다. 변수가 이영역에 생성되는 시점은 초기화될 때, 즉 최초로 변수에 값이 저장될때이다. 변수는 선언된 블록안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거된다.

내가 이얘기를 왜 했냐면 배열변수는 참조변수에 속하낟. 그래서 배열도 객체이므로 힙영역에 생성되고 배열 변수는 힙영역의 배열객체를 참조하게된다. 참조할 배열 객체가 없다면 배열 변수는 NULL값으로 초기화될수있는데(타입[] 변수=null;) 상태에서 변수[인덱스]로 값을 읽거나 저장하면 NULLpointerexception à배열 변수는 배열을 생성하고 참조하는 상태에서 값을 저장하거나 읽어야함

:
Posted by Gongdile