
자바의 데이터 타입은 크게 기본 타입(primitive)과 참조 타입(reference type)으로 분류된다.
이번 장에서는 참조 타입을 다루도록 한다.
참조 타입(Reference type) : 객체(object)의 번지를 참조하는 타입
기본 타입으로 선언된 변수는 값 자체를 저장하고 있지만, 참조 타입으로 선언된 변수는 객체가 생성된 메모리 번지를 저장한다.
//기본 타입 변수
int age = 25;
double price = 100.5;
//참조 타입 변수
String name = "신용권";
String hobby = "독서";
변수들은 모두 스택(stack)이라는 메모리 영역에 생성된다.
기본 타입 변수인 age와 price는 직접 값을 저장하고 있지만, 참조 타입 변수인 name과 hobby는 힙 메모리 영역의 String 객체 번지를 저장하고 이 번지를 통해 객체를 참조한다.
자바에서 사용하는 메모리 영역에 대해 간단히 알아보자.
java 명령어로 JVM이 구동되면 운영체제에서 할당받은 메모리 영역을 다음과 같이 구분해서 사용한다.

메소드(Method) 영역 : 바이트코드 파일을 읽은 내용이 저장되는 영역
힙(Heap) 영역 : 객체가 생성되는 영역
스택(Stack) 영역 : 메소드를 호출할 때마다 생성되는 프레임(Frame)이 저장되는 영역
==, != 연산자는 변수의 값이 같은지, 아닌지를 조사한다.
참조 타입 변수의 값은 객체의 번지이므로 참조 타입 변수의 ==, != 연산자는 번지를 비교하는 것이 된다.
번지가 같다면 동일한 객체를 참조하는 것이고, 다르다면 다른 객체를 참조하는 것이다.
//예제
package Ch05;
public class REferenceVariableCompareExample {
public static void main(String[] args) {
int [] arr1; //배열 변수 arr1 선언
int [] arr2; //배열 변수 arr2 선언
int [] arr3; //배열 변수 arr3 선언
arr1 = new int[] { 1, 2, 3}; //배열{ 1, 2, 3}을 생성하고 arr1 변수에 대입
arr2 = new int[] { 1, 2, 3}; //배열{ 1, 2, 3}을 생성하고 arr2 변수에 대입
arr3 = arr2; //배열 변수 arr2의 값을 배열 변수 arr3의 대입
System.out.println((arr1 == arr2)); //arr1 과 arr2 변수가 같은 배열을 참조하는지 검사
System.out.println(arr2 == arr3); //arr2와 arr3 변수가 같은 배열을 참조하는지 검사
}
}
실행 결과
false
true
위 예제에서 arr1과 arr2에서 생성한 배열은 저장 항목은 같지만 서로 다른 배열 객체로 생성되므로 arr1과 arr2 변수에 대입되는 번지가 다르다. arr3은 arr2 변수의 번지가 대입되었기 때문에 같은 번지를 가진다.
참조 타입 변수는 아직 번지를 저장하고 있지 않다는 뜻으로 null(널) 값을 가질 수 있다.
null도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성된다.
//참조 타입 변수가 null 값을 가지는지 확인하려면 다음과 같이 ==, != 연산을 수행할 수 있다.
String refVar1 = "자바";
String refVar2 = null;
refVar1 == null //결과: false
refVar1 != null //결과: true
refVar2 == null //결과: false
refVar2 != null //결과: true
예외(Exception) : 프로그램 실행 도중에 발생하는 오류
int[] int Array = null;
intArray[0] = 10; //NullPointerException
//배열 변수 intArray에 null을 대입한 상태에서 0인덱스 항목에 10을 대입하면
//intArray가 참조하는 배열 객체가 없어 10을 저장할 수 없기 때문에 NullPointerException이 발생
String str = null;
System.out.println("총 문자 수: " + str.length()); //NullPointerException
//마찬가지로 str변수가 참조하는 객체가 없으므로 문자열의 길이를 구할 수 없기 때문에 예외가 발생한다.
자바는 코드를 이용해서 객체를 직접 제거하는 방법을 제공하지 않는다.
변수에 null을 대입하면 번지를 잃게 되므로 더 이상 객체를 사용할 수 없게 된다.
어떤 변수에서도 객체를 참조하지 않으면 해당 객체는 프로그램에서 사용할 수 없는 객체가 된다.
즉 힙 메모리에는 있지만, 위치 정보를 모르기 때문에 사용할 수 없게 된다.
자바는 이러한 객체를 쓰레기로 취급하고, 쓰레기 수집기(Garbage Collector)를 실행시켜 자동으로 제거한다.
자바의 문자열을 String 객체로 생성된다.
자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 설계되어 있다.
String name1 = "홍길동"
String name2 = "홍길동";
//위의 두 변수에는 동일한 String 객체의 번지가 저장된다.
String name1 = new String("홍길동")
String name2 = new String("홍길동")
//new 연산자는 새로운 객체를 만드는 연산자로 객체 생성 연산자라고 한다.
//new 연산자로 직접 String 객체를 생성해 서로 다른 String 객체의 번지를 가지게 할 수 있다.
//위의 두 변수는 서로 다른 객체의 번지를 가지고 있다.
//예제
package Ch05;
public class EqualsExample {
public static void main(String[] args) {
String strVar1 = "홍길동";
String strVar2 = "홍길동";
if(strVar1 == strVar2){
System.out.println("strVar1과 strVar2는 참조가 같음");
}
else{
System.out.println("strVar1과 strVar2는 참조가 다름");
}
if(strVar1.equals(strVar2)){
System.out.println("strVar1과 strVar2는 문자열이 같음");
}
String strVar3 = new String("홍길동");
String strVar4 = new String("홍길동");
if(strVar3 == strVar4){
System.out.println("strVar3과 strVar4는 참조가 같음");
}
else{
System.out.println("strVar3과 strVar4는 참조가 다름");
}
if(strVar3.equals(strVar4)){
System.out.println("strVar3과 strVar4는 문자열이 같음");
}
}
실행결과
strVar1과 strVar2는 참조가 같음
strVar1과 strVar2는 문자열이 같음
strVar3과 strVar4는 참조가 다름
strVar3과 strVar4는 문자열이 같음
문자열에서 특정 위치의 문자를 얻고 싶다면 charAt() 메소드를 이용할 수 있다.
charAt() 메소드는 매개값으로 주어진 인덱스의 문자를 리턴한다.
//예제
package Ch05;
public class CharAtExample {
public static void main(String[] args) {
String ssn = "9506241230123";
char sex = ssn.charAt(6);
switch (sex){
case '1':
case '3':
System.out.println("남자입니다");
break;
case '2':
case '4':
System.out.println("여자입니다");
break;
}
}
}
실행 결과
남자입니다
문자열에서 문자의 개수를 얻고 싶다면 length() 메소드를 사용한다.(공백을 포함한다)
//예제
package Ch05;
public class LengthExample {
public static void main(String[] args) {
String ssn = "9506241230123";
int length = ssn.length();
if(length == 13){
System.out.println("주민등록번호 자릿수가 맞습니다.");
}
else{
System.out.println("주민등록번호 자릿수가 아닙니다.");
}
}
}
실행결과
주민등록번호 자릿수가 맞습니다.
문자열에서 특정 문자열을 다른 문자열로 대체하고 싶다면 replace() 메소드를 사용한다.
replace() 메소드는 기존 문자열을 그대로 두고, 대체한 새로운 문자열을 리턴한다.
String 객체의 문자열은 변경이 불가한 특성을 갖기 때문에 원래 문자열의 수정본이 아닌 완전히 새로운 문자열을 리턴한다.
//예제
package Ch05;
public class ReplaceExample {
public static void main(String[] args) {
String oldStr = "자바 문자열은 불변입니다. 자바 문자열은 String입니다.";
String newStr = oldStr.replace("자바","JAVA");
System.out.println(oldStr);
System.out.println(newStr);
}
}
실행 결과
자바 문자열은 불변입니다. 자바 문자열은 String입니다.
JAVA 문자열은 불변입니다. JAVA 문자열은 String입니다.
문자열에서 특정 위치의 문자열을 잘라내어 가져오고 싶다면 substring() 메소드를 사용한다.
| 메소드 | 설명 |
|---|---|
| substring(int beginIndex) | beginIndex에서 끝까지 잘라내기 |
| substring(int beginIndex, int endIndex) | beginIndex에서 endIndex 앞까지 잘라내기 |
//예제
package Ch05;
public class SubStringExample {
public static void main(String[] args) {
String ssn = "880815-1234567";
String firstNum = ssn.substring(0,6);
System.out.println(firstNum);
String secondNum = ssn.substring(7);
System.out.println(secondNum);
}
}
실행 결과
880815
1234567
문자열에서 특정 문자열의 위치를 찾고자 할 때에는 indexOf() 메소드를 사용한다.
indexOf() 메소드는 주어진 문자열이 시작되는 인덱스를 리턴한다.
주어진 문자열이 포함되어 있지 않으면 indexOf() 메소드는 -1을 리턴한다.
주어진 문자열이 단순히 포함되어 있는지만 조사하고 싶다면 contains() 메소드를 사용하면 좋다.
contains() 메소드는 포함되어 있으면 true, 그렇지 않으면 false를 리턴한다.
//예제
package Ch05;
public class IndexOfContainsExample {
public static void main(String[] args) {
String subject = "자바 프로그래밍";
int location = subject.indexOf("프로그래밍");
System.out.println(location);
String substring = subject.substring(location);
System.out.println(substring);
boolean result = subject.contains("자바");
if(result){
System.out.println("자바와 관련된 책이군요");
}
else{
System.out.println("자바와 관련없는 책이군요");
}
}
}
실행 결과
3
프로그래밍
자바와 관련된 책이군요
문자열이 구분자를 사용하여 여러 개의 문자열로 구성되어 있을 경우, 이를 따로 분리해서 얻고 싶다면 split() 메소드를 사용한다.
String board = "번호, 제목, 내용, 글쓴이";
String[] arr = board.split(",");
위의 코드처럼 쉼표로 구분된 문자열을 split() 메소드를 호출할 때 쉼표를 제공하면 분리된 문자열로 구성된 배열(array)을 얻을 수 있다.
//예제
package Ch05;
public class SplitExample {
public static void main(String[] args) {
String board = "1,자바 학습,참조 타입 String을 학습합니다.,홍길동";
//문자열 분리
String[] tokens = board.split(",");
//인덱스별로 읽기
System.out.println(tokens[0]);
System.out.println(tokens[1]);
System.out.println(tokens[2]);
System.out.println(tokens[3]);
System.out.println();
//for문을 이용한 읽기
for(int i=0; i<tokens.length; i++){
System.out.println(tokens[i]);
}
}
}
실행 결과
1
자바 학습
참조 타입 String을 학습합니다.
홍길동
1
자바 학습
참조 타입 String을 학습합니다.
홍길동
배열 : 연속된 공간에 값을 나열시키고, 각 값에 인덱스를 부여해 놓은 자료구조
int 배열은 int 타입의 값만 관리하고, String 배열은 문자열만 관리한다.
배열은 생성과 동시에 길이가 결정되고, 한 번 결정된 배열의 길이는 늘리거나 줄일 수 없다.
배열 변수는 참조 변수이다.
배열도 객체이므로 힙 영역에 생성되고 배열 변수는 힙 영역의 배열 주소를 저장한다.
참조할 배열이 없다면 배열 변수도 null로 초기화할 수 있다.
만약 배열 변수가 null 값을 가진 상태에서 변수[인덱스]로 값을 읽거나 저장하게 되면 NullPointerException이 발생한다.
배열에 저장될 값의 목록이 있다면 다음과 같이 간단하게 배열을 생성할 수 있다.
타입[] 변수 = { 값0, 값1, 값2, ---);
//예제
package Ch05;
public class ArrayCreateByValueListExample1 {
public static void main(String[] args) {
//배열 변수 선언과 배열 생성
String[] season = {"spring", "summer", "fall", "winter"};
//배열의 항목값 읽기
System.out.println("seaosn[0] :" + season[0]);
System.out.println("seaosn[1] :" + season[1]);
System.out.println("seaosn[2] :" + season[2]);
System.out.println("seaosn[3] :" + season[3]);
//인덱스 1번 항목의 값 변경
season[1] = "여름";
System.out.println("season[1]: " + season[1]);
System.out.println();
//애별 변수 선언과 배열 생성
int[] scores = {83, 90, 87};
//총합과 평균 구하기
int sum = 0;
for(int i=0; i<3; i++){
sum += scores[i];
}
System.out.println("총합 : " + sum);
double avg = (double) sum / 3;
System.out.println("평균 : " + avg);
}
}
실행 결과
seaosn[0] :spring
seaosn[1] :summer
seaosn[2] :fall
seaosn[3] :winter
season[1]: 여름
총합 : 260
평균 : 86.66666666666667
배열 변수를 미리 선언한 후에는 값 목록을 변수에 대입할 수 없다.
타입[] 변수;
변수 = {값0, 값1, 값2, ---); //컴파일 에러
배열 변수를 선언한 시점과 값 목록이 대입되는 시점이 다르다면 다음과 같이 new 타입[]을 중괄호 앞에 붙여주면 된다. 타입은 배열 변수를 선언할 때 사용한 타입과 동일하게 주면 된다.
변수 = new 타입[] {값0, 값1, 값2, ---);
값의 목록은 없지만 향후 값들을 저장할 목적으로 배열을 미리 생성할 수도 있다.
new 연산자를 다음과 같이 사용하면 배열 객체를 생성시킨다.
길이는 배열이 저장할 수 있는 항목 수를 말한다.
타입[] 변수 = new 타입[길이];
new 연산자로 배열을 처음 생성하면 배열 항목은 기본값으로 초기화된다.
정수 배열은 0, 실수 배열은 0.0, 논리 배열은 false. 참조 배열은 null로 초기화 된다
//예제
package Ch05;
public class ArrayCreateByNewExample {
public static void main(String[] args) {
//배열 변수 선언과 배열 생성
int[] arr1 = new int[3];
//배열 항목의 초기값 출력
for(int i=0; i<3; i++){
System.out.print("arr1[" + i + "] : " + arr1[i] + ", ");
}
//배열 항목의 값 변경
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
System.out.println();
//배열 항목의 변경 값 출력
for(int i=0; i<3; i++){
System.out.print("arr1[" + i + "] : " + arr1[i] + ", ");
}
System.out.println();
//배열 변수 선언과 배열 생성
double[] arr2 = new double[3];
//배열 항목의 초기값 출력
for(int i=0; i<3; i++){
System.out.print("arr2[" + i + "] : " + arr2[i] + ", ");
}
System.out.println();
//배열 항목의 값 변경
arr2[0] = 0.1;
arr2[1] = 0.2;
arr2[2] = 0.3;
//배열 항목의 변경값 출력
for(int i=0; i<3; i++){
System.out.print("arr2[" + i + "] : " + arr2[i] + ", ");
}
System.out.println();
//배열 변수 선언과 배열 생성
String[] arr3 = new String[3];
//배열 항목의 초기값 출력
for(int i=0; i<3; i++){
System.out.print("arr3[" + i + "] : " +arr3[i] + ", ");
}
System.out.println();
//배열 항목의 값 변경
arr3[0] = "1월";
arr3[1] = "2월";
arr3[2] = "3월";
//배열 항목의 변경값 출력
for(int i=0; i<3; i++){
System.out.print("arr3[" + i + "] : " + arr3[i] + ", ");
}
System.out.println();
}
}
실행 결과
arr1[0] : 0, arr1[1] : 0, arr1[2] : 0,
arr1[0] : 10, arr1[1] : 20, arr1[2] : 30,
arr2[0] : 0.0, arr2[1] : 0.0, arr2[2] : 0.0,
arr2[0] : 0.1, arr2[1] : 0.2, arr2[2] : 0.3,
arr3[0] : null, arr3[1] : null, arr3[2] : null,
arr3[0] : 1월, arr3[1] : 2월, arr3[2] : 3월,
배열의 길이란 배열에 저장할 수 있는 항목 수를 말한다.
배열변수.length를 이용해 길이를 얻을 수 있다.
배열변수.length는 읽기만 가능하므로 값을 변경할 수는 없다.
다차원 배열: 배별 항목에 또 다른 배열이 대입된 것
2차원, 3차원 배열의 모양

각 차원의 항목에 접근하는 방법
변수[1차원인덱스][2차원인덱스]...[N차원 인덱스]
배열 변수 선언 시 타입 뒤에 대괄호[]를 차원의 수만큼 붙이고, 값 목록도 마찬가지로 수만큼 중괄호를 중첩시킨다.
//예제
int[][] scores = {
{80, 90, 96}, //1차원 배열의 0인덱스: 첫 번째반 성적
{76, 88} //1차원 배열의 2인덱스: 두 번째만 성적
}
new 연산자로 다차원 배열을 생성하려면 배열 변수 선언 시 대괄호를 차원의 수만큼 붙이고, new 타입 뒤에도 차원의 수만큼 대괄호를 작성한다.
ex) 타입[][] 변수 = new 타입[1차원수][2차원수];
2차원 배열의 길이를 다르게 주고 싶으면 1차원 배열의 길이를 먼저 설정해서 배열 객체를 우선 생성하고, 각각의 항목 값으로 길이가 다른 2차원 배열을 대입하면 된다.
//예제
int[][] scores = new int[2][];
scores[0] = new int[3]; //첫 번째 반의 학생 수가 3명
scores[1] = new int[2]; //두 번째 반의 학생 수가 2명
기본 타입 배열은 각 항목에 값을 직접 저장하지만, 참조 타입 배열은 각 항목에 객체의 번지를 저장한다.
//예제
String[] languages = new String[3];
languages[0] = "JAVA";
languages[1] = "JAVA";
languages[2] = new String("JAVA");
System.out.println( languages[0]== languages[1] ); //true : 같은 객체 참조
System.out.println( languages[0]== languages[2] ); //false : 다른 객체 참조
System.out.println( languages[0].equals(languages[2]) ); //true : 문자열이 동일
배열은 한 번 생성하면 길이를 변경할 수 없다.
더 많은 저장 공간이 필요하다면 더 큰 길이의 배열을 새로 만들고 이전 배열들로부터 항목들을 복사해야 한다.
가장 기본적인 복사 방법은 for문을 이용해 항목을 하나씩 읽고 새로운 배열에 저장하는 것이다.
//예제
package Ch05;
public class ArrayCopyByForExample {
public static void main(String[] args) {
//길이가 3인 배열
int[] oldIntArray = {1, 2, 3};
//길이가 5인 배열
int [] newIntArray = new int[5];
//배열 항목 복사
for(int i = 0; i<oldIntArray.length; i++){
newIntArray[i] = oldIntArray[i];
}
//배열 항목 출력
for(int i=0; i<newIntArray.length;i++){
System.out.print(newIntArray[i] + ", ");
}
}
}
실행 결과
1, 2, 3, 0, 0,
간단한 방법도 있다. System의 arraycopy() 메소드를 이용하면 한 줄만으로도 배열 복사를 할 수 있다.
System.arrayCopy(Object src, int srcPos, Object dest, intdestPos, int length);
//순서대로 원본 배열, 원본 배열 복사 시작 인덱스, 새 배열, 새배열 붙여넣기 시작 인덱스, 복사 항목 수
//arr1을 arr2에 복사하기
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
//예제
package Ch05;
public class ArrayCopyExample {
public static void main(String[] args) {
//길이가 3인 배열
String[] oldStrArray = {"java", "array", "copy"};
//길이가 5인 배열
String[] newStrArray = new String[5];
//배열 항목 복사
System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);
//배열 항목 출력
for(int i = 0; i< newStrArray.length;i++){
System.out.print(newStrArray[i] + ", ");
}
}
}
실행 결과
java, array, copy, null, null,
자바는 배열 및 컬렉션을 좀 더 쉽게 처리할 목적으로 다음과 같은 for 문을 제공한다
for(타입 변수 : 배열){
실행문
}
카운터 변수와 증감식을 사용하지 않고, 항목의 개수만큼 반복한 후 자동으로 for 문을 빠져나간다.
//예제
package Ch05;
public class AdvancedForExample {
public static void main(String[] args) {
//배열 변수 선언과 배열 생성
int[] scores = {95, 71, 84 ,93, 87};
//배열 항목 전체 합 구하기
int sum = 0;
for(int score : scores){
sum = sum + score;
}
System.out.println("점수 총합= " + sum);
//배열 항목 전체 평균 구하기
double avg = (double) sum / scores.length;
System.out.println("점수 평균 = " + avg);
}
}
실행 결과
점수 총합= 430
점수 평균 = 86.0
자바 프로그램을 실행하기 위해 지금까지 main() 메소드를 작성했는데, 여기에서 문자열 배열 형태인 String[] args 매개변수가 왜 필요한지 알아보자.
자바 프로그램을 실행할 때 시작부터 요구하는 값이 있을 수가 있다.
java Sum 10 20
이런 식으로 프로그램을 시작하기 전에 인자를 전달하기 위해 존재하는 것이 String[] args다
데이터 중에는 몇 가지로 한정된 값을 갖는 경우가 있따
예를 들어 요일은 월,화,수,목,금,토,일이라는 7개의 값을, 계절은 봄, 여름, 가을, 겨울이라는 4개의 값을 같는다.
이와 같이 한정된 값을 갖는 타입을 열거 타입(enumeration type)이라고 한다.
열거 타입을 사용하기 위해서는 먼저 열거 타입 이름으로 소스 파일(.java)을 생성하고 한정된 값을 코드로 정의해야 한다.
public enum Week{
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
열거 타입도 하나의 데이터 타입이므로 변수를 선언하고 사용해야 한다.
Week today;
Week reservationDay;
열거 타입 변수에는 열거 상수를 대입할 수 있는데, '열거타입.열거상수'형태로 작성한다.
Week today = Week.SUNDAY
열거 타입은 참조 타입이므로 Week 변수에 null값도 대입할 수 있다.
- 참조 타입에 대한 설명으로 틀린 것은 무엇입니까?
4번 참조 타입은 null 값으로 초기화할 수 없다. -> 있다.
- 자바에서 메모리 사용에 대한 설명으로 틀린 것은 무엇입니까?
3번 참조되지 않는 객체는 프로그램에서 직접 소멸 코드를 작성하는 것이 좋다.
->자바는 코드를 이용해서 객체를 직접 제거하는 방법을 제공하지 않음
- String 타입에 대한 설명으로 틀린 것은 무엇입니까?
2번 String 타입의 문자열 비교는 ==을 사용해야 한다.
-> 문자열 비교는 equals()를 사용
- 배열을 생성하는 방법으로 틀린 것은 무엇입니까?
2번 int[] array; array = {1, 2, 3}
->변수 선언을 미리하면 값을 대입할 수 없다.
- 배열의 기본 초기값에 대한 설명으로 틀린 것은 무엇입니까?
3번 boolean 타입 배열 항목의 기본 초기값은 ture이다. -> false이다.
- 다음은 배열 길이를 출력하는 코드입니다 실행 결과를 작성해보세요
3
5
- 주어진 배열 항목에서 최대값을 출력하는 코드를 작성해보세요(for문 이용)
int[] array = {1, 5, 3, 8, 2};
int max = 0;
for(i=0;i<array.length;i++){
if(max<array[i]){
max = array[i];
}
}
System.out.println("최대값: " + max);
- 주어진 배열 항목의 전체 합과 평균을 구해 출력하는 코드를 작성해보세요(중첩for문 이용)
int[][] array = {
{95, 86}.
{83, 92, 96},
{78, 83, 93, 87, 88}
};
int total = 0;
int cnt = 0;
for(int i=0; i<array.length;i++){
for(int j=0; j<array[i].length; j++){
total = total + array[i][j];
cnt++;
}
}
System.out.println("전체 합: " + total + ", 평균: " + total/cnt);
- 학생들의 점수를 분석하는 프로그램을 만들려고 합니다. 키보드로부터 학생 수와 각 학생들의 점수를 입력받고 while문과 Scanner의 nextLine()메소드를 이용해서 최고 점수 및 평균 점수를 출력하는 코드를 작성해보세요.
package Ch05;
import java.util.Scanner;
public class check9 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int student = 0;
int[] scores = null;
while (true) {
System.out.println("-------------------------------------------------");
System.out.println("1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료");
System.out.println("-------------------------------------------------");
System.out.println("선택> ");
String choice = scanner.nextLine();
if (choice.equals("1")) {
System.out.print("학생수> ");
student = scanner.nextInt();
scores = new int[student];
}
else if (choice.equals("2")) {
for (int i = 0; i < scores.length; i++) {
System.out.println("scores[" + i + "]> ");
scores[i] = scanner.nextInt();
}
}
else if (choice.equals("3")) {
for (int i = 0; i < scores.length; i++) {
System.out.println("scores[" + i + "]: " + scores[i]);
}
}
else if (choice.equals("4")) {
int best = 0;
int total = 0;
for (int i = 0; i < scores.length; i++) {
if (best < scores[i]) {
best = scores[i];
}
total += scores[i];
}
System.out.println("최고 점수: " + best);
System.out.println("평균 점수: " + (double) total / scores.length);
}
else if (choice.equals("5")) {
System.out.println("프로그램 종료");
break;
}
}
}
}