[혼공자] 2주차_04~05

다율·2024년 1월 14일
1

2024 혼공자

목록 보기
3/7
post-thumbnail

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

선택 미션: p.202 05-2 확인 문제 6번 풀고 정리하기

  • 주석으로 정리해 보았습니다!
package chapter_05;

import java.util.Scanner;

public class Exam06 {

	public static void main(String[] args) {
		// 선택 미션
		
		boolean run = true;
		int studentNum = 0;
		int scores[] = null;
		Scanner sc = 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(sc.nextLine());
			
			if(selectNo == 1) {				// 1. 학생 수 입력
				System.out.print("학생 수 > ");
				studentNum = sc.nextInt();		// 학생 수를 입력받음
				scores = new int[studentNum];	// 받은 학생 수로 점수 배열 생성
			}
			else if(selectNo == 2) {		// 2. 점수 입력
				for(int i = 0; i < studentNum; i++) {
					System.out.print("scores[ " + i + "] > " );	
					scores[i] = sc.nextInt();	// 학생 수 만큼 점수 입력받음
					System.out.println();
				}
			}
			else if(selectNo == 3) {		// 점수 리스트 보기
				for(int i = 0; i < studentNum; i++) {
					System.out.print("scores[ " + i + "] > " );
					System.out.println(scores[i] + "\n");	// 입력받은 점수 출력
				}
			}
			else if(selectNo == 4) {		// 최고 점수, 평균 점수 구하기
				int sum = 0;	// 총합
				int max = 0;	// 최고 점수
				for(int score : scores) {
					sum += score;	// 총합에 점수를 누적
					if(max < score)		
						max = score;	// max보다 클 경우 값을 바꿔줌
				}
				System.out.println("최고 점수 : " + max);
				System.out.println("평균 점수 : " + (double)sum / scores.length);	// 평균점수 구하기
			}
			else if(selectNo == 5) {		// 프로그램 종료
				run = false;	// false로 while문을 빠져나감
			}
		}
		
		System.out.println("프로그램 종료");

	}

}

04 조건문과 반복문

04-1 조건문 : if문

  • 중괄호 블럭은 실행문이 하나일때 생략 가능하지만, 생략하지 말기
if(조건식) {

	// 조건식이 true이면
    안쪽 실행문 실행

}

// 조건식이 false면 
바깥쪽 실행문 실행

if-else문

if(조건식) {

	// 조건식이 true이면
    실행문 실행

}
else {

	// 조건식이 false면
    실행문 실행

}

if-else if-else문

if(조건식) {

	// 조건식이 true이면
    실행문 실행

}
else if(조건식) {

	// if문의 조건식이 false이고, else if문의 조건식이 true이면
    실행문 실행

}
else {

	// 앞선 조건식 모두가 false면
    실행문 실행

}

주사위 예제

Math.random() 연산자 사용하기

  • 원래 0.0 ~ 1.0에 속하는 난수를 return함
  • (int)(Math.random() * 6) + 1 : 1~6까지의 정수를 return
public class IfDiceExample {

	public static void main(String[] args) {
		int num = (int)(Math.random() * 6) + 1;
		
		if(num == 1) {
			System.out.println("1번");
		}
		else if(num == 2) {
			System.out.println("2번");
		}
		else if(num == 3) {
			System.out.println("3번");
		}
		else if(num == 4) {
			System.out.println("4번");
		}
		else if(num == 5) {
			System.out.println("5번");
		}
		else {
			System.out.println("6번");
		}

	}

}

조건문 : switch문

  • if문과 달리 조건식이 아닌 변수의 값에 따라 실행문이 선택됨
switch(변수) {

	case1 :		// 변수가 값1일 경우
   		실행문1
        break;
        
    case2 :		// 변수가 값2일 경우
    	실행문2
        break;
        
	default :		// 변수가 값1, 값2 둘다 아닌 경우
    	실행문3
}

String 타입의 switch문

  • int, char 타입으로도 가능
public class SwitchStringExample {

	public static void main(String[] args) {
		// char, int 타입으로도 switch문 모두 가능
		String position = "학생";
		
		switch(position) {
			case "학생" :
				System.out.println("학생 입니다.");
				break;
				
			case "선생님" :
				System.out.println("선생님 입니다.");
				break;
				
			default :
				System.out.println("학부모 입니다.");
		}

	}

}

04-2 반복문

for문, while문, do-while문

  • 반복문 안에 선언한 변수는 내부에서만 사용 가능함

출처 : 혼자 공부하는 자바

for문 : 구구단 예제

  • 정해진 횟수만큼 반복
public class ForMultiplicationTableExample {

	public static void main(String[] args) {
		for(int i = 2; i <= 9; i++) {
			System.out.println("-------- " + i + "단 ---------");
			
			for(int j = 1; j <= 9; j++) {
				System.out.println(i + " * " + j + " = " + i*j);
			}
		}

	}

}

for문 : 바깥쪽 for문까지 종료하는 예제

  • 조건식이 true일 경우 계속 반복함, break문과 함께 사용함
public class BreakOutterExample {

