9. 배열

zza·2023년 9월 15일
0

Java

목록 보기
9/19
post-thumbnail

데이터 타입

※ chap5 - array

참조 타입

  • 기본 타입: 값을 바로 넣을 수 있다.
    정수, 실수, 논리, 클래스가 아닌 것들

  • 참조 타입: 가르키는 것(->). new 연산자를 이용해서 만들어야 한다.

  1. String s = "Hi";
  2. s에 "Hi"의 주소값이 저장된다.("Hi"값 저장 x)

문자열 비교

  • String도 클래스
  • 클래스를 static으로 선언했기 때문에 new 생성자() 사용없이 객체
  • new 생성자() 사용시 데이터 영역에
    - 저장된 내용(값)끼리 비교x
    - 메모리에 저장된 동일한 값을 참조하고 있는지를 판별

▼ equals를 이용하여 값이 같은지를 물어본다.(대소문자 구분)

Java API: 함수 및 기능 검색 가능한 사이트

문자열 조작(메서드)

★length

문제

  1. o
    : 객체 = class
    : 문자열 = String
  1. x
    : 문자열 크기 비교는 안 되고, 같은지 다른지만 비교가능하다. 하지만, 참조하는 곳이 같은지 다른지에 따라 달라지므로 equals를 이용하여 비교한다.
  1. o
    : +를 이용하면 숫자를 알아서 문자열로 바꿔준다.
  1. String.length

배열(Array)

배열이란?

  • 파이썬의 리스트와 비슷

- 스택과 같은 자료구조(last in first out) 중 하나이다.

  • 한번에 모아서 관리하기 위해 배열을 사용한다.

  • 배열의 특징(리스트와 차이점)

    • 동일한 자료형만을 저장할 수 있다.
      ex) score 배열 : int형만 들어갈 수 있다.
    • 순차적이다 = 인덱스 번호가 있다.(0부터 시작)
    • 배열의 길이는 늘리거나 줄일 수 없다.
    • 물리적 위치(배열은 한번에 순차적으로 저장되므로 첫번째 값의 위치만 알면 다음 값의 주소값을 알 수 있다) = 논리적 위치(0다음은 1이 온다)
      ex) score[0] 위치: 100 > [1] 위치: 104
      int형 = 4byte

배열의 필요성

  • 반복문을 사용하여 데이터 관리(데이터 핸들링)를 쉽고 빠르게 처리 가능하다.

  • for문과 함께 자주 사용한다.

배열 선언 및 생성

  • 자료형[ ] 배열이름 = { 값1, 2, 3, ... }

  • 값은 안써도 ok.

  • 대괄호 위치도 상관x

  • 배열 선언 및 초기화 동시에:
    int [ ] arr1 = new int [5];
    int arr2 [ ] = new int [5];
    : 같다.

  • [ * ] 안에는 배열 크기를 지정하거나 인덱스 번호를 넣을 수 있다.
    ex) for문의 i값

  • 2 번은 오류!!

  • 3번이 보편적인 방법

미션(과제)

※chap5 - arraymission
-> Grades, Students / Grades0, Students0/ StudentArray(쌤) / GradeCard, StudentGradeProgram

Q) 학생 성적 프로그램

  • 학생 인원수 입력 받기 : 5
  • 각 학생은 국어, 수학 점수를 가진다.
  • 1번 학생 성적 입력
    - 국어: 50
    - 수학: 70
  • 2번 학생 성적 입력
    .
    .
    .
  • 결과 출력
    - 1번 학생 평균:
    - 2번 학생 평균:

    ...
    - 우리반 평균: **
  • 결과 구현 후 클래스 구현하기

객체 배열 복사


  • 얕은 복사: 주소값만 복사
  • 깊은 복사: 각각 객체 생성(new 사용)

향상된 for문

배열 생성

  • 선언한 배열의 자료형에 맞춰 값이 자동으로 초기화된다.
    ex) int[] numbers = new int[3];
    값을 대입하지 않으면 초기화(0)값이 들어가있다.
  • 멤버변수도 마찬가지로 자동 초기화.
  • 기본형은 초기화값을 선언해야 한다.!!
  • int = 0, double = 0.0, boolean = false

  • 명시적 형변환
  • (cf)묵시적 형변환: 자동형변환

다차원 배열

  • python의 다중리스트와 비슷

  • 이차원 배열은 반복문 2개 필요하다.

예제

Q-1)

※ chap5 - array - CharArray

<Q. 다이어그램 짜고 프로그래밍 하기 >

https://www.drawio.com/

Q-2) 도서 관리 시스템 시나리오

※ chap5 - array - mission2 / -T(쌤)

  1. 도서 등록
  2. 도서 대여
    책 제목 입력: ---
  3. 도서 반납
    책 제목 입력: ---
  4. 도서 목록 조회 : 반복문
  5. 종료

