Java/혼자 공부하는 자바

[혼공자] 2주차_chapter 4~5

예린lynn 2024. 1. 13. 15:39
728x90

√ 미션

1. 기본 미션 : p. 142 직접 해보는 손코딩(switch문) 실행 후 결과 화면 캡쳐하기

public class SwitchExample {
    public static void main(String[] args){
        int num=(int)(Math.random()*6)+1;

        switch (num){
            case 1:
                System.out.println("1번이 나왔습니다.");
                break;

            case 2:
                System.out.println("2번이 나왔습니다.");
                break;

            case 3:
                System.out.println("3번이 나왔습니다.");
                break;

            case 4:
                System.out.println("4번이 나왔습니다.");
                break;

            case 5:
                System.out.println("5번이 나왔습니다.");
                break;

            default:
                System.out.println("6번이 나왔습니다.");
                break;
        }
    }
}

 
결과:

 
2. 선택 미션 : p.202 05-2 확인 문제 6번 풀고 정리하기
 
6번. 다음은 키보드로부터 학생 수와 각 학생들의 점수를 입력받아서, 최고 점수 및 평균 점수를 구하는 프로그램입니다. 실행결과를 보고 알맞게 작성해보세요.

 
답:

public class Exercise06 {
    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.println("선택> ");

            int selectNo=Integer.parseInt(scanner.nextLine());

            if(selectNo==1){
                System.out.println("학생수> ");
                studentNum=Integer.parseInt(scanner.nextLine());
                scores= new int[studentNum];
            }

            else if(selectNo==2){
                for(int i=0;i<scores.length;i++){
                    System.out.println("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;
                        double avg=0;
                        for(int i=0;i<scores.length;i++){
                            max=(max<scores[i] ? scores[i]:max);
                            sum+=scores[i];
                        }
                        avg=(double)sum/studentNum;
                        System.out.println("최고 점수: "+max);
                        System.out.println("평균 점수: "+avg);
                    }
                    
             else if (selectNo==5) {
                        run=false;
                    }
                }
                
                System.out.println("프로그램 종료");
            }
        }
    }
}

 


Chapter 04 : 조건문과 반복문

1. 조건문 : if문, switch문

조건문은 조건식에 따라 다른 실행문을 실행하기 위해 사용된다. 조건문의 종류로는 if문, switch문이 있다. if문의 조건식은 결과가 true, false이냐에 따라, switch문은 변수의 값에 따라 실행문이 결정된다.
 
1) if문
조건식에는 true 또는 false 값을 산출할 수 있는 연산식이나, boolean 타입 변수가 올 수 있다. 

 
2) if-else문
if문의 조건식이 true이면 if문의 블록이 실행되고, 조건식이 false이면 else 블록이 실행된다. 조건식의 결과에 따라 이 2개의 블록 중 어느 한 블록만 실행하고 전체 if문을 벗어난다.

 
3) switch문
switch문은 변수의 값에 따라 실행문이 결정된다. 

 

2 . 반복문 : for문, while문, do-while문

제어문 블록이 실행 완료되었을 때 조건문일 경우는 정상 흐름으로 돌아오지만, 반복문일 경우는 제어문 처음으로 다시 되돌아가 반복 실행한다. for문은 반복 횟수를 알고 있을 때 주로 사용하고, while문은 조건에 따라 반복할 때 주로 사용한다. while문과 do-while문의 차이점은 조건을 먼저 검사하느냐 나중에 검사하느냐일 뿐 동작 방식은 동일하다.
 
1) for문
for문은 주어진 횟수만큼 실행문을 반복한다.

  • 초기화식은 조건식과 실행문, 증감식에서 사용할 변수를 초기화하는 역할을 한다. 
  • 초기화식에 선언된 변수는 for문 블록 내부에서 사용되는 로컬 변수이다. 
  • 초기화식에 선언된 변수는 for문을 벗어나서 사용할 수 없다.
  • 초기화식에서 루프 카운터 변수를 선언할 때 부동 소수점을 쓰는 float 타입을 사용하면 안 된다.

 
2) while문
while문은 조건식이 true일 경우 계속해서 반복한다. 조건식이 false가 되면 반복 행위를 멈추고 while문을 종료한다.

 
3) do-while문
do-while문은 블록 내부의 실행문을 우선 실행하고, 실행 결과에 따라서 반복 실행을 계속할지 결정한다.

 
4) break문
반복문인 for문, while문, do-while문, switch문을 실행 중지할 때 사용한다.

 
참고로 중첩된 반복문에서 바깥쪽 반복문까지 종료시키려면 바깥쪽 반복문에 이름을 붙이고, 'break 이름;'을 사용해야 한다.

 
5) continue문
continue문은 반복문을 종료하지 않고 계속 반복을 수행한다. 블록 내부에서 continue문이 실행되면 for문의 증감식 또는 while문, do-while문의 조건식으로 이동한다.

 