	public static void main(String[] args) {
    
		Outter: for(char upper='A'; upper <= 'Z'; upper++) {
        
			for(char lower = 'a'; lower <= 'z'; lower++) {
				System.out.println(upper + " - " + lower);
				
				if(lower == 'g') {
					break Outter;
				}
			}
		}
		
		System.out.println("종료");

	}

}

for문 : continue문 사용

  • 홀수일 때 다시 위의 증감식으로 이동함
public class ContinueExample {

	public static void main(String[] args) {
		
		for(int i = 1; i <= 10; i++) {
			if(i % 2 == 1) {
				continue;
			}
			
			System.out.println(i);
		}

	}

}

05 참조 타입

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

기본 타입과 참조타입

  • primitive typereference type으로 불림
  • 기본 타입 변수 8개 제외한 나머지 4가지를 뜻함 (배열, 열거, 클래스, 인터페이스)
  • 참조 타입 변수는 값을 가지고 있는 것이 아니라 주소값을 가짐
// 기본 타입
int age = 18;


// 참조 타입
String name = "다율";

메모리 사용 영역

  • JVM(자바 가상 머신)은 메모리 영역을 을 구분해서 사용함

메소드(Method) 영역

  • JVM이 시작할 때 생성, 모든 스레드가 공유하는 영역
  • 정적 필드, 상수, 메소드 코드, 생성자 코드 등을 분류해서 저장함

힙(heap) 영역

  • 객체와 배열이 생성되는 영역, 스택 영역의 변수나 다른 객체의 필드에서 참조
  • 참조하는 변수나 필드가 없다면 JVM이 쓰레기로 취급하여 자동으로 제거

JVM 스택 영역

  • 메소드를 호출할 때마다 프레임을 추가(push), 종료되면 제거(pop)하는 동작을 수행함
// 예시
char v1 = 'A';

if(v1 == 'A) {
	int v2 = 100;
    double v3 = 3.14;	// v2, v3는 if문을 빠져나가면 없어짐
}

boolean v4 = true;

참조 변수의 ==, != 연산

  • 기본 타입 변수와 달리 동일한 객체를 참조하는지를 비교함 (주소값을 비교)

null과 NullPointerException

  • 스택 영역의 참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null값을 가질 수 있음
  • 그러므로 null값을 가진 참조 변수는 스택 영역에 생성됨

다시 기억을 되살려 보자면.. (stack --참조>> heap)

stackheap
변수와 주소값(번지값)실제 값
  • NullPointerException : 참조 변수를 사용하면서 가장 많이 발생하는 예외(Exception)
// 예시

int[] Array = null; 		// 참조 변수는 null로 초기화가 가능
Array[0] = 10;				// NullPointerException 발생

String 타입

  • 문자열은 String 객체로 생성되고 변수가 그 객체를 참조
  • 문자열 리터럴로 생성하느냐, new 연산자로 생성하느냐에 따라서 비교연산자(==, !=)의 결과가 달라질 수 있음 (주소값을 비교하는 것이기 때문에!)
// 예시

// 문자열 리터럴로 생성 시 : 동일한 String 객체 참조
// 비교 연산자로 비교하면 서로 같다고 나옴
String name1 = "다율";
String name2 = "다율";

// new 연산자로 생성 시 : 힙 영역에 새로운 객체를 만들어 각각 참조
// 비교연산자로 비교하면 서로 다르다고 나옴
String name2 = new String("다율");
String name3 = new String("다율");
  • 그래서 문자열을 비교할 때에는 .equal 연산자로 내부 문자열을 비교하는 연산자를 사용함

05-2 배열

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

배열의 특징

  • 같은 타입의 데이터만 저장할 수 있음
  • 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없음
  • 인덱스 번호는 0부터 시작함

1. 배열 선언

  • null 값으로 초기화 가능
int a[];
double b[];
String c[];

2. 배열 생성

값 목록으로 배열 생성

  • 배열 변수를 미리 선언 한 후에는 중괄호를 사용한 배열 생성이 불가능 (동시에)
  • 메소드의 매개값이 있을 때도 같음, new 연산자 사용하기!
int a[] = {1, 2, 3, 4, 5};
String names[] = {"홍길동", "감자바"};

// 메소드의 매개값이 있을 때
int result = add(new int[] {95, 99, 100})	

new 연산자로 배열 생성

  • 값의 목록은 가지고 있지 않지만, 배열을 미리 만들고 싶을 때 사용 가능
int a[] = new int[3];

a[0] = 1;
a[1] = 2;
a[2] = 3;

배열의 초기값

  • 자동적으로 기본값으로 초기화됨

배열 길이

  • 배열 변수.length : 배열의 길이를 뜻함
// 예시
public class ArrayCreateByValueListExample {

	public static void main(String[] args) {

		int sum = add(new int[] {83, 90, 87});
		
		System.out.println("총합 : " + sum);

	}	// main
	
	public static int add(int scores[]) {
		int sum = 0;
		
		for(int i = 0; i < scores.length; i++) {
			sum += scores[i];
		}
		return sum;
	} // add
}

명령 라인 입력

  • main 메소드의 매개값 String args[]가 왜 필요한지
// 예제 
public class MainStringArrayArgument {

