자료형[] 배열명; // 자바식. 대부분 이쪽 사용
자료형 배열명[]; // C언어식.
int[] arr;
배열은 선언만해서는 쓸 수 없고 할당까지 해야함
배열은 기본자료형이 아니며 참조자료형처럼 사용
구조가 참조자료형처럼 되어있어 주소값을 갖는다
기본형, 참조형 구분 기준 : call by value & call by reference
즉, 주소값을 가져오느냐 값 자체를 그대로 복사해서 가져오느냐
* Stack 영역에 공간 생성
배열 할당
heap 메모리 영역에 공간을 생성하는 것
(변수의 선언 : stack에 공간 차지)
자료형[] 배열명 = new 배열명[배열길이]
자료형 배열명[] = new 자료형[배열길이]
메모리 영역에 공간을 생성해주는 역할을 new 연산자가 실행
new 연산자가 배열 할당하는 역할+heap영역에 생성된 공간에 대한 주소값을 발생시킴
배열의 크기 변경 가능할까?
배열은 크기 변경 불가
새로운 배열을 만들고 바꿔치기하거라 주소값이 바뀐다(0x100→0x200)
System.out.print("새로 할당할 배열의 길이 입력 : ");
int size = sc.nextInt();
double[] dArr = new double[size];
System.out.println("dArr의 길이 : "+dArr.length);
System.out.println("dArr의 주소값 : "+ dArr); // [D@74a14482
dArr = new double[5];
System.out.println("변경 후 dArr의 길이 : " + dArr.length);// 배열 길이 변경 가능
System.out.println("변경 후 dArr의 주소값 : " + dArr); // but 길이 변경 후 주소값 달라짐 [D@1540e19d
System.out.println(); //
// 주소값하면 new 연산자가 떠올라야.
// dArr[30]에서 new연산자가 쓰이면서 새로운 공간생성과 함께 주소값 생성하기에 주소값이 달라짐
그래서 주소값이 바뀌는 것(0x100→0x200)
기존 배열 유지x
new연산자에 의해 heap영역에 새로운 배열의 공간이 생성되고 그에 따라 stack에 있는 변수명 dArr의 참조 변수값(주소값)도 0x100→0x200 바뀜
new 연산자 역할
1)배열 할당 : heap 메모리 영역에 공간 생성
2)heap 영역에 생성된 공간에 대한 주소값 생성
-배열 한칸이 아닌 배열 한덩이 전체에 대한 주소값
ex)주소값 0x100
heap이 컴퓨터와 사용자가 같이 사용하는 공간인 것
배열명에 담긴게 heap메모리 영역에 생성된 주소값을 담은 것
주소를 통해서 실제 데이터를 가리키는 것이다.
배열 초기화
1)인덱스 이용
중괄호{}를 이용
for문 이용
1)인덱스 이용
배열명[인덱스] 값;
ex)
int[] iArr = new int[3];
iArr[0] = 1;
iArr[1] = 2;
iArr[2] = 3;
iArr[3] = 4; // error : 배열이 3칸 할당됬는데 없는 4칸째에 값을 할당하려해서
2) 중괄호{} 이용
자료형[] 배열명 = {값,값};
ex)
int[] arr = {1,2,3,4}; // 값 수에 따라 알아서 배열 칸 지정하고 생성함
배열 선언 배열 할당 배열 초기화 : 인덱스,중괄호,for문 배열 삭제 : null 배열 값 출력하는 방법 2가지 : for문, Arrays.toString() 배열 복사 : shallow copy & deep copy
코드 익히기 & 배운 것들
배열 크기 변경 불가(삭제하고 새로 만들기에 주소값이 변경됨) 배열 안 값이 최대길이보다 짧으면 값만큼만 출력되서 나옴(여분공간에 다른값x) dArr[3] = 3; // 3.0으로 출력 -> 자동형변환(int to double) 초기화 for문 방법은 int만 가능하나, 실수로 형변환 가능한 int면 for문 가능 -> int인 i가 실수로 변환 가능한 수이기에
public void arrayPractice() {
// 배열 선언
// 배열 할당
// 배열 초기화 : 인덱스,중괄호,for문
// 배열 삭제 : null
// 배열 값 출력하는 방법 2가지 : for문, Arrays.toString()
// 배열 복사 : shallow copy & deep copy
//
// 배열 크기 변경 불가(삭제하고 새로 만들기에 주소값이 변경됨)
// 배열 안 값이 최대길이보다 짧으면 값만큼만 출력되서 나옴(여분공간에 다른값x)
// dArr[3] = 3; // 3.0으로 출력 -> 자동형변환(int to double)
// 초기화 for문 방법은 int만 가능하나, 실수로 형변환 가능한 int면 for문 가능 -> int인 i가 실수로 변환 가능한 수이기에
// null인 배열값 확인 시, for문방법은 널포인트익셉션 쓰므로 Arrays.toString() 사용해야함
//배열 선언
String[] arr; // Stack 영역에 공간 생성
//배열 할당
String[] sArr1 = new String[3];
String sArr2[] = new String[3];
// 배열 초기화
// 방법1 : 인덱스
sArr1[0] = "a";
sArr1[1] = "b";
sArr1[2] = "c";
// 방법2 : 중괄호 {} 이용
// 선언과 동시에 초기화
// sArr2 = {"a","b","c"}; // error : 중괄호 타입은 자료형부터 풀로 적어주는 형태에만 가능
String[] sArr3 = {"a","b","c"};
// 방법3 : for문
// 배열이 int타입인 경우만 사용가능
// double로 형변환 가능한 int면 for문 가능할까?
// 가능. int인 i가 실수로 변환 가능한 수이기에
int[] intArr = new int[5];
for(int i=0; i < intArr.length;i++) {
intArr[i] = i + 1;
}
for(int i=0; i < intArr.length; i++) {
System.out.print(intArr[i]+" "); // 1 2 3 4 5
}
// 배열 삭제
intArr = null;
System.out.println(Arrays.toString(intArr)); // null
// 배열 값 출력하는 방법
// 1)for문
// 2)Arrays.toString()
// 1)for문
// int[] baseArr = {1,2,3,4,5};
// for(int i=0; i<baseArr.length;i++) {
// System.out.print(baseArr[i] + " "); // 1 2 3 4 5
// }
// 2)Arrays.toString()
// System.out.println(Arrays.toString(baseArr)); // [1, 2, 3, 4, 10]
/******************************practice 2nd ************************************/
// 배열 선언
char[] cArr;
// 배열 할당
char[] cArr1 = new char[3];
char[] cArr2 = new char[3];
// 배열 초기화(추가)
// 방법1 : 인덱스
cArr1[0] = 'a';
cArr1[1] = 'b';
cArr1[2] = 'c';
// cArr1[3] = 'd';
// System.out.println(Arrays.toString(cArr1));
// 방법2 : 중괄호
char[] cArr11 = {'a','b','c'};
char[] cArr22 = {'ㄱ','ㄴ','다'};
char[] cArr3 = {'a','b','c'};
// 방법3 : for문
// int배열만 사용가능
// char[] cArr4 = new char[4];
// for(int i=0; i < cArr4.length; i++) {
// cArr4[i] = i + 1; // int배열만 사용가능하기에 error : Type mismatch: cannot convert from int to char
// System.out.print(cArr4[i] + " ");
// }
int[] cArr4 = new int[4];
for(int i=0; i < cArr4.length; i++) {
cArr4[i] = i + 1;
System.out.print(Arrays.toString(cArr4)+'\n'); // [1, 0, 0, 0][1, 2, 0, 0][1, 2, 3, 0][1, 2, 3, 4]
}
System.out.println(Arrays.toString(cArr4)); // [1, 2, 3, 4]
// 배열 삭제
cArr4 = null;
System.out.println(Arrays.toString(cArr4));
System.out.println(Arrays.toString(cArr3));
cArr3 = null;
System.out.println(Arrays.toString(cArr3));
System.out.println("===practice 3rd===");
/******************************practice 3rd ************************************/
// 배열 선언
float[] fArr;
float[] floatArr; // Stack 영역에 공간 생성
// 배열 할당
float[] fArr1 = new float[5];
double[] dArr = new double[5];
// 배열 초기화
// 방법 1 : 인덱스
dArr[0] = 0.1;
dArr[1] = 0.2;
dArr[2] = 3.0;
dArr[3] = 3; // 3.0으로 출력 -> 자동형변환
System.out.println(Arrays.toString(dArr));
// 방법2 : 중괄호
double[] dArr2 = {0.1,0.2,0.3};
System.out.println(Arrays.toString(dArr2)); // [0.1, 0.2, 0.3] -> 배열 안 값이 최대길이보다 짧으면 값만큼만 출력되서 나옴(여분공간에 다른값x)
// 방법3 : for문
double[] dArr3 = new double[3];
// double로 형변환 가능한 int면 for문 가능할까?
// 가능. int인 i가 실수로 변환 가능한 수이기에
for(int i=0; i < dArr3.length; i++) {
dArr3[i] = i + 1;
System.out.print(dArr3[i]+" "); // 1.0 2.0 3.0
}
System.out.println();
dArr3 = null;
// for(int i = 0; i < dArr3.length; i++) {
// System.out.println(dArr3); // null인 배열값 확인 시, for문방법은 널포인트익셉션 쓰므로 Arrays.toString() 사용해야함
// }
System.out.println(Arrays.toString(dArr3)); // null
}
방법2의 접근법은 키 안이 완벽한 상태여야 사용가능 띄어쓰기가 있으면 키 자체가 불완전해서 사용불가 띄어쓰기는 [ ] 대괄호 접근방법 사용
var objTest = {
'k$ey':'value1',
'k_ey':'value2',
'k ey':'value3',
};
console.log(objTest['k$ey']); // 객$체명
console.log(objTest['k_ey']); // 객_체명
console.log(objTest['k ey']); // 객 체명
console.log(objTest.k$ey);
console.log(objTest.k_ey);
//console.log(objTest.k ey); // 에러
// 키에 특수문자 대괄호로 감싸줘야함
// 키로써 모든게 완벽할 때 .쓸 수있지만, 띄어쓰기는 키 자체가 불완전하기 때문에 에러
// 띄어쓰기 쓸려면 []로 속성에 접근해야함
객체의 메소드 속성
function test2() {
var satoori = { // 중괄호{ } : JS의 객체
area1:'전라도', // area1:'전라도'을 필드라고 볼 수 있음
area2:'경상도',
song: function(act){ // 함수. song은 함수를 가지고 있기 때문에 메소드 역할을 함
var area2 = '강원도';
console.log(this.area1 + '와 ' + this.area2 + '는 ' + act); // 객체 안의 area1 ,area2, 매개변수로 받아온 act 출력
} // this를 붙이기 싫으면 변수 선언을 이 안에서 해줘야함.
}; // this가 있어야 객체 안에있는 속성을 찾음.
// this를 붙이면 경상도, 안붙이면 강원도
satoori.song('사이가 좋다'); // area1 is not defined 에러
// 객체를 변수satoori에 넣었고, 이 변수를 호출 했는데 에러발생
// why?
// 객체 안에서 내 속성을 호출할 때는 반드시 앞에 this.가 들어가있어야함
// 객체 내에서 쓰면 내 속성을 호출하는거기 때문에
// 여기에서는 객체 안에서 쓰면 외부에 있는 내 속성을 호출할 때 쓰는 것
// this를 안붙이고 쓸려면 function(act)안에 area1,2가 존재해야한다
// this가 있어야 객체 안에 속성을 찾음 -> 객체 안 함수의 내에서 함수 밖이자 객체 안의 속성값을 쓸려면 this를 붙여야한다
// this 있으면 함수 외부(객체의 속성)
// this 없으면 함수 내부
객체와 반복문
객체의 속성을 살펴볼때는 단순 for문으로는 불가능하고 for in문 사용해야함 ‘배열’을 가지고 사용할 때, 앞에 있는 변수(i)에 담기는 값은 배열의 인덱스가 담김 ’객체’를 가지고 사용할 때, 앞에 있는 변수(i)에 담기는 값은 객체의 키가 담기게 됨.
function test3() {
var movie = {
title:'신비한 동물들과 덤블도어의 비밀',
release: '2022-04-13',
director: '데이빗 예이츠',
mainActor: ['에디 레드메인','주드 로','매즈 미켈슨','댄 포글러','앨리슨 수돌'],
screening : true
};
// for in문에서 배열을 가지고 사용할 때, 앞에 있는 변수(i)에 담기는 값은 배열의 인덱스가 담김
// for in문에서 객체를 가지고 사용할 때, 앞에 있는 변수(i)에 담기는 값은 객체의 키가 담기게 됨
for(var i in movie) {
console.log(i); // 객체의 key값들이 찍힘. title release director mainActor screening
console.log(i + " : " + movie[i]); // i = 키값 + movie[i] = 밸류값
}
// 비어있는 객체
// {}
}
객체 속성 추가 및 제거
처음 객체 생성 이후 속성을 추가하거나 제거하는 것을 '동적으로 속성을 추가/제거한다'라고 함
1)객체 속성 추가
// 설명
student.name //스튜턴드의 네임을 가져오는 코드
student.name = '강건강'; //스튜턴드의 네임을 가져온 것에 강건강을 집어넣은 것
//속성도 만들어주고 값도 집어넣는 것
방법1
.으로 객체 안 속성 접근하는 방법
// 객체 속성 추가 방법1 : .으로 객체 안 속성 접근하는 방법
student.name = '강건강'; // {name:강건강} // key=name value='강건강'
// student.name 코드는 원래는 스튜던트에있는 name을 가져오는거였는데,
// = 으로 값을 대입하고 있으니
// student라는 객체의 name 이라는 속성에
// 강건강을 집어넣음.
// 이런식으로 값도 넣을 수 있다는것임.
student.hobby = '운동'; // {hobby:운동}
방법2
대괄호[]로 객체 안 속성 접근하는 방법
function test4() {
var student = {}; // 비어있는객체
// 객체 속성 추가 방법2 : 대괄호[]로 객체 안 속성 접근하는 방법
student['strength'] = '100m 달리기'; // 객체{} 안에
student['dream'] = '체육관 관장'; // 키값 'strength'와 밸류값 100m 달리기'를 추가
}
// 객체 속성 추가 완료 및 확인
console.log(student); // {name: '강건강', hobby: '운동', strength: '100m 달리기', dream: '체육관 관장'}
후에 공부할 것 : hoisting & prototype이게 왜 일어났는지 이 상황을 이해하려면 prototype(콘솔에서 나오는 그 프로토타입)과 hoising 공부해야함js를 깊게 공부하고 싶다면 hoising,prototype 공부 // 몰라도 js 사용가능hoisting : 선언과 할당을 나눠서 하는 것분리한거에 따라서 undefined가 뜰 수 있는데 hoising 때문
나중에 그 값들을 채워넣는 것. 분리해서 하는걸 hoising이라고 함
선언하고 할당을 분리시키는 것
프로토타입은 많이 어려워서 먼저 공부할거면 hoising만 추천
위에 삭제하기 전 console.log 호출했을 때, hobby가 삭제된채로 출력된게 왜 그렇게 적용이 된건지