H'academy
  • H'academy
  • Web
    • Back-end
      • Spring Framework
        • Spring 개발환경 구축
          • Project 생성
          • Maven 설정
          • Maven 저장소 위치 설정
          • Apache Tomcat 연동
          • Lombok 설정
        • Spring MVC Project
          • pom.xml
          • web.xml
          • root-context.xml
          • servlet-context.xml
          • DispatcherServlet
        • Controller
          • File Upload / Download
          • RestController(작성중)
        • Spring Test
          • Assert 단정문
          • Spring 환경 연동 테스트
          • MockMvc Test
        • Spring AOP
          • AOP 용어
          • Pointcut Expression
          • Filter
          • Interceptor
          • Filter vs Interceptor
          • Controller Advice(작성중)
        • Spring JDBC
          • DBCP
          • myBatis
            • ResultMap 활용
        • ETC
          • Logging
            • Tomcat Logging 설정
          • Property 관리
          • E-mail
            • Gmail 변경사항
          • Scheduler
          • Websocket
      • Spring Boot
        • STS 다운로드
        • 프로젝트 생성
        • 프로젝트 구조
        • Spring Devtools
        • Spring Controller
          • JSP 연동
            • * JSP 생성불가 문제
            • Spring Boot 3.x
          • Model
          • 요청 파라미터 처리
          • 경로 변수 처리
          • 요청 메소드
          • Redirect
          • Spring Actuator
        • Spring Boot JDBC
          • Database 정보
          • DAO Pattern
          • ORM Framework
            • myBatis
              • Mapper 생성
            • Spring Data JPA
        • Spring AOP
          • AspectJ
          • Filter
          • Interceptor
          • ControllerAdvice
        • REST API
        • Spring WebSocket
        • Send Mail
        • Logging
        • Spring Boot Test
        • Lombok
      • Java EE
        • 개발환경 구성
          • Server와 Client
          • Web Server와 WAS
        • Dynamic Web Project
      • Apache Tomcat
        • Apache Tomcat 구조
        • Tomcat User 생성
        • Tomcat Manager 설정
      • Maven
      • Jenkins
        • Installation
          • Github Webhook 설정
          • Maven 연동
        • Project setting
          • 소스 코드 관리 설정
          • 빌드 유발 설정
          • 빌드 작업 설정
      • OpenAPI(swagger)
        • swagger 2.x (legacy)
        • swagger 3.x (boot)
        • Swagger UI 꾸미기
        • SpringDoc
    • Front-end
      • HTML
        • Heading
        • <A>
        • <IMG>
        • <DIV>
        • <TABLE>
        • <FORM>
          • <INPUT>
          • <SELECT>
          • <TEXTAREA>
          • <FIELDSET>
        • List
      • CSS
        • CSS 적용 방식
          • 크기(size)
            • 픽셀(px)
          • 색상(color)
        • CSS 선택자
          • 스타일 우선순위
        • CSS 주요 속성
          • 크기 속성
            • border
            • margin
            • padding
            • box-sizing
          • 배경 속성
          • 글자 속성
            • font
            • text
          • 배치 속성
            • position
            • display
            • overflow
            • float
            • flexbox
        • CSS Reset
      • JS
        • syntax
          • let, const
          • 구조 분해 할당
          • spread operator
          • Object copy
          • this
          • module
        • jQuery
          • structure
          • function
          • ajax
            • ajax file upload
        • VueJS
          • CDN(Vue3)
            • 기본 구조
            • Vue Devtools
            • jQuery vs VueJS
            • Vue instance
              • data
                • IME issue
              • v-model
              • template
              • computed
              • watch
                • deep watch
                • vs Computed
              • methods
            • Vue directive
              • v-text
              • v-html
              • v-bind
                • v-bind style
                • v-bind class
              • v-on
                • once
                • prevent
              • v-show
              • v-if
              • v-for
          • Vue-cli 3
            • 프로젝트 구조
            • src
              • main.js
              • App.vue
              • HelloWorld.vue
            • Vue Router 4
              • History mode
              • 404 not found
              • Guard
                • beforeEach
            • Vuex
              • 이동 횟수 측정
            • axios
              • interceptor
          • Vue-electron
        • ReactJS
          • CDN(React18)
            • 템플릿 설명
            • JSX
            • render
            • Handling Events
              • onClick
              • onInput
            • Component
              • 클래스 컴포넌트
                • state
                • props
                • event
                  • Mouse
                  • Input
                • lifecycle
              • 함수형 컴포넌트
                • useState
                • useEffect
                • useReducer
                • useMemo
                • props
                • 조건부 렌더링
          • CRA
            • 자원 경로 설정
            • src 절대 경로 설정
            • react-router
            • Context API
            • Electron 설정
        • Webpack
          • NodeJS
          • Git
    • Ubuntu server
      • Jenkins
    • 테스트 도구
      • JMeter
        • Test Plan
        • Test Plan(with login)
        • Plugin 설치
    • WebRTC
  • Base Language
    • Java
      • Java 실행 과정
        • 개발 환경 구축
        • 샘플 코드 작성
        • 컴파일/실행
        • 환경 변수 설정
      • Java 초급
        • Hello world
        • 자료와 정보
        • 변수
          • 정수
            • 정수의 저장 원리
            • 정수형 변수 생성
          • 실수
            • 실수의 저장 원리
            • 실수형 변수 생성
          • 논리
            • 논리형 변수 생성
          • 문자
          • 문자열
            • 문자열 변수 생성
          • 사용자 정의 자료형
        • 연산자
          • 대입 연산
          • 부호 연산
          • 산술 연산
          • 복합 대입 연산
          • 증감 연산
          • 쉬프트 연산
          • 비트 연산
          • 비교 연산
          • 논리 연산
          • 삼항 연산
          • 변환 연산
        • 표준 입출력
          • 표준 출력
          • 표준 오류 출력
          • 표준 입력
            • Scanner 입력
        • 제어문
          • if 구문
            • 단일 조건
            • 두 가지의 조건
            • 여러 가지의 조건
          • switch~case 구문
          • while 구문
          • do~while 구문
          • for 구문
        • 랜덤(Random)
        • 배열
          • 1차원 배열
          • 2차원 배열
          • 다차원 배열
          • Sort
            • 선택 정렬
            • 버블 정렬
            • 삽입 정렬
      • Java 중급
        • 객체 지향 프로그래밍
        • 클래스
        • 인스턴스
        • 필드
        • 메소드
          • 설정(setter) 메소드
          • 반환(getter) 메소드
        • 생성자
        • 접근 제한
          • private
          • package
          • protected
          • public
        • 정적(static)
        • 불변(final)
        • 상수(constant)
        • 상속
          • this와 super의 이해
          • 멤버 변수 설정
          • 멤버 메소드 설정
          • 생성자 설정
        • 추상화
          • 추상 클래스
          • 인터페이스
        • 다형성
        • 중첩 클래스
          • 일반 중첩 클래스
          • static 중첩 클래스
          • 지역 중첩 클래스
          • 익명 중첩 클래스
      • Java API(작성중)
        • java.lang
        • java.util
        • java.text
        • java.time
        • java.io
        • java.net
        • java.sql
        • java.awt
        • javax.swing
      • Java 고급
        • 제네릭(Generic)
        • 열거형(Enum)
        • Annotation Type
          • Retention
          • Target
          • Nested Annotation
        • Java Reflection
          • Intro
          • Class
          • Field
          • Constructor
          • Method
          • Package
      • JDBC
        • 드라이버 로드
        • 연결 생성
          • JDBC Driver 유형
        • JdbcTemplate
      • Java 버전별 변경사항
        • Java 1.8
          • Lambda Expression
          • Stream API
          • java.time 패키지
        • Java 9
        • Java 12
          • switch~case
        • Java 13
          • Text Block
    • Arduino
      • 학습 준비
        • Reference
        • 아두이노 온라인 시뮬레이터
        • 전기의 이해
        • 그라운드(GND)의 이해
      • 개발 환경 구축
        • CH340 보드 설치
        • Editor 글꼴 설정
      • 아두이노 제어
        • 코드의 구성
        • 시리얼 출력
        • 디지털 출력
          • LED 출력
        • PWM 출력
        • 시리얼 입력
        • 디지털 입력
          • PIR 센서
        • 아날로그 입력
          • 온도 센서(LM35DZ)
          • 조도 센서
          • 가스 센서
        • 피에조 부저
        • 서보 모터 제어
          • 시리얼 서보 모터 제어
          • 스위치 서보 모터 제어
        • 온습도 센서(DHT-11)
        • LCD
      • 아두이노 통신
        • 블루투스(Bluetooth)
          • HC-06
            • 온도 센서 활용
          • HM-10
        • 와이파이(Wi-Fi)
          • ESP-01
            • WiFiEsp 라이브러리 추가
            • WiFiEsp 네트워크 스캔
        • 이더넷(Ethernet)
        • ArduinoJson 라이브리 사용
    • Regular Expression
  • Database
    • Oracle
      • 설치
        • SQL Plus
        • SQL Developer
        • DBeaver
        • Docker(Mac OS)
      • SQL
        • 관리자 명령
          • 사용자 관리
          • 권한 관리
          • Encoding 설정
          • 서비스 포트 설정
        • 사용자 명령
          • 테이블 관리
            • 테이블 항목 제약 조건
            • 외래키 제약조건
            • 데이터 유형
          • 시퀀스 관리
          • 데이터 관리
            • 데이터 추가
            • 데이터 조회
              • 오라클 내장 함수
              • 그룹 조회
              • Top N Query
            • 데이터 수정
            • 데이터 삭제
          • 뷰 관리
          • 인덱스 관리
          • 집합 연산
          • 테이블 조인
            • 등가 조인
            • 외부 조인
        • HR 계정
        • 기타 명령
          • 컬럼 간격 조정
      • 내보내기 및 불러오기
        • EXPDP, IMPDP
        • Docker로 실행중인 경우
      • 기타
        • 자동 세션 제거
        • Tablespace 관리
        • Unlock user
  • 면접대비
    • Q&A
      • Java
      • Database
      • Web
      • IT 일반상식
  • ETC
    • Eclipse IDE
      • 설치
      • 화면 설명
      • 환경 설정
      • 프로젝트 생성
      • 소스파일 작성 및 실행
    • Github
      • Github 계정 관리
      • Github 저장소 관리
        • Profile
        • Collaborators
        • Code
        • Issues
        • Pull requests
        • Action
          • Vue 3 Deploy Action
      • Personal Access Token
      • Git ignore 설정
        • Spring 개발용 샘플
      • Github Eclipse 연동
        • Branches
        • Project
        • Team project
          • Dynamic web project
          • Spring Boot Project
          • Branch 생성
          • Pull Request
          • Branch 보호
          • Branch 다시 생성
    • Figma
      • Team
      • Design
      • Component
    • 과정평가형
      • 실기 모의고사 1회
      • 실기 모의고사 2회
      • 실기 모의고사 3회
      • 실기 모의고사 4회
    • VScode
      • Live Server 실행 오류
      • Github 계정 변경
    • Naver ToastUI Editor
      • Editor 만들기
        • Editor options
          • File upload
      • Viewer 만들기
    • 문자 인코딩 방식
    • OBS
      • 녹화 잡음 제거 설정
    • Semantic Version