	public static void main(String[] args) {
		if(args.length != 2) {		// 입력 데이터가 2개가 아닐때
			System.out.println("값의 수가 부족합니다.");
			System.exit(0); 		// 프로그램 강제 종료
		}
		
		String strNum1 = args[0];
		String strNum2 = args[1];
		
		int num1 = Integer.parseInt(strNum1);	// 문자열을 정수로 변환
		int num2 = Integer.parseInt(strNum2);
		
		int result = num1 + num2;
		System.out.println(num1 + " + " + num2 + " = " + result);

	}

}
  • 이렇게 파라미터를 주고 실행해보기!

    결과값 : 10 + 30 = 40


다차원 배열

int scores[][] = new int[2][3];

scores.length 		// 2
scores[0].length		// 3

int a[][] = {{1, 2, 3}, {4, 5, 6}};
--------------------------------

// 사진 참고
int scores[][] = new int[2][];
scores[0] = new int[2];
scores[1] = new int[3];

객체를 참조하는 배열

  • 기본 타입이 아닌, 참조 타입 (ex: String 타입)
  • 배열이지만 String 변수와 동일하게 취급해야 함(ex: .equals 사용하기)
public class ArrayReferenceObjectExample {

	public static void main(String[] args) {
		String strArray[] = new String[3];
		strArray[0] = "Java";
		strArray[1] = "Java";
		strArray[2] = new String("Java");
		
		System.out.println(strArray[0] == strArray[1]);
		System.out.println(strArray[0] == strArray[2]);
		System.out.println(strArray[0].equals(strArray[2]));
		
//		true
//		false
//		true
	}

}

배열 복사

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 메소드를 사용함

  • src값은 원본 배열(복사할 배열)이고, srcPos는 원본 배열에서 복사할 항목의 시작 인덱스
  • dest값은 새 배열(붙여넣어질 배열)이고, destPos는 새 배열에 붙여넣을 시작 인덱스
  • length는 복사할 개수 (전체를 복사하려면 원본배열.length)
// 예제
public class ArrayCopyExample {

	public static void main(String[] args) {
		String oldStrArray[] = {"java", "array", "copy"};
		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] + ", ");
		}
		
	}

}

향상된 for문

  • 배열에 대한 반복일 때 사용할 수 있음
  • :을 사용함
// 예시
int scores[]  = {95, 96, 97, 99, 100};
		int sum = 0;
		
		for(int score : scores) {
			sum += score;
		}

05-3 열거 타입

  • 열거 상수 중에서 하나의 상수를 저장하는 타입
public enum Week {		// 열거 타입 이름 : Week
	MONDAY,				// 열거 상수들
    TUESDAY,
    WEDNESDAY,
    FRIDAY
}

Week today;				// 변수 선언
today = Week.FRIDAY;	// 열거 상수 중 저장 가능

열거 타입 선언

  1. 타입 이름 정하기
  2. 해당 이름으로 소스파일(.java)를 생성하기
    • 관례적으로 첫글자만 대문자로, 여러 단어일 경우도 마찬가지
  • 열거 타입 이름과 소스파일 이름은 동일해야 함

  • 열거 상수는 관례적으로 모두 대문자로 작성함

    • 관례적으로 열거 상수가 여러 단어로 구성될 경우 _로 연결함

열거 타입 변수

  • 열거타입 변수 = 열거타입.열거상수; 형태
  • null값도 저장 가능
  • 열거 상수는 열거 객체로 생성됨
Week tomorrow;
Week today = Week.SUNDAY;

System.out.println(today == Week.SUNDAY) 	// true : 같은 객체를 참조하기 때문에

Week week1 = Week.SATURDAY;
Week week2 = Week.SATURDAY;
System.out.println(week1 == week2);		// true

Calendar now = Calendar.getInstance();

  • 제공하는 클래스 (연, 월, 일, 요일, 시간, 분, 초 이용가능)
  • import java.util.Calendar; 하기!
// 예제
import java.util.Calendar;

public class EnumWeekExample {

	public static void main(String[] args) {
		Week today = null;		// 열거 타입 변수 선언
		
		Calendar cal = Calendar.getInstance();
		int week = cal.get(Calendar.DAY_OF_WEEK);		// 일(1) ~ 토(7)의 숫자를 return
		
		switch(week) {
			case 1 :
				today = Week.SUNDAY;
				break;
			case 2 :
				today = Week.MONDAY;
				break;
			case 3 :
				today = Week.TUESDAY;
				break;
			case 4 :
				today = Week.WEDNESDAY;
				break;
			case 5 :
				today = Week.THURSDAY;
				break;
			case 6 :
				today = Week.FRIDAY;
				break;
			case 7 :
				today = Week.SATURDAY;
		}
		
		System.out.println("오늘은 " + today + " 입니다.");
		
		if(today == Week.SATURDAY) {
			System.out.println("일요일에는 교회를 갑니다.");
		}
		else {
			System.out.println("열심히 자바 공부 합니다.");
		}

	}

}

깃허브 링크

https://github.com/dayul/SelfStudy_Java

profile
새싹 개발자 🌱

0개의 댓글