05장 참조 자료형
5-1. 배열-1차원 배열 (특징, 선언과 객체생성, 메모리구조, 값입출력)
- 참조자료형 (무한개) : 배열, 열거, 클래스/인터페이스
- 대표적인 참조자료형이 배열과 String이다.
- 배열의 크기를 지정하면 변경불가하다!
- int와 int 배열은 다르다. (배열은 참조자료형이다.)
- null은 참조변수 값의 초기값이다. 즉, 0, -1, 1과 같은 값을 집어 넣는 것이 아니라, 가리키는 객체가 없다는 것을 의미하는 null로 초기값을 설정해야한다.
- new 의미는 heap 메모리에 객체(int [3]를 저장할 수 있는 방 3개)를 만들어서 넣어라 라는 의미이다.
- 두번째 특징은 객체 생성시 개수가 지정되어야 한다. => 즉, new double[5] 처럼 개수 지정
- stack은 강제 초기화가 x, 그러나 heap에는 강제초기화가 가능하다. 즉, stack은 값을 집어 넣지 않으면 빈칸으로 존재할수있지만, heap은 빈칸으로 존재할 수 없기 때문에 타입에 따라 초기화 값이 지정된다. (위에 int이기 때문에 0으로 초기화 된것)
5-2. 배열-1차원 배열 (세 가지 초기값 부여방식 및 출력)
3가지 방법 모두 기억하기.
- 힙메모리는 빈칸으로 존재할 수 없기 때문에 강제초기화 된다.
- 기본자료형이 됐든 참조자료형이 됐든 모든 변수는 스택에 들어간다.
- 참조자료형은 스택에 참조 값이 스택에 들어가고, 값은 힙에 저장하고 있다.
- '='가 스택 메모리의 값을 복사하므로 각 자료형마다 복사하는 값이 다른것이다. (기본이 값, 참조가 위치)
- a.length에서 . 의 의미는 그 위치로 가라는 뜻이다. (가리키는 곳으로 가라)
- 하나하나 출력하지 말고 항상 반복문을 이용하자.
- 배열에서 사용할 수 있는 반복문인 for each 구문을 이용하자.
- for each에서 '원소자료형 변수'는 자료형 원소의 타입 변소를 넣으면 된다.
- 원소자료형 변수의 의미는 묶음 참조자료형에서 하나씩 데이터를 꺼냈을 때 넣을 그릇을 의미한다.
- 일차원배열일때 Arrays.toStrinig을 이용하자.
5-3. 배열-2차원 배열과 main() 메서드 매개변수
- 2차원 배열의 구조를 이해하는 것이 뒤의 내용들을 이해는 것에 중요하다. ★ ★ ★
- 정방행렬은 행과 열의 수가 같은 것이고, 비정방행렬은 행과 열의 수가 다른 것이다.
- 방법2는 비정방행렬을 나타낼때도 사용하므로 기억하자.
- 방법3인 앞에서와의 차이점은 분리할 수 없다!
- 메모리를 이해하고 있다면 length를 구하는 것은 쉽다.
- 2중 for문을 사용해야 한다.
- a.length와 a[i].length를 왜 사용했는지를 이해하는 것이 중요하다.
- for-each 구문도 결국 2중 for문을 사용해야한다. (a 배열에서 m을 담고 m이 행을 의미하면, 각 열인 n의 값을 담아 출력)
- 만약 string 값에 안녕하세요, 3, 5.8 을 대입해도 이 값들은 string 참조자료형이기 때문에 b+1을 했을 때 4가 아니라 '31' 이 나올 것이다. 즉, string + 숫자는 string이다.
- string값을 가지고 숫자 연산을 하고 싶다면 아래의 tip 함수를 사용하여 정수와 실수로 바꿔주어야 한다.
- Tip
: 문자열 => 정수 - integer.parseInt(문자열)
: 문자열 => 실수 - Double.parseDouble(문자열)
5-4. String 참조자료형
- class는 붕어빵 기계 / 객체는 붕어빵 => 즉, 객체는 여러개이다.
- 생성자의 출력이 객체가 나오는 것이다. (생성자란, 클래스랑 같은 이름이면서, ()가 있는 형태이다.)
- 클래스와 객체를 구분하자.
- String 객체는 값 변경이 불가능하므로 새로운 내용을 설정하려면 새로운 객체를 만들어야한다.
- '='는 값을 대입, 참조값을 그대로 복사하라 라는 의미.
- str1 = "안녕하세요"; => 값을 변경할 수 없으므로 새로운 값인 200번지를 생성하여 안녕하세요 생성
- String str3 = "안녕" 일 때 리터럴로 집어 넣었다. => 리터럴로 만들 때는 리터럴로 만들어진 것중에 같은 것이 있을 때 기존의 것을 재활용한다.
- 리터럴의 값을 재사용하기 위해서 기존의 값을 변경할 수 없는 것.
- 계산 연산의 의미가 아니라, '연결'을 한다는 의미
- 연산은 항상 같은 타입끼리만 연산이 가능하다.
- 즉, 기본자료형 + 문자열 일 때, 기본자료형이 문자열로 변환된다. (업캐스팅이 아님, 자동변환)
- System.out.printIn(1+2+"안녕")은 헷갈리면 안됀다. 3안녕이다. (구분가능해야한다.)
- stataic은 '정적' 이라는 의미이다. => 클래스는 붕어빵 기계인데 static은 기계에 바로 적용할 수 있다는 의미이다.
즉, 그렇게 때문에 String에 바로 . 을 찍을 수 있는 것이다.
https://www.youtube.com/@doit4312/playlists
Do it 자바 완전 정복 동영상 강의
Do it 자바 완전 정복 동영상 강의입니다.
www.youtube.com
위 강의를 참고하여 작성하였습니다.