Powered by GitBook
On this page
  • 1차원 배열
  • 1차원 배열의 생성
  • 1차원 배열의 형태
  • 1차원 배열의 길이
  • 1차원 배열 공간 접근
  • 1차원 배열의 반복
  • 데모 1 : 배열에 10,20,30,40,50 저장
  • 데모 2 : 배열에 랜덤 주사위값 5개 저장
  • 데모 3 : 배열에 이름 5개 입력 및 출력
  • 데모 4 : 배열을 이용한 주사위 눈금 별 횟수 측정
  • 데모 5 : 배열을 이용한 로또 번호 빈도 측정
  • 데모 6 : 배열의 데이터 합계 구하기
  • 데모 7 : 배열 뒤집기
  • 데모 8 : 배열 오른쪽 회전
  • 결론
  1. Base Language
  2. Java
  3. Java 초급
  4. 배열

1차원 배열

1차원 배열

1차원 배열은 변수들을 한 줄로 모아 놓은 형태의 배열을 말한다. 같은 종류의 데이터 여러 개를 저장하기 위해 사용하며 1차원 배열을 사용하는 경우는 다음과 같은 데이터를 저장할 때이다.

  • 반 학생 10명의 시험 점수

  • 아시아 국가들의 나라 이름

  • 프로그래밍 언어 이름

