[구디아카데미] DAY13 연습문제 풀이(5번~8번), 배열

NA YE SOM·2023년 7월 14일
0
  • 평소에 배열에 관련해서 궁금한 점이 많았는데 배열의 메모리 구조를 보면서 이해가 되었던 것 같고, 2진법과 16진법 공부도 따로 해야겠다.

ex05> 월에 따른 계절 (월 % 12)


-> 나눠지지 않으면 그대로 나옴

(다른방법 접근)



-> 특정 범위값이 나옴

ex05_2> 월에 따른 계절

ex06> 월에 따른 분기

(if)

ex06_2() 월에 따른 분기 (분기 계산 : (month-1) / 3 + 1)

(if가 없을때)


-> 0,1,2를 3으로 나누면 몫 0

ex07> 10일 후 요일은?


(금요일 공통점)
-> 7의 배수(나머지가 0이 나옴)

(토요일 공통점)
-> 나머지 1

★ 찾으려고 하는 노력이 있어야함(메모, 펜)-> 적어놓고 찾기!
★ 공통점 찾기

-> 복합연산자 먼저 (day에다가 10 더하기)



->배열이 떠오른다면 switch 필요없음

ex08> 대소문자 변환 (구글링으로 아스키코드 검색 후 참고)





: F(대문자)-> f(소문자)

(ex) 소문자 -> 대문자 : -32

대문자 : 65~90 사이의 값 , 소문자 : 97~ 122 사이의 값


-> 뭐가 들어갈 지 모르는 상황 : 검사부터 하기





배열

변수가 다르면 원래 이름이 다르지만, 이름을 하나의 이름으로 통일

일반변수는 int n 하면 쓸 수 있었음

배열은 1. 선언 하고 2. 만드는 2가지 과정이 필요함

-> int만 저장할 수 있는 타입


2) int 배열명[] : c언어 계열에서 나온 것

  • 자바 : C++ 특징 가져와서 만든 것
  1. 배열 생성 : 변수의 갯수를 결정하는 것

    -> 몇개의 방을 만들건지 적어줌

-> 공통점 : 값이 없다

a라는 이름의 변수가 5개 생김

-> 첫번째 배열 요소

5개의 int값이 0으로 나오는지 확인하기!



-> 배열의 인덱스 범위 벗어났음


-> 배열의 선언과 생성을 한번에 처리할때) 문장을 모아서


-> for문 연속된 숫자를 반복하는 반복문


배열에 저장되는 갯수 '5'이면 i<'5'랑 같다


-> length를 동일한 숫자가 들어가야 하는 자리에 변수로 맞춰줌


-> 인덱스의 시작은 0(int i = 0) 바꾸면 안됨

대괄호[] =bracket

변수에 저장해놓고 쓸수도 있지만, 배열명.length로 알아낼 수도 있음

*for문 되는 이유?
1. 이름이 같음
2. 인덱스 값 숫자가 달라서


(이름이 다르니까 for문 돌릴 수 없음)

-> 이름은 동일하게 하고 숫자는 for문으로 만들면 됨



-> 실제 사용시) 순차적으로 접근할 수 있게끔

-> 배열 생성시) 배열의 길이가 얼마인지 담겨있음 : 필드(field)
-> 필드값 : 5

개발자 암묵적 약속임
- 인덱스의 변수이름은 i부터 시작한다
-> 인덱스가 아니면 i이름은 가급적 쓰지 않는것이 좋다
-> i를 못쓰는 상황 j를 쓴다

배열의 초기화




-> 최초 배열을 선언할때만 사용가능


-> 값을 안바꿀 때 초기화 많이 함


-> 목요일은 6(default값)
-> case 0 :인덱스
-> case 0 : 금요일


-> 24일이 만들어진 상태


-> 나머지가 0이 나오면 : 금요일


day % 7 인덱스로 쓰기

★ 숫자를 0부터 만들어내려는 것 : 배열때문인 경우가 많음
-> 배열자체가 분기문을 없애줘서 편하게 쓸 수 있음


-> 봄,여름,가을,겨울도 index로 지정해서 풀 수 있음

배열의 메모리 구조

int : 기본타입(primitive type)
int []: 참조타입(reference type) - 주소를 저장


-> 배열은 따로따로 있지 않고 순서대로 모여있음(for문 ,인덱스 사용할 수 있는 이유)

int 방하나 : 4byte
숫자 차이 4씩 차이남

-> 연속된 공간을 사용함
-> 첫번째 요소 위치를 알면 모든 요소의 위치를 알 수 있음

  • 인덱스 : 얼마나 떨어져있는지에서 파생됨 (상대위치)
    (배열의 이름은 첫번째 주소 이름밖에 모름)

-> @ : at(~에 있는)


-> 메모리 참조값 나옴 (3d012ddd) -> d포함(16진수라는 뜻임)

16진수 : 숫자 10 + 알파벳 6개(abcdef)

★ 2진법, 16진법 공부해두기!


-> 오류 남(생성을 안해서- 길이를 안알려줘서)

  • 배열이름의 주소만 옮기는것 (a 배열의 주소 - > b 배열로 옮기는것)
    같은 배열을 공유하는 2개의 이름이 생김



->원래는 a것인데 b가 사용할 수 있게 됨

  • 자바는 메모리 영역을 건드릴 수 없게 되어있음(개발자는 메모리 관리 할 없음)
  • 많은 영역에서 메모리 조작할 수 있게 됨


-> new : 메모리 공간 확보해라
-> 메모리 풀어주지 않으면 컴퓨터가 느려짐

(new -> delete라는 명령으로 해제도 시켜줘야함)

-> 없애는 건 자바가 알아서 함(만드는 것만 함)
-> 메모리 못 쓰는 것 : 메모리누수

메모리 누수


->배열의 길이를 늘릴 수 없음(구조적으로는)

-> 새로만들어야 함 (원래 있던 것 다시 옮기기)


: 3개짜리 -> 5개짜리로 이동


-> for로 해보기

자바가 해주는 기능을 가지고 있음


system 클래스 (첫 문자 대문자)


-> a배열의 모든 것을 b로 복사

object src 기존배열
object pos 인덱스 0부터

목적지

ctrl 키 + 클릭 : arrycopy가 어떻게 만들었는지 소스 보여줌
(시스템 class안에 있는 기능을 불러온것)


-> a인덱스 0부터 3개만 보내면 됨

-> a배열 다 보내는 것 (목적)


-> 새메모리 공간 5개 만드시오


-> 아직 a는 3개, b는 5개



-> 배열 a가 5개로 늘은 것


->1번지에 가면 데이터가 3개 있다는 정보를 모른다

-> 아무도 모르는 "메모리 누수"영역이 됨
1번지에 데이터 3개 있었는데 a가 참조한 값이 2번지로 바뀜


new로 잡음 , 초기화로 해도 내부에서 new로 잡음



a = b; 전에 a 반납하고


garbage collector 가 혼자 돌음 -> 다른 프로그램들도 3개의 공간 사용할 수 있도록 풀어줌

System.gc()
- garbage collector 개발자가 직접 부르겠다

->부른다고 오지는 않고 재촉하는 개념(실행순서를 높여줌)


-> 배열의 주소가 나옴


-> 배열 a를 출력할 수 있는 형태로 자동으로 만들어주는 기능

profile
개발자 velog

0개의 댓글