[혼공단12기] 혼자 공부하는 자바 2주차

고운·2024년 7월 13일
0
post-thumbnail

2주차


챕터 04. 반복문과 조건문

4-1 조건문 : if문, switch문

👉🏻 Math.random()으로 임의 정수 뽑기
: Math.random() : 0.0과 1.0 사이의 값을 리턴하므로 다음과 같이하면 범위 사이의 정수를 뽑을 수 있음

1. 0.0Math.random() < 1.0 // Math.random() 메소드의 범위
2. 0.0 * 10Math.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문

  • default : 변수와 동일한 값을 가지는 case가 없으면 default로 가서 실행문을 실행함, 생략 가능
  • break문이 없으면 해당하는 case 값의 실행문부터 밑의 case까지 전부 실행함

4-2 반복문 : for / while / do-while

for문

: 증감식과 조건식 모두 두개 이상이 가능함

while과 do-while

: while문은 조건을 먼저 판별하고 실행문을 실행시키는 반면 do-while은 일단 실행문을 한 번 실행시키고 조건을 판별함


break와 continue

  • break : 가장 가까운 반복문 종료 → 바깥쪽까지 종료시키려면 바깥쪽에 이름을 붙이고 break 이름; 을 붙임
  • continue : for문의 증감식, while/do-while의 조건식으로 이동 → 반복문을 종료하지 않고 계속 수행

챕터 05. 참조 타입

5-1 참조 타입과 참조 변수

💡 기본 타입과 참조 타입

    : 자바의 타입은 기본 타입과 참조 타입으로 분류됨

  • 기본 타입 : 정수 / 실수 / 논리 타입
  • 참조 타입 : 배열 / 열거 / 클래스 / 인터페이스 → String도 참조 타입임!
  • 기본 타입 변수와 참조 타입 변수의 차이점은 저장되는 값임 → 기본 타입은 실제 값을, 참조 타입은 메모리의 번지를 저장함!!

메모리 사용 영역

: JVM이 사용하는 메모리 영역은 크게 3가지로 구분됨

  1. 메소드 영역

    : JVM이 시작할 때 생성되고 모든 스레드가 공유한는 영역

  2. 힙 영역

    : 객체와 배열이 생성되는 영역

    • 참조하는 변수나 필드가 없다면 JVM이 쓰레기로 취급하여 쓰레기 수집기를 실행시켜 자동으로 제거
  3. JVM 스택

    : JVM 스택은 메소드를 호출할 때마다 프레임을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행

참조 변수의 ==, ≠ 연산

: 동일한 객체를 참조하는지 아닌지에 사용

null과 NullPoiniterException

: 참조 변수도 null값을 가질 수 있음 → 스택 영역에 생성

자바는 실행 도중 발생하는 오류를 예외라고 부르는데 참조 변수를 사용하면서 가장 많이 발생하는 오류가 NullPoiniterException

String 타입

  • 문자열은 String 객체로 생성되고 변수는 String 객체를 참조함
  • 문자열 리터럴이 동일하다면 String 객체를 공유

💡객체 생성 연산자 new

: 힙 영역에 새로운 객체를 만들 때 사용하는 연산자

다음의 두 변수는 서로 다른 String 객체를 참조함

String name1 = new String("JAVA");
String name2 = new String("JAVA");
  • 객체에 상관없이 내부 문자열을 비교하고 싶다면 str1.equals(str2)와 같이 equals() 메소드를 사용해야함

5-2 배열

: 같은 타입의 데이터를 연속된 공간에 나열, 각 데이터에 인덱스를 부여해놓은 자료구조

  • 특징
    1. 같은 타입의 데이터만 저장 가능
    2. 한 번 생성된 배열은 길이 변경 불가능

배열 선언

int[] intArr; // 선언 예시 1
int intArr[]; // 선언 예시 2
  • null 값을 가진 상태에서 값을 읽거나 저장하면 NullPointerException 발생

배열 생성

  1. 값 목록으로 배열 생성
    • 값을 변경하고 싶을 때는 대입 연산자를 사용함
    • 값 목록이 나중에 결정되는 경우, new 연산자를 사용
    • 메소드의 매개변수로 배열을 사용할 경우 반드시 new연산자로 값을 전달함
  2. new 연산자로 배열 생성
    • 목록을 가지고 있지는 않지만 향후 값을 저장할 배열을 미리 만들고 싶을 때 new 연산자로 생성
      int[] intArr = new int[5]; 
    • new 연산자로 배열을 처음 생성시 초기값으로 초기화됨 → int형은 0, Stromg은 null로 초기화
    • 대입 연산자로 값을 저장함

배열 길이

: 배열의 길이를 얻으려면 변수.length; 사용, for문에서 유용하게 사용