위 데이터들의 공통점은 같은 형태이며 값이 여러 개라는 것이다. 점수는 int가 여러 개, 나라 이름이나 언어 이름은 String이 여러 개인 데이터 형태이다. int가 여러 개일 경우 배열로 int[]라 표현하며, String이 여러 개일 경우 배열로 String[]이라 표현한다.

1차원 배열의 생성

1차원 배열을 생성하는 방법은 다음과 같다

  • 선언 후 생성

  • 선언과 동시에 생성

  • 선언과 동시에 생성 및 초기화

배열을 만들기 위해서는 반드시 데이터의 종류와 개수를 알아야 하며, 한 번 생성된 배열의 크기나 형태는 변할 수 없다. 예시에서는 5개의 정수(10,20,30,40,50)로 데이터를 정한다.

선언 후 생성

int[] arr;
arr = new int[5];

배열은 참조형이며 제어를 위한 참조변수(Reference)와 객체(본체)로 구분된다. 위의 코드에서 첫 번째 줄은 참조변수를 선언하는 코드이며, 두 번째 줄은 객체를 생성하고 참조변수에 연결 설정하는 코드이다. 생성 시 개수를 [] 안에 지정한다.

선언과 동시에 생성

int[] arr = new int[5];

위의 선언 후 생성 코드를 붙여서 사용할 수 있으며, 특징은 같다. new로 생성된 데이터들은 초기값을 가지며, int의 초기값은 0이므로 배열에는 각각 0이라는 값이 설정된 상태이다.