Chapter 05 : 참조 타입

1 .  참조 타입과 참조 변수

 자바의 타입은 기본 타입과 참조 타입으로 나뉜다. 

  • 기본 타입 : int, byte, char, short, long, float, double, boolean
  • 참조 타입 : 타입, 열거, 클래스, 인터페이스 (String)

1) 기본 타입과 참조 타입
기본 타입은 실제 값을 직접 변수 안에 저장하지만, 참조 타입은 메모리의 번지를 변수 안에 저장한다. 

//기본 타입 변수
int age = 25;
double price = 100.5;

//참조 타입 변수
String name = "신용권";
String hobby = "독서";

 
2) 메모리 사용 영역
JVM은 운영체제에서 할당받은 메모리 영역을 다음과 같이 세부 영역으로 구분해서 사용한다.

 
- 메소드 영역

  • JVM이 시작할 때 생성된다.
  • 모든 스레드가 공유하는 영역이다.
  • 코드에서 사용되는 클래스들을 클래스 로더로 읽는다.
  • 클래스별로 정적 필드와 상수, 메소드 코드, 생성자 코드 등을 분류해서 저장한다.

- 힙 영역

  • 객체와 배열이 생성되는 영역이다.
  • 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다.

- JVM 스택 영역

  • 메소드를 호출할 때마다 프레임을 추가하고, 메소드가 종료되면 해당 프레임을 제거한다.
  • 스택 영역에서 변수가 생성되는 시점은 초기화(최초로 변수에 값이 저장될 때) 될 때이다.
  • 기본 타입 변수는 스택 영역에 직접 값을 가진다.
  • 참조 타입 변수는 스택 영역에 힙 영역의 객체 주소를 가진다.
int[] scores = {10, 20, 30};

 
3) 참조 변수의 ==, != 연산
기본 타입 변수의 ==, != 연산은 변수의 값이 같은지, 아닌지를 조사하는 것이다.
반면 참조 타입 변수들 간의 ==, != 연산은 번지 값이 같은지, 아닌지를 조사하는 것이다. 동일한 객체를 참조하고 있을 경우 == 연산의 결과는 true이고, != 연산의 결과는 false이다.
 
4) null과 NullPointerException
 
- null
참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null 값을 가진다. 이때 null로 초기화된 참조 변수는 스택 영역에 생성된다.

 
- NullPointerException
예외(Exception)란 자바를 실행하는 도중에 발생하는 오류이다.
참조 변수를 사용하면서 가장 많이 발생하는 예외 중 하나인 NullPointerException은 참조 타입 변수를 잘못 사용할 때 발생한다. 예를 들어 null 상태에서 있지도 않은 객체의 데이터나 메소드를 사용하는 코드를 실행하면  NullPointerException이 발생한다.
 
5) String 타입
문자열은 String 객체로 생성되고 변수는 String 객체를 참조한다.
자바는 문자열 리터럴이 동일하다면 다음과 같이 String 객체를 공유한다.

 
- 객체 생성 연산자
이때 new 연산자를 사용해서 직접 String 객체를 생성할 수 있다. 이렇게 힙 영역에 새로운 객체를 만들 때 사용하는 연산자인 new 연산자를 객체 생성 연산자라고 한다.

String name1 = new String("신용권");
String name2 = new String("신용권");

 
- equals() 메소드
내부 문자열을 비교하고 싶을 때에는 String 객체의 equals() 메소드를 사용해야 한다. equals() 메소드는 원본 문자열과 매개값으로 주어진 비교 문자열이 동일한지 비교한 후 true 또는 false를 리턴한다.

//str1 : 원본 문자열, str2 : 비교 문자열
boolean result = str1.equals(str2);

 

2 . 배열

 배열은 같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여해놓은 자료구조이다. 자바에서 배열 변수 선언은 다음과 같이 두 가지 형식으로 가능하다.

//형식 1
타입[] 변수;

//형식 2
타입 변수[];

 
1) 값 목록으로 배열 생성
값 목록이 있으면 다음과 같이 배열 객체를 생성할 수 있다.

타입[] 변수 = {값0, 값1, 값2, ...};

 
이때 배열 변수를 이미 선언한 후에는 다른 실행문에서 중괄호를 사용한 배열 생성이 허용되지 않는다. 만약 배열 변수를 미리 선언한 후 목록들이 나중에 결정되는 상황이면 new 연산자를 사용해서 값 목록을 저장해야 한다.

