프로그래밍/TIL(국비과정)

TIL #3 - Java 기초 등

양아무개 2020. 3. 28. 20:53

 

#switch 문

if문은 우리가 조건식을 통해 true면 실행, false 면 실행 안하는 경우였지

만 

switch에서는 변수를 하나 선택해서 

그 변수가 나올 수 있는 가능한 값 ( =케이스)를 만들어서 

그 변수가 해당 케이스를 만족하게 되면 어떤 것을 실행할지 적어주게 된다. 

아래의 코드를 보자. 

public class Ex01Swtich01 {

	public static void main(String[] args) {
		int num = 1;
		// if(num > 0)
		switch (num) {

		case 1:
			System.out.println("1 입니다");
			break;
			// 만약 break가 생략이 되면 
			// 변수가 만족하는 case 코드부터 
			// break가 나올 때까지 아래를 모두 실행한다.
		case 2:
			System.out.println("2 입니다");
			break;
		case 3:
			System.out.println("3 입니다");
			break;
		// 이클립스 자동 들여쓰기는 ctrl + shift + f
		default:
			System.out.println("그 외입니다");
			break;
		}

	}

}

 

switch 안에 num 변수가 들어가 각 case를 거치며 동일한 정수를 찾는다. 

그리고 만약 동일한 case를 찾으면 그곳에서 해당 코드를 작동하고 break를 만나 종료한다. 

만약 break가 없다면 동일한 case와 그 case 밑에 있는 모든 코드를 다 거친 후 종료한다. 

 

#For 문

반복문은 조건식을 test해서 true가 나오면 반복되는 것이다. 

 

반복문은 2+1이 있다. 

for, while, forEach.

for문은 정확하게 몇 회를 반복하라는 의미가 강하다. 

while은 이 조건식이 true 인 동안 계속 반복한다. 

forEach의 경우에는 배열이나 ArrayList 같이 똑같은 자료형이 모여있는 애들을 출력할 때 좋다. 

public class Ex04For {

	public static void main(String[] args) {
		// for 문
		for(int i = 0; i < 5; i++) {
			// i의 현재값 : 0
			// 여기서 i가 5보다 작을 동안 코드가 작동(1씩 증가)해서 
			// i가 4가 되면 for문은 종료된다. 
			System.out.println(i);
		}
		
		// 또 우리가 안에 넣은 i는 굳이 i가 아니어도 된다. 
		// 초기화 값이나 조건식 값도 변수를 넣어줄 수도 있다.
		int standard = 10;
		int startingNum = 6; 
		for(int position = startingNum; position <= standard; position++) {
			System.out.println("standard: " + standard);
			System.out.println("startingNumber : " + startingNum);
			System.out.println("position : " + position);
		}
		// 하지만 전통적으로 for문에 선언되는 변수는 i, j, k 순이다. 
		
	}

}

 

첫번째 for문을 보면, 

for 문 안에 i 변수가 0일 때 부터 시작해서 i++를 만나 1씩 증가되며 5보다 커질 때까지 for문 안의 코드를 반복한다. 

만약 i가 4가 되면 그 때 for 문은 종료한다. 

또한 여담으로 for문 안의 변수는 굳이 i이지 않아도 된다고 한다. 

 

# 팩토리얼을 구하는 프로그램

팩토리얼이란 1부터 n까지의 곱을 말한다. 

import java.util.Scanner;

public class Ex06For {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		int n = scan.nextInt();
		int result = 1;
		// 15!은 int의 범위를 벗어나게 된다.
		// 따라서 15이상의 값을 넣으면 경고 메세지 출력해주자
		if (n < 15) {
			for (int i = 1; i <= n; i++) {
				result *= i;
				System.out.println(result);
			}
		} else {
			System.out.println("범위를 벗어난 숫자입니다. ");

		}
		scan.close();

	}

}

먼저 n의 값을 사용자로 부터 입력받고, 

곱셈이므로 계산 결과를 0이 아닌 1로 초기화 시킨다 ( 0으로 초기화 할 경우 곱셈이기 때문에 어떤 수를 곱해도 0이 나옴)

int 계산은 15를 넘어가면 범위를 벗어나 틀린 값이 나오기 때문에 입력받는 값을 15미만으로 설정한다. 

그리고 입력받은 값 n의 범위를 벗어나지 않는 동안 for문이 돌아가게 한다. 

for 문 안에는 result *= i가 있는데, 

이는 풀어 쓰면 result = result * i이다. 

result는 1부터 시작해서 1씩 증가하는 i 값과 곱해진다. 

 

#다중 for문

for문 안에 또 for문이 있는 형태를 말한다. 

가장 바깥의 for문은 행이 되고 안쪽의 for문은 열이 된다. 

public class Ex07NestedForLoop {

	public static void main(String[] args) {
		// 다중 for loop
		for(int i = 1; i <= 5; i++) {
			for(int k = 100; k <= 105; k++) {
				System.out.print("i의 값 : " + i);
				System.out.println(", k의 값 : " + k);
			}
		}

	}

}

 

#while 문

public class Ex11 {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		

