한빛미디어의 <혼자 공부하는 자바>를 요약 정리했습니다.
다음은 키보드로부터 학생 수와 각 학생들의 점수를 입력받아서, 최고 점수 및 평균 점수를 구하는 프로그램입니다. 실행결과를 보고 알맞게 작성해보세요.
import java.util.Scanner;
public class Exam06 {
public static void main(String[] args) {
boolean run = true;
int studentNum = 0;
int[] scores = null;
Scanner scanner = new Scanner(System.in);
while (run) {
System.out.println("----------------------------------------------");
System.out.println("1.학생수 | 2. 점수입력 | 3.점수리스트 | 4.분석 | 5.종료");
System.out.println("----------------------------------------------");
System.out.print("선택> ");
int selectNo = Integer.parseInt(scanner.nextLine());
if (selectNo == 1) {
// 학생 수를 입력받고 배열 scores를 생성
System.out.print("학생수 > ");
studentNum = Integer.parseInt(scanner.nextLine());
scores = new int[studentNum];
} else if (selectNo == 2) {
// scores 배열의 길이만큼 반복하여 점수 입력
for (int i = 0; i < scores.length; i++) {
System.out.print("scores[" + i + "]> ");
scores[i] = Integer.parseInt(scanner.nextLine());
}
} else if (selectNo == 3) {
// 입력된 점수들을 출력
for (int i = 0; i < scores.length; i++) {
System.out.println("scores[" + i + "]> " + scores[i]);
}
} else if (selectNo == 4) {
// 최고 점수와 평균 점수를 계산하여 출력
int max = 0;
int sum = 0;
for (int score : scores) {
if (score > max) {
max = score;
}
sum += score;
}
double avg = (double) sum / scores.length;
System.out.println("최고 점수: " + max);
System.out.println("평균 점수: " + avg);
} else if (selectNo == 5) {
run = false;
}
}
System.out.println("프로그램 종료");
}
}
조건식에 따라 다른 실행문을 실행하기 위해 사용
조건식의 결과에 따라 블록 실행 여부가 결정
if (조건식) {
실행문A
}
실행문B
if문은 else 블록과 함께 사용되어 조건식의 결과에 따라 실행 블록을 선택
if (조건식) {
실행문A
} else {
실행문B
}
실행문C
조건문이 여러 개인 if문
if (조건식1) {
실행문A
} else if (조건식2) {
실행문B
} else {
실행문C
}
실행문 D
변수가 어떤 값을 갖느냐에 따라 실행문이 결정
switch (변수) {
case 값1:
실행문A
break;
case 값2:
실행문B
break;
default:
실행문C
}
어떤 작업이 반복적으로 실행되도록 할 때 사용
똑같은 실행문을 반복적으로 실행해야 하는 경우 사용
for (초기화식; 조건식; 증감식) {
실행문
}
// 초기화식이 필요 없을 경우
int i = 1;
for (; i <= 100; i++) { ... }
// 초기화식, 증감식이 둘 이상
for (int i = 0, j = 100; i <= 50 && j >= 50; i++, j--) { ... }
int sum = 0;
sum = sum + 1;
sum = sum + 2;
sum = sum + 3;
sum = sum + 4;
sum = sum + 5;
System.out.println("1~5의 합: " + sum);
// for문 사용
int sum = 0
for (int i = 1; i <= 100; i++) {
sum = sum + i;
}
System.out.println("1~100의 합: " + sum);
for문은 또 다른 for문을 내포 가능
public class ForMultiplicationTableExample {
public static void main(String[] args) {
for (int m = 2; m <= 9; m++) {
System.out.println("*** " + m + "단 ***");
for (int n = 1; n <= 9; n++) {
System.out.println(m + " x " + n + " = " + (m * n));
}
}
}
}
}
조건식이 true일 경우에 계속해서 반복
while (조건식) {
실행문
}
블록 내부의 실행문을 우선 실행하고 실행결과에 따라 반복 실행을 계속할지 결정
do {
실행문;
} while (조건식)
반복문인 for문, while문, do-while문의 실행을 중지할 때 사용
for ( ... ) {
실행문1;
break;
실행문2
}
반복문이 중첩되어 있을 경우, break문은 가장 가까운 반복문만 종료하고 바깥쪽 반복문은 종료하지 않음
for ( ... ) {
실행문1;
for ( ... ) {
실행문2;
break;
실행문3;
}
실행문4;
}
중첩 반복문에서 바깥쪽 반복문까지 종료시키려면 바깥쪽 반복문에 라벨을 붙이고 break 이름;
을 사용
Label: for ( ... ) {
실행문1;
for ( ... ) {
실행문2;
break Label;
실행문3;
}
실행문4;
}
반복문이 for문, while문, do-while문에서만 사용
for (int i = 1; i <= 10; i++) {
if (i % 2 != 0) {
continue;
}
System.out.println(i);
}
객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스
// refVar1 -> 객체1
// refVar2, refVar3 -> 객체2
refVar1 == refVar2 // false
refVar1 != refVar2 // true
refVar2 == refVar3 // true
null과 NullPointerException
참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있음
NullPointerException
: null 상태에서 객체의 데이터나 메소드를 사용하려 할 경우 발생
문자열은 String 객체로 생성되고 변수는 String 객체를 참조
String 변수;
변수 = "문자열";
// 선언과 동시에 저장
String 변수 = "문자열";
new 연산자(객체 생성 연산자)를 사용해서 String 객체를 직접 생성 가능
String name1 = "신용권";
String name2 = "신용권";
String name3 = new String("신용권");
name1 == name2 // true
name1 == name3 // false
equals()
메소드
동일한 String 객체이건 다른 String 객체이든 내부 문자열을 비교하고 싶은 경우
boolean result = str1.equals(str2);
같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여해놓은 자료구조
score[인덱스]
: 인덱스는 0부터 시작83 | 90 | 87 | 93 | 78 | ... | 75 |
---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | ... | 29 |
타입[] 변수;
타입 변수[];
// example
int [] intArray;
double doubleArray[];
값의 목록을 이미 가지고 있는 경우
타입[] 변수 = { 값0, 값1, 값2, ... };
String[] names = {"신용권", "홍길동", "감자바" };
names[1] = "홍삼원";
배열 변수를 이미 선언한 후에는 다른 실행문에서 중괄호를 사용한 배열 생성이 허용되지 않기 때문에, new 연산자를 사용해서 값 목록을 지정
String[] names;
names = { "신용권", "홍길동", ... }; // error
names = new String[] { "신용권", "홍길동", "감자바" };
값의 목록을 가지고 있지 않지만, 값들을 저장할 배열을 미리 만들고 싶은 경우
타입[] 변수 = new 타입[길이];
int[] intArray = new int[5];
// 배열이 생성되고 나서 특정 인덱스 위치에 새로운 값을 저장
변수[인덱스] = 값;
배열에 저장할 수 있는 전체 항목의 개수
배열변수.length;
// example
int[] intArray = { 10, 20, 30 };
int num = intArray.length; // 3
값들이 행과 열로서 구성된 배열
int[][] scores = new int[2][3];
scores.length // 2
scores[0].length // 3
scores[1].length // 3
int[][] scores = new int[2][];
scores[0] = new int[2];
scores[1] = new int[3];
// 중괄호 사용
int[][] scores = { {95, 80}, {92, 96} };
int score = scores[0][0]; // 95
int score = scores[1][1]; // 96
String[] 배열은 String 객체를 참조
String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "C++";
strArray[2] = "C#";
배열은 한 번 생성하면 크기를 변경할 수 없기 때문에 더 많은 저장 공간이 필요하다면 더 큰 배열을 새로 만들고 이전 배열로부터 항목 값들을 복사
for문으로 배열 복사
int[] oldIntArray = { 1, 2, 3 };
int[] newIntArray= new int[5];
for (int i = 0; i < 0ldIntArray.length; i++) {
newIntArray[i] = oldIntArray[i];
}
System.arraycopy()
메소드
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
src
: 원본 배열srcPos
: 원본 배열에서 복사할 항목의 시작 인덱스dest
: 새 배열destPost
: 새 배열에서 붙여넣을 시작 인덱스length
: 복사할 개수향상된 for문
자바는 배열이나 컬렉션을 좀 더 쉽게 처리하기 위해 향상된 for문 제공
for (타입 변수 : 배열) {
실행문;
}
한정된 값인 열거 상수 중에서 하나의 상수를 저장하는 타입
public enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
today = Week.FRIDAY;
열거 타입
열거 타입을 선언하기 위해서는 열거 타입의 이름을 정하고 해당 이름으로 소스 파일을 생성
열거 상수
Week today;
Week today = Week.SUNDAY;
Week birthday = null;