//컨파일 에러
타입[] 변수;
변수 = {값0, 값1, 값2, ... };

//new 연산자
타입[] 변수;
변수 = new 타입[] {값0, 값1, 값2, ... };

 
2) new 연산자로 배열 생성
값의 목록을 가지고 있지 않지만, 향후 값들을 저장할 배열을 미리 만들고 싶으면 new 연산자로 다음과 같이 배열 객체를 만들 수 있다. 이미 배열 변수가 선언된 경우에도 new 연산자로 배열을 생성할 수 있다.  

//값의 목록 x
타입[] 변수 = new 타입[길이];

//이미 배열 변수가 선언된 경우
타입[] 변수 = null;
변수 = new 타입[길이];

 
3) 배열 길이
길이는 배열이 저장할 수 있는 값의 개수이다. 코드에서 배열의 길이를 얻으려면 다음과 같이 배열 객체의 length 필드를 읽어야 하며, 이때 필드는 객체 내부의 데이터를 의미한다.

배열 변수.length;

 
4) 다차원 배열
자바는 1차원 배열이 서로 연결된 구조로 다차원 배열을 구현하기 때문에 수학 행렬 구조가 아닌 계단식 구조를 가진다. 2차원 배열은 행렬 같은 모양으로, 행과 열을 가진다.

//세로 2, 가로 3
int[][] scores = new int[2][3];

 
위 코드는 다음과 같이 3개의 배열 객체를 생성한다.

 
만약 그룹화된 값 목록을 가지면 중괄호 안에 다시 중괄호를 사용해서 값 목록을 나열한다.

//타입[][] 변수 = {{값1, 값2, ...}, {값1, 값2, ...},...};

int[][] scores = { {95, 80}, {92, 96} };
int score = scores[0][0]; // 95
int score = scores[1][1]; // 96

 
5) 배열 복사
System.arraycopy() 메소드를 이용해서 배열을 복사할 수 있다.

//System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
/**
scr = 원본 배열
srcPos = 원본 배열에서 복사할 항목의 시작 인덱스
dest = 새 배열
destPos = 새 배열에서 붙여넣을 시작 인덱스
length = 복사할 개수
*/

//arr1의 모든 항목을 arr2에 복사
System.arraycopy(arr1, 0, arr2, 0, arr1.length);

6) 향상된 for문
자바는 배열이나 컬렉션을 좀 더 쉽게 처리할 수 있도록 루프 카운터 변수과 증감식을 사용하지 않는 향상된 for문을 제공한다. for문의 괄호 ()에는 배열에서 꺼낸 항목을 저장할 변수 선언과 콜론(:), 그리고 배열을 작성한다.

1. for문이 처음 실행될 때 배열(①)에서 가져올 첫 번째 값이 존재하는지 평가
2. 가져올 값이 존재하면 해당 값을 변수(②)에 저장
3. 실행문(③) 실행
4. 블록 내부의 실행문(③)이 모두 실행되면 다시 루프를 돌아 배열(①)에서 가져올 다음 값이 존재하는지 평가
 

3 . 열거 타입

한정된 값만을 갖는 타입을 열거 타입이라고 한다. 열거 타입은 한정된 값이 열거 상수 중에서 하나의 상수를 저장하는 타입이다.

//열거 타입: Week, 변수 today 선언
Week today;

//Week에서 선언된 7개의 열거 상수 중 하나를 today 변수에 저장
today = Week.FRIDAY;

 
- 열거 타입/상수 이름

  • 열거 타입 이름은 첫 글자를 대문자로 하고 나머지는 소문자로 구성
  • 열거 타입의 이름이 여러 단어로 구성되면 각 단어의 첫 글자는 대문자로 구성
  • 열거 상수가 여러 단어로 구성될 경우에는 단어 사이를 밑줄( _ )로 연결하는 것이 관례  ex) LOGIN_SUCCESS

- 열거 타입 변수
열거 타입은 참조 타입이다. 그렇기 때문에 열거 타입 변수는 null 값을 저장할 수 있다. 또한 열거 상수는 열거 객체로 생성된다.

 
다음 코드는 열거 타입 변수 today가 스택 영역에 생성되고, today에 저장되는 값은 Week.SUNDAY 열거 상수가 참조하는 객체의 번지임을 보여준다. 따라서 열거 상수 Week.SUNDAY와 today의 변수는 동일한 Week 객체를 참조한다.

Week today = Week.SUNDAY;

 

728x90