👉🏻 Math.random()으로 임의 정수 뽑기
: Math.random() : 0.0과 1.0 사이의 값을 리턴하므로 다음과 같이하면 범위 사이의 정수를 뽑을 수 있음
1. 0.0 ≤ Math.random() < 1.0 // Math.random() 메소드의 범위
2. 0.0 * 10 ≤ Math.random() < 1.0 * 10 // 각 항에 10을 곱함
3. (int) 0.0 ≤ (int) Math.random() < (int) 1.0 // 각 항을 정수형으로 캐스팅
4. 0 + 1 ≤ (int) Math.random() + 1 < 1 + 1 // 각 항에 1을 더함으로써 1-10 사이의 정수를 얻음
→ 어떤 값을 곱하고 더하냐에 따라 범위 지정이 가능함
Switch문
for문
: 증감식과 조건식 모두 두개 이상이 가능함
while과 do-while
: while문은 조건을 먼저 판별하고 실행문을 실행시키는 반면 do-while은 일단 실행문을 한 번 실행시키고 조건을 판별함
✅ break와 continue
💡 기본 타입과 참조 타입
: 자바의 타입은 기본 타입과 참조 타입으로 분류됨
메모리 사용 영역
: JVM이 사용하는 메모리 영역은 크게 3가지로 구분됨
메소드 영역
: JVM이 시작할 때 생성되고 모든 스레드가 공유한는 영역
힙 영역
: 객체와 배열이 생성되는 영역
JVM 스택
: JVM 스택은 메소드를 호출할 때마다 프레임을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행
참조 변수의 ==, ≠ 연산
: 동일한 객체를 참조하는지 아닌지에 사용
null과 NullPoiniterException
: 참조 변수도 null값을 가질 수 있음 → 스택 영역에 생성
자바는 실행 도중 발생하는 오류를 예외라고 부르는데 참조 변수를 사용하면서 가장 많이 발생하는 오류가 NullPoiniterException임
String 타입
💡객체 생성 연산자 new
: 힙 영역에 새로운 객체를 만들 때 사용하는 연산자
다음의 두 변수는 서로 다른 String 객체를 참조함
String name1 = new String("JAVA");
String name2 = new String("JAVA");
: 같은 타입의 데이터를 연속된 공간에 나열, 각 데이터에 인덱스를 부여해놓은 자료구조
배열 선언
int[] intArr; // 선언 예시 1
int intArr[]; // 선언 예시 2
배열 생성
int[] intArr = new int[5];
배열 길이
: 배열의 길이를 얻으려면 변수.length; 사용, for문에서 유용하게 사용
다차원 배열
int[][] scores = new int[2][];
scores[0] = new int[2];
scores[1] = new int[3];
→ 잘못 참조하면 ArrayIndexOutOfBoundsException 오류 발생 !!객체를 참조하는 배열
: String 배열은 String 객체를 참조하므로 문자열을 비교하기 위해서는 대입연산자가 아닌 equals 메소드를 사용해야함
배열 복사
: 배열은 생성 후 크기를 변경할 수 없으므로 더 큰 배열이 필요하다면 더 큰 배열을 만들고 이전 배열을 복사해와야 함
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
→ arr1의 0번 인덱스부터 복사하여 arr1의 길이만큼 arr2의 0번 인덱스부터 붙여넣음향상된 for문
for ( 타입 변수 : 배열 ) {
실행문;
}
확인문제
💟추가숙제💟
package quiz.quiz06;
import java.util.Scanner;
public class Exam06 {
public static void main(String[] args) {
// TODO Auto-generated method stub
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());
switch (selectNo) {
case 1:
System.out.print("학생수> ");
studentNum = Integer.parseInt(scanner.nextLine());
scores = new int[studentNum]; // 추가한 코드
break;
case 2:
for (int i =0; i<studentNum;i++) {
System.out.printf("scores[%s]> ",i);
scores[i] = Integer.parseInt(scanner.nextLine());
}
break;
case 3:
for (int i =0; i< studentNum;i++) {
System.out.printf("scores[%s]> %s\n", i, scores[i]);
}
break;
case 4:
int max = 0, sum = 0;
for (int temp : scores) {
sum += temp;
if (temp > max) {
max = temp;
}
}
double avg = (double)sum / scores.length;
System.out.println("최고 점수 : "+max);
System.out.println("평균 점수 : " + avg);
break;
case 5:
run = false;
System.out.println("프로그램 종료");
break;
}
}
}
}
문제에서 제공한 형식은 if-else if 형식이었지만 switch문도 가능할 것 같아서 switch문을 사용함
처음에 다음과 같은 오류가 나타남
→ 공부하면서 본 배열의 길이가 설정되지 않아 발생한 NullPointerException 오류였음!!
오류가 발생한 코드 부분은 다음과 같았다.
→ 그래서 case 1에서 studentNum만큼을 scores 배열의 길이로 지정해줌
그리고 실행해서 확인해보니 다음과 같이 잘 작동하는 것을 확인
💡배운 것을 적용해보자
: case 4에서 향상된 for문의 형식을 사용해보기도 하고 case 3에서도 향상된 for문을 처음엔 적용해보려고하였으나 i가 있어야 출력이 편해질 것 같아 일반 for문을 사용함
</aside>
: 한정된 값인 열거 상수 중에서 하나의 상수를 저장하는 타입
열거 타입 선언
: 관례적으로 열거 타입의 첫글자는 대문자, 열거 상수는 모두 대문자로 작성하며 여러 단어로 구성될 경우 밑줄을 사용
public enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
📅Calendar 클래스
: Calendar.getInstance() 메소드로 Calendar 객체를 얻어오고 다음과 같이 get() 메소드로 각 정보를 추출 가능
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH) + 1 ;
int day = now.get(Calendar.DAY_OF_MONTH);
int week = now.get(Calendar.DAY_OF_WEEK);
int hour = now.get(Calendar.HOUR);
int minute = now.get(Calendar.MINUTE);
int second = now.get(Calendar.SECOND);
2주차 소감
우선 기대도 안하고 있었는데 갑자기 기프티콘이 와서 1주차 우수 혼공족에 선정된 것을 알게 되었다. 별 생각 없었지만 막상 선정되니 뿌듯했다. 그래서 괜시리 이번 2주차 내용 정리라던지 문제라던지 조금 더 열심히 정리하고 풀게 되는 것 같았다 ! (우수 혼공족 선정의 순기능 ㅎ)
아무튼 2주차는 조건문과 반복문, 참조 타입에 대해 공부를 진행했는데 조건문과 반복문은 다른 언어할 때도 배웠기도 하고 실제로 코드를 짤 때 지겹도록 사용하는 것이라 개념을 다시 정리하는 겸 공부를 진행했고 노션에 정리하는 것은 4챕터를 진행하며 책에 나와있는 것들 중 모르는 것들 위주로 정리를 하였다.
5챕터는 참조 타입이었고 이 역시 전공강의를 들으며 배웠던 내용인지라 내용이 어렵지는 않았다. 하지만 열거형이라던지 후에 나올 클래스도 다 참조타입이라 확실한 개념정리가 필요해서 열심히 정리했다 !
2주차를 마무리하고 나니 확실히 계획과 목표가 정해져 있는 공부를 하니 성취감과 만족감이 큰 것 같다. 이렇게 혼공족 12기를 순탄히 마무리할 때쯤이면 다른 공부도 이런식으로 계획과 목표를 정해놓고 스스로 공부를 하는 습관을 들일 수 있지 않을까 싶다. 아자아자 파이팅 !~!