선언과 동시에 생성 및 초기화

int[] arr = new int[]{10, 20, 30, 40, 50};

선언과 동시에 초기화를 수행하는 코드이다. 주의할 사항은 적혀있는 데이터에 의해 개수가 자동 계산되므로 [] 안에 개수를 적으면 안된다는 것이다.

1차원 배열의 형태

int[] arr = new int[5];

위의 코드로 생성된 배열은 다음 형태를 띈다.

참조변수는 stack 메모리에, 실제 배열은 heap메모리에 생성되어 참조변수를 이용하여 제어할 수 있도록 구성된다.

또한 new를 이용하여 신규 생성하며 초기값이 할당되기 때문에 값을 넣지 않았음에도 int의 초기값인 0이 설정되어있음을 확인할 수 있다.

int[] arr = new int[]{10, 20, 30, 40, 50};

생성과 동시에 초기화를 한 경우에는 자동으로 크기가 계산되며 해당 위치에 값이 설정된다.

1차원 배열의 길이

int[] arr = new int[]{10, 20, 30, 40, 50};

다음과 같은 배열이 있을 때, 배열이 5칸이라는 것을 눈으로 보면 알 수 있지만 프로그래밍 상에서 확인해야 하는 경우가 발생할 수 있다. 자바에서는 이러한 상황에 대비하여 배열에 자체적으로 배열의 길이(칸수)를 가지고 있는 변수를 준비해두었으며, 다음과 같이 확인할 수 있다.

System.out.println("arr 길이 : " + arr.length);

그림으로 살펴보면 다음과 같다.