다차원 배열

  • 2차원 배열은 가로 인덱스와 세로 인덱스 사용하고 3개의 배열 객체를 생성
  • 계단식 구조를 가지고 길이가 다른 2차원 배열을 만들 수 있음
    int[][] scores = new int[2][];
    scores[0] = new int[2];
    scores[1] = new int[3];
    → 잘못 참조하면 ArrayIndexOutOfBoundsException 오류 발생 !!

객체를 참조하는 배열

: String 배열은 String 객체를 참조하므로 문자열을 비교하기 위해서는 대입연산자가 아닌 equals 메소드를 사용해야함

배열 복사

: 배열은 생성 후 크기를 변경할 수 없으므로 더 큰 배열이 필요하다면 더 큰 배열을 만들고 이전 배열을 복사해와야 함

  • for문이나 System.arraycopy() 를 사용하여 복사
    System.arraycopy(arr1, 0, arr2, 0, arr1.length);
    → arr1의 0번 인덱스부터 복사하여 arr1의 길이만큼 arr2의 0번 인덱스부터 붙여넣음

향상된 for문

for ( 타입 변수 : 배열 ) {
	 실행문;
	 }
  1. 배열에서 값을 가져옴
  2. 그 값을 변수에 저장함
  3. 실행문을 실행시킴
  4. 다시 배열로 돌아가 가져올 다음값이 있는지 평가
  5. 있다면 다시 1~3을 반복하고 없다면 for문 종료

  • 확인문제

    1. 💟추가숙제💟

      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;
      			}
      		}
      	}
      }
      1. 문제에서 제공한 형식은 if-else if 형식이었지만 switch문도 가능할 것 같아서 switch문을 사용함

      2. 처음에 다음과 같은 오류가 나타남

        → 공부하면서 본 배열의 길이가 설정되지 않아 발생한 NullPointerException 오류였음!!

        • 오류가 발생한 코드 부분은 다음과 같았다.

          → 그래서 case 1에서 studentNum만큼을 scores 배열의 길이로 지정해줌

      3. 그리고 실행해서 확인해보니 다음과 같이 잘 작동하는 것을 확인

    💡배운 것을 적용해보자

      : case 4에서 향상된 for문의 형식을 사용해보기도 하고 case 3에서도 향상된 for문을 처음엔 적용해보려고하였으나 i가 있어야 출력이 편해질 것 같아 일반 for문을 사용함

      </aside>
      

5-3 열거 타입

: 한정된 값인 열거 상수 중에서 하나의 상수를 저장하는 타입

열거 타입 선언

: 관례적으로 열거 타입의 첫글자는 대문자, 열거 상수는 모두 대문자로 작성하며 여러 단어로 구성될 경우 밑줄을 사용

public enum Week {
	MONDAY,
	TUESDAY,
	WEDNESDAY,
	THURSDAY,
	FRIDAY,
	SATURDAY,
	SUNDAY
	}
  • 열거 타입 : Week
  • 변수 선언 : Week today;
  • 변수값 초기화 : today = Week.FRIDAY; → 열거 타입도 참조 타입이므로 null값 지정 가능!

📅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주차 노션 정리 (모든 확인문제는 여기!)


2주차 소감

우선 기대도 안하고 있었는데 갑자기 기프티콘이 와서 1주차 우수 혼공족에 선정된 것을 알게 되었다. 별 생각 없었지만 막상 선정되니 뿌듯했다. 그래서 괜시리 이번 2주차 내용 정리라던지 문제라던지 조금 더 열심히 정리하고 풀게 되는 것 같았다 ! (우수 혼공족 선정의 순기능 ㅎ)

아무튼 2주차는 조건문과 반복문, 참조 타입에 대해 공부를 진행했는데 조건문과 반복문은 다른 언어할 때도 배웠기도 하고 실제로 코드를 짤 때 지겹도록 사용하는 것이라 개념을 다시 정리하는 겸 공부를 진행했고 노션에 정리하는 것은 4챕터를 진행하며 책에 나와있는 것들 중 모르는 것들 위주로 정리를 하였다.

5챕터는 참조 타입이었고 이 역시 전공강의를 들으며 배웠던 내용인지라 내용이 어렵지는 않았다. 하지만 열거형이라던지 후에 나올 클래스도 다 참조타입이라 확실한 개념정리가 필요해서 열심히 정리했다 !

2주차를 마무리하고 나니 확실히 계획과 목표가 정해져 있는 공부를 하니 성취감과 만족감이 큰 것 같다. 이렇게 혼공족 12기를 순탄히 마무리할 때쯤이면 다른 공부도 이런식으로 계획과 목표를 정해놓고 스스로 공부를 하는 습관을 들일 수 있지 않을까 싶다. 아자아자 파이팅 !~!

profile
컴공 학생입니다 (0_<).

0개의 댓글