->메뉴 선택: 1
->제목 입력: --------------
->저자 입력: -----
(등록 불가의 경우)
->"도서 등록이 불가능 합니다."

->메뉴 선택: 2
->제목 입력: --------------
-> 대여 완료
(대여 불가의 경우)
->"이미 빌린 책 or 없는 책"

->메뉴 선택: 3
->제목 입력: --------------
->반납 완료
(반납 불가의 경우)
->"도서관에 없는 책"

->메뉴 선택: 4
->책 제목:-----, 책 저자:---ㅡ, 대여가능: true
->책 제목:--!!--, 책 저자:---ㅡ, 대여가능: false

->메뉴 선택: 5
->"프로그램 종료합니다."


-도서번호 <-> 재고상태 위치 바껴야함..ㅠ

  • 어려우면 이 문제라도..!

Q-3) 은행 업무 시스템

※ chap5 - array - mission3

  1. 계좌 생성
  2. 계좌 목록
  3. 예금
  4. 출금
  5. 종료

동적 배열(ArrayList)

  • (유동적)가변하므로 그를 위한 여러 메소드가 제공된다.
  • 일반 배열처럼 물리적,논리적으로 이어져있지 x.
  • 메모리상 어딘가에 각각 위치하고 있으며, 첫번째 인덱스값의 주소가 두번째 인덱스값을 저장하고 있다.(1번이 2번으로 갈 수 있도록)
    :100 | 주소 -> 200 | 주소 .. 다음 주소가 없다면 걔가 arraylist의 마지막이다.

주요 메소드

  • 선언
    : ArrayList<자료형> 이름 = new ArrayList<자료형>();
  • 추가: 이름.add( )
  • 삭제: 이름.remove(인덱스 or object)
  • size = length


-참조타입 = 자료형

문제

  1. int number[ ] = {1,2,3};
    :배열 선언과 동시에 초기화하고자 하면 배열 크기는 비워놓아야 한다.

2.x
: 배열!
정수는 기초형이 맞으나, 정수를 담은 배열이라면 참조타입이다.

  1. array.length

응용

for-each 반복문


메서드의 인수로 배열 전달

메서드 가변 개수 인수

인수 = int...v : int형 변수 몇 개 들어올지 모른다 -> 들어오는 대로 저장 -> 배열이 된다.
p: rintSum 안에서 int형 자료를 저장한 배열v가 된다.
->printSum(1,2,3,4,5), printSum(10,2,03) 모두 가능.

  • 다른 자료형이 들어간 메소드를 사용하고 싶다면: string s, int...v로 사용한다.

객체의 배열

  • null값이 있으므로 nullexception 주의!

매개변수로 객체 전달

문제

  1. x
    : 배열의 모든 위치에 접근하므로 특정 위치,원소에만 접근하려면 일반for문 사용해야 한다,
  1. o
    : 메서드 내의 연산에 따라 결과는 달라질 수 있다. (배열은 참조형이기 때문에 값이 바뀐다.)
  1. public void show ( String...s ) { }
    :show에서만 사용 가능한 배열이 된다.

열거 타입(enum)


▼ 1 -> FEMALE

  • 인수 여러개 저장 가능하나, 이 인수는 변하지 않는다.

  • final과 같은 변하지 않는 상수값이므로 mian밖에서 미리 선언해야 한다. 대문자로 선언.

  • 상수 여러개 쉽게 관리하기 위해 사용한다.
    :가독성과 직관성

  • enum의 변수는 상수이므로 switch문과 사용 가능하다.

문제

! 열거타입 = enum !

  1. o
    :열거 타입 상수 = enum
    :상수 배열 안에 각 인수는 객체 취급한다.

2.o
:객체는 ==이 아니라 비교 메서드를 사용해야 한다.(아니면 오류 가능성 있음)

  1. x
    :fianl은 데이터 영역에 생성된다.
    :데이터 영역에는 만들어지는 변수는 겹칠 수 x.

4.enum

연습문제

  1. 2
    :1. 선언과 초기화 동시에
    3.선언; 후에 값 대입, 4.선언만
  1. 4
    : ''는 char 선언 시 사용
    1. : size는 arraylist의 길이
      : 메서드 호출이기 때문에 ()가 온다.
      : () 없으면 정적 타입???
  1. 2
    : enum에 class는 붙이지 x
  1. false
    : 참조변수 2개 new 생성
  1. 프로그래밍(공백 x)
    : trim() 은 문자열 앞뒤의 공백 제거(중간x)
    : substring(2,9) 인덱스 2-9번까지 자르기 = slicing -> 마지막 인덱스는 포함하지 않는다.
  1. 2 1 3
    : 행 개수
  1. double[ ] d = {1.0, 2.0, 3.0};
  1. java false 1

10 pass

  1. printArray(new int []{1,2,3,4});
    :배열은 객체이므로 new로 선언한다.
profile
zza

0개의 댓글