1차원 배열 공간 접근

int[] arr = new int[5];

생성된 배열에 접근하기 위해서는 index를 사용해야 한다. 배열은 참조변수와 index를 결합하여 저장소에 접근한다.

arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
arr[3] = 40;
arr[4] = 50;

주의할 사항은 배열의 위치는 기준점부터 얼마나 떨어져 있는가로 정하기 때문에 +0부터 시작한다는 것이다.

따라서 다음 코드는 오류를 발생시킨다

arr[5] = 60;//배열 범위 초과

출력 역시 마찬가지로 참조변수와 index를 이용하여 접근한다.

System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
System.out.println(arr[4]);

1차원 배열의 반복

배열은 index를 이용하여 접근할 수 있으므로 반복을 통해 일부 또는 전체에 대한 접근이 가능하다.

  • 배열이 1칸이면 index = 0

  • 배열이 2칸이면 index = 0, 1

  • 배열이 3칸이면 index = 0, 1, 2

  • 배열이 4칸이면 index = 0, 1, 2, 3

  • 배열이 n칸이면 index = 0, 1, 2, 3, ... , n-1

위의 규칙에 따라 3칸인 배열을 만들고 출력 반복문을 만들면 다음과 같다.

int[] arr = new int[3];
for(int i=0; i<3; i++){
    System.out.println(arr[i]);
}

칸 수가 변하면 고쳐야 할 곳이 두 군데이기 때문에 수정하기 쉽도록 다음과 같이 바꿀 수 있다.

int size = 3;
int[] arr = new int[size];
for(int i=0; i<size; i++){
    System.out.println(arr[i]);
}

또는 앞서 배운 length 속성을 사용하여 설정할 수도 있다.

int[] arr = new int[3];
for(int i=0; i<arr.length; i++){
    System.out.println(arr[i]);
}

기본적으로 내장된 속성인 length를 사용하면 변수 추가 없이 전체에 접근하는 반복문을 구성할 수 있다.

데모 1 : 배열에 10,20,30,40,50 저장

public class ArrayExample01 {
    public static void main(String[] args){
        int[] data = new int[5];
        
        for(int i=0; i<data.length; i++){
            data[i] = (i+1) * 10;
        }
        
        for(int i=0; i<data.length; i++){
            System.out.println("data["+i+"] = "+data[i]);
        }
    }
}

데모 2 : 배열에 랜덤 주사위값 5개 저장

import java.util.Random;
public class ArrayExample02 {
    public static void main(String[] args){
        Random r = new Random();
        
        int[] data = new int[5];
        
        for(int i=0; i<data.length; i++){
            data[i] = r.nextInt(6) + 1;
        }
        
        for(int i=0; i<data.length; i++){
            System.out.println(data[i]);
        }
    }
}

배열은 일괄 처리가 목적이므로 단위 작업별로 코드가 작성되어야 한다. 즉, 설정→출력→설정→출력이 아니라 설정→설정→출력→출력이 되어야 한다는 것이다. 이해를 돕기 위해 아래 이미지를 첨부해둔다.

데모 3 : 배열에 이름 5개 입력 및 출력

import java.util.Scanner;
public class ArrayExample03 {
    public static void main(String[] args){
        String[] names = new String[5];
        
        Scanner sc = new Scanner(System.in);
        
        for(int i=0; i<names.length; i++){
            names[i] = sc.nextLine();
        }
        
        sc.close();
        
        for(int i=0; i<names.length; i++){
            System.out.println(names[i]);
        }
    }
}

데모 4 : 배열을 이용한 주사위 눈금 별 횟수 측정

import java.util.Random;
public class ArrayExample04 {
    public static void main(String[] args){
        Random r = new Random();
        
        int[] count = new int[6];
        
        for(int i=1; i<=100; i++){
            int dice = r.nextInt(6) + 1;
            count[dice-1]++;
        }
        
        for(int i=0; i<count.length; i++){
            System.out.println("주사위 "+(i+1)+" : "+count[i]+"번");
        }
    }
}