		System.out.print("점수를 입력해주세요 ");
		int score = scan.nextInt();
		
		while(score <= 0 || score >= 100) {
			// score가 0보다 작거나(or) 100보다 크면 올바르지 않음. 
			System.out.println("점수가 올바르지 않습니다. 다시 입력해주세요 ");
			score = scan.nextInt();
		}
		
		if(score >= 90) {
			System.out.println('A');
		}else if(score >= 80) {
			System.out.println('B');
		}else if(score >= 70) {
			System.out.println('C');
		}else if(score >= 60) {
			System.out.println('D');
		}else {
			System.out.println('F');
		}
		
		

	}

}

 

위의 while문을 보면 사용자로 부터 score를 입력받아 score가 0보다 작거나 100보다 큰 

범위에 맞지 않은 score를 받을 경우 true가 되어 while 문 안의 코드를 반복한다. 

제대로 된 score를 입력받아 false가 될 때까지 반복되는 식이다. 

 

이런 while문은 멈출 경우가 없을 시 무한루프에 빠지게 된다. 

while문이 제약없이 계속 true를 나타내게 된다면 while문이 멈출 수 없어 무한정 돌아간다는 의미이다. 

 

#메소드 

메소드란 어떤 값을 주고 그 값을 연산해서 해당 메소드가 리턴된 곳으로 그 결과값을 보내주는 기능이다. 

C에서는 function 혹은 함수라고 부르지만 Java에서는 method라고 부른다 

 

- 메소드 선언

*(접근제한자 static) returnType name(parameter)

접근제한자 : access modifier

접근제한자는 해당 메소드 혹은 필드가 어디서 접근이 가능한지 범위를 적어준다. 

더보기

public < protected < default < private

public : 패키지 외/내부, 다른 클래스 어디서든 호출 가능

protected : 같은 패키지와 상속받은 자식클래스들 호출 가능

default : 같은 패키지 내부에서만 호출 가능, 만약 아무것도 적어주지 않으면 자동으로 적용됨

private : 같은 클래스만 접근가능 

 

*static : 해당 메소드를 메소드 영역에 등록하는 것 

만약 static 메소드가 다른 메소드를 호출하게 되면 그 다른 메소드를 객체 생성해서 호출하는게 아니면 그 다른 메소드도 static이 붙어야 한다

 

*return Type : 해당 메소드가 끝나고 호출 된 곳으로 보내줄 값의 dataType 

만약 우리가 정수 2개를 줘서 그 정수들의 합을 구하는 메소드가 있다고 한다면 해당 메소드의 타입은?

>> Int

하지만 만약 해당 메소드가 아무런 값도 호출된 곳으로 리턴하지 않는다면 void라고 적어줘야한다. 

 

*name : 소문자 + 동사 

nextInt(), nextLine(), print()...

 

*parameter : 이 메소드가 호출될 때 외부에서 보내주는 값으로써 dataType name으로 이뤄져 있다. 

만약 해당 메소드가 호출될 때 아무런 값도 필요없다면 아무것도 적어주지 않아도 된다. 

또, 파라미터는 일종의 변수 취급이 되어 해당 메소드 내부에서는 똑같은 이름의 변수를 생성할 수 없다. 

그리고 메소드를 호출한 곳에서는 굳이 같은 이름으로 값을 보내줄 필요까진 없다. 

 

# 더하기를 해주는 메소드 만들기!

public class Ex16Method {
	
	public static void main(String[] args) {
		// Ex15GradeBook.main(args);
		int userNumber1 = 10; 
		int userNumber2 = 22;
		// 메소드를 호출 할 때는 
		// 파라미터를 메소드에 선언한 그대로 적어줘여한다. 
		// 만약 add(int a, double b)라고 했는데 
		// add(5, 10) 하면 에러다. 
		// 10은 int이지 double이 아니기 때문에...
		
		int result = add(userNumber1, userNumber2);
		// 보내준 값 userNumber1, userNumber2 지만
		// 메소드 내부에서는 a와 b로 이름을 바꾼다. 
		// 근데 일종의 임시 이름으로 쓰이는 거지 실제 이름이 바뀐것은 아니다. 
		// 따라서 우리가 값을 보내줄 때에는 굳이 이름이 안 똑같아도 된다. 
		
		System.out.println(subtract(userNumber1, userNumber2));
		System.out.println(multiply(add(1,2), subtract(2,3)));
		System.out.println(result);
		
	}
	
	public static int add(int a, int b) {
		// 리턴은 return 이라는 명령어를 통해서 한다. 
		return a + b;
	}
	// - * / 까지 만들기 
	
	public static int subtract(int a, int b) {
		return a - b;
	}
	
	public static int multiply(int a, int b) {
		return a * b;
	}
	
	public static int division(int a, int b) {
		return a / b;
	}
	
	public static boolean validate(int score) {
		// return의 특징은 
		// 만나는 순간 해당 메소드가 곧장 종료가 된다는 것이다. 
		if(score > 100 || score < 0) {
			return true; 
			// 여기서 true를 만나면 메소드는 더 나가지 않고 종료된다.. 
		}
		return false;
	}

}