데모 5 : 배열을 이용한 로또 번호 빈도 측정

import java.util.Random;
public class ArrayExample05 {
    public static void main(String[] args){
        Random r = new Random();
        
        int[] count = new int[6];
        
        for(int i=1; i<=100; i++){
            int lotto = r.nextInt(45) + 1;
            count[lotto-1]++;
        }
        
        for(int i=0; i<count.length; i++){
            System.out.println("로또 "+(i+1)+" : "+count[i]+"번");
        }
    }
}

이 예제의 핵심은 코드가 데모 4번과 크게 다르지 않다는 것이다. 배열은 이처럼 데이터 범위나 개수가 늘어나도 코드를 최소한으로 변경하여 확장할 수 있다는 장점을 가지고 있다.

데모 6 : 배열의 데이터 합계 구하기

public class ArrayExample06 {
    public static void main(String[] args){
        int[] score = new int[]{75, 80, 85, 80, 82};
        
        int total = 0;
        for(int i=0; i<score.length; i++){
            total += score[i];
        }
        
        double average = (double)total / score.length;
        
        System.out.println("총점 : "+total+"점");
        System.out.println("평균 : "+average+"점");
    }
}

데모 7 : 배열 뒤집기

public class ArrayExample07 {
    public static void main(String[] args){
        int[] data = new int[]{10, 20, 30, 40, 50};
        
        System.out.println("변경 전");
        for(int i=0; i<data.length; i++){
            System.out.print(data[i]);
            if(i == data.length-1)
                System.out.println();
            else
                System.out.print(",");
        }
        
        for(int i=0, j=data.length-1; i < data.length/2; i++, j--){
            System.out.println("변경 : i="+i+",j="+j);
            int temp = data[i];
            data[i] = data[j];
            data[j] = temp;
        }
        
        System.out.println("변경 후");
        for(int i=0; i<data.length; i++){
            System.out.print(data[i]);
            if(i == data.length-1)
                System.out.println();
            else
                System.out.print(",");
        }
    }
}

배열의 위치를 활용하여 데이터 교체를 통해 배열을 뒤집는 예제이다. 주의할 점은 배열의 절반만큼만 실행해야 하므로 data.length/2로 범위를 설정했다는 것이며, 이처럼 전체적으로 하는 것이 아니라 일부분만 실행하는 경우도 존재한다. 또한 필요하다면 반복문의 반복수를 2개 이상 설정할 수도 있다.

데모 8 : 배열 오른쪽 회전

public class ArrayExample08 {
    public static void main(String[] args){
        int[] data = new int[]{10, 20, 30, 40, 50};
        
        int shift = 1;//회전시킬 칸 수
        
        System.out.println("회전하기 전");
        for(int i=0; i<data.length; i++){
            System.out.print(data[i]);
            if(i == data.length-1)
                System.out.println();
            else
                System.out.print(",");
        }
        
        //shift만큼 회전
        for(int i=0; i<shift; i++){
             //1칸 회전
            int temp = data[data.length - 1];
            for(int k=data.length-1; k>0; k--){
                data[k] = data[k-1];
            }
            data[0] = temp;
        }
        
        System.out.println("회전한 뒤");
        for(int i=0; i<data.length; i++){
            System.out.print(data[i]);
            if(i == data.length-1)
                System.out.println();
            else
                System.out.print(",");
        }
    }
}

위치를 제어하여 배열을 회전시킬 수도 있다. 제일 마지막 데이터를 미리 백업한 뒤 오른쪽으로 한칸씩 옮기고 첫 번째 칸에 백업 데이터를 집어넣는 형태의 코드이다.

결론

배열을 이용하면 다양한 형태의 대량 데이터에 대한 계산이 가능하다. 각종 유형들을 파악해두고 문제 상황에 적용시키면 문제를 쉽게 풀어낼 수 있다.

Previous배열Next2차원 배열

Last updated 3 years ago

출처 : 생활의 달인 - 라면의 달인 편