1. 등급을 입력하여 유효성 검사를 하고 입력을 잘못하면 알림 메시지를 출력한 뒤 다시 입력을 받도록 하기
코드 1)

코드 2) 실수 횟수 + 5번 실수시 프로그램 종료 기능 추가

2. 우편번호 유효성 검사하기
- 우편번호를 입력받아서 입력 받은 값이 우편번호이면 '우편번호 O'를 출력하고, 아니면 '우편번호 X'를 출력하기
우편번호 예시) 000-000 또는 00000
코드)

☞ 참고
String matches(String regex)정규표현식 패턴 관련 : Java API Doc 참고하기
https://docs.oracle.com/javase/8/docs/api/index.html
Java Platform SE 8
docs.oracle.com
// [표현하고싶은 값] = [표현패턴]
// [123456789] = [0-9]
// [234678] = [2-4[6-8]] == 234 또는 678
// [2345] = [0-9&&[2-5]] == 교집합
3. 유효성 검사와 관련된 패턴 예시
1) 주민등록번호 유효성 검사하기
예시) 000000-0000000
- String regex = "\\d{6}-\\d{7}";
2) 국어점수 유효성 검사하기

4. 메서드(함수) 설명
* - 메서드는 main() 메서드 밖에서 선언해야한다.
*
* 1. 메서드 정의?
* 프로그래밍에서 [반복되는 명령어들]을 찾아서 별도로 묶어 필요할 때 마다 불러서 사용할 수 있도록 하는 것
*
* 2. 프로그램의 구조화 -> 코드 가독성 좋아 유지 보수 용이
*
* 3. 반복되는 코딩 -> 구조화 : '메서드로 만들어서' (재사용 코딩)
*
* 4. 함수가 기본이 되는 프로그래밍 방식을 구조적 프로그램 언어 : C언어
*
* 5. 객체가 기본이 되는 프로그래밍 방식을 객체 지향적 프로그래밍 언어 : Java, 요즘 대부분 언어
*
* 6. 메서드(함수) 선언 형식
* [접근제어자] [기타제어자] 리턴자료형 메서드명([매개변수..]) => 메서드 선언부(프로토 타입 prototype)
* { 메서드 몸체(body) => 메서드 구현부
* // 코딩
* [return] [리턴값];
* }
*
* 7. 메서드 생성/사용시 3가지 이해
* ㄱ. 기능 - 메서드명 작명 : 라인(선) 긋기(출력)하는 기능 drawLine
* ㄴ. 매개변수 - X 없다
* ㄷ. 리턴값/리턴자료형
* X void
* [접근지정자] [기타제어자]
* public static
*
* 8. 반복적인 코딩 -> 라인 긋기(50줄) -> 메서드 선언 + 사용
*
* 9. 메서드 사용시 장점
* ㄱ. 코드량이 줄어든다. -> 컴파일 용량 줄어든다. -> 실행 성능 향상(빨라짐)
* ㄴ. 코드 가독성이 좋아지고, 유지 보수 용이
* ㄷ. 팀 작업 -> 개발 생산성 향상 -> 수익 Good
*
* 10. 메서드 작성(구현) - [days06.Ex06_02.isLeapYear() 메서드 선언]
* 1) 윤년 체크 반복 발생 - 윤년 체크 메서드 선언 후 재사용
* 2) 기능 : 윤년체크하는 메서드 > isLeapYear
* 매개변수 : 체크할 년도 > int year
* 리턴값+리턴자료형 :
* - int return -1; return 1; if( ==1) // 윤년이다.
* - void syso("평년"); syso("윤년"); 재사용 X
* - String return "평년"; return "윤년"; if( .equals("윤년")
* - *** boolean 윤년 true 평년 false; if(메서드명()) {}
*
* 11. 메서드(함수)명은 똑같고, '매개변수 갯수', '타입이 다른' 또 다른 함수를 중복해서 선언할 수 있다.
* -> 중복함수([오버로딩] 또는 오버로드) [Overloading], Overload ***
* 왜? 똑같은 메서드(함수)명으로 여러개 중복 선언합니까? 나중에 배우게 될 부분!
코드)


5. 메서드를 매개변수를 사용해서 호출할 때의 방법
1) Call By Name - 매개변수는 없이 메서드 이름만 가지고 메서드를 호출하는 방법(ex. drawLine)
2) Call By Value - 매개변수에 실제 값(Value)을 가지고 메서드를 호출하는 방법(ex. drawLine(n) / (ex. drawLine(30))
3) Call By Point - 자바에서 사용 X (C에서만 사용)
4) Call By Reference - 참조형(배열, 클래스, 인터페이스)을 가지고 메서드를 호출하는 방법
6. 다양한 메서드 선언하기
6-1) 두 정수의 합을 구해서 리턴하는 메서드
public class Ex03 {
public static void main(String[] args) {
// 두 정수의 값을 입력받아서 두 정수의 합을 출력하는 코딩
int x,y;
Scanner sc = new Scanner(System.in);
System.out.print("두 정수(x,y) 값 입력하세요: ");
x = sc.nextInt();
y = sc.nextInt();
// int z = x + y;
int z = sum(x, y);
System.out.printf("%d + %d = %d\n", x, y, z);
} // main
// 두 정수의 합을 구해서 리턴하는 메서드 선언
public static int sum(int x, int y) {
// int result = x + y;
return x + y;
}
} // class
6-2) 스캐너를 사용해서 입력받은 점수 값을 유효성 검사 후 반환하는 메서드
public class Ex04 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// int kor = getScore("국어", scanner);
int kor = getScore();
System.out.println(kor);
// int eng = getScore("영어", scanner);
int eng = getScore();
System.out.println(eng);
} // main
// [문제]
// 스캐너를 사용해서 점수 유효성 검사 후 입력받아서 반환하는 메서드 선언
// 1. 유효성 검사(0~100)
// 2. 재사용이 가능한가..? > 매개변수에 String subject를 추가하여 해결 > 모든 과목에 사용 가능!
public static int getScore(String subject, Scanner scanner) { // Scanner scanner = main 안에 있는 scanner 변수;
// Scanner scanner = new Scanner(System.in);
// 성능이 떨어짐 : 메서드를 호출할 때 마다 scanner를 호출하는 격(망치질을 하려고 망치 사와서 버리고 내일 또 사와서 버리는 꼴!)
int kor;
String sKor;
String regex = "100|[1-9]?\\d";
do {
System.out.print(subject + "점수를 입력하세요: ");
sKor = scanner.next();
} while (!sKor.matches(regex));
kor = Integer.parseInt(sKor);
return kor;
}
// 임의로 점수를 생성해주는 메서드
public static int getScore() {
return (int)(Math.random()*101);
}
} // class
6-3) 윤년/평년을 확인하는 메서드
public class Ex06_02 {
public static void main(String[] args) {
int year;
String sYear;
String regex = "\\d+";
Scanner sc = new Scanner(System.in);
do {
System.out.print("> 년도를 입력하세요: ");
sYear = sc.next();
} while ( !sYear.matches(regex));
year = Integer.parseInt(sYear);
if (isLeapYear(year)) { // [메서드 호출 부분] : 메서드를 호출한 부분에는 리턴값이 나온다.
System.out.println("윤년(leap year)");
} else {
System.out.println("평년(common year)");
}
} // main
// [메서드 선언 위치]
// 윤년 true, 평년 false;
public static boolean isLeapYear(int year) {
if (year % 100 != 0 && year % 100 != 0 || year % 400 == 0) {
return true;
} else {
return false;
}
} // isLeapYear [method == function] == procedure
} // class
6-4) 두 개의 값을 교환하는 메서드(swap) : Call By Reference
- 아래의 코드를 보면 메서드를 선언하고 호출을 하면 swap 메서드 안에서는 x, y의 값은 교환이 되었는데 main 메서드 안에 있는 x, y값은 그대로인것을 확인 할 수 있다. 왜 그런지 다음 코드와 설명을 통해서 확인할 수 있다.

위에서 언급한 문제점은 참조형(배열, 클래스, 인터페이스)매개변수를 통해 호출을 해야 해결이 가능하다.
먼저 메서드를 선언하고 호출한 코드는 아래와 같다.
코드)
public class Ex05_02 {
public static void main(String[] args) {
// 배열을 통해 값을 초기화
int[] m = {10, 20};
// 스택영역 힙영역(10, 20)
// 힙영역과 스택에 동시에 저장이 되고
// [10][20] [시작주소참조]m
// 시작주소 100번지
// swap 메서드에서는 주소를 통해 실제 값을 찾아 오는건가요
// swap(m) : m 참조형(배열) 매개변수로 메서드 호출 방법 : Call By Reference
// swap(100번지)
// void swap(int[] m) { [100번지]m }
System.out.printf("x=%d, y=%d\n", m[0], m[1]);
// 실제 값으로 호출하는 Call By Value 로는 실행 X -> 참조형 Call By Reference
swap(m); // 참조형(배열, 클래스 인터페이스)을 매개변수로 메서드 호출 : Call By Reference
System.out.printf("x=%d, y=%d\n", m[0], m[1]);
} // main
public static void swap(int[] m) {
int temp = m[0];
m[0] = m[1];
m[1] = temp;
}
} // class
Heap 동적 영역에 있는 주소(실제 값이 있는 곳)를 main() 메서드와 swap() 메서드의 Stack 영역이 참조(주소 참조)를 하게되어 같은 값을 가지게 된다. swap 함수는 실행 후 swap Stack 영역에 있는 값은 사라지고 main에 Stack 영역에 있는 값만 남게 된다.
아래 그림을 살펴보면 이해하는데 도움이 될 것 같다.
new를 통해 생성한 배열의 값은 Heap(동적) 영역에 저장이 되고, 메서드 안에 배열명으로 호출하는 코드들은 모두 Heap(동적) 영역에 있는 주소를 참조하는 Stack 영역이다.

7. 재귀호출(recursive call) == 재귀함수 == 재귀호출함수
- 재귀 호출 함수란?
메서드 안에서 자기 자신을 다시 호출하는 것을 "재귀 호출"이라고 하고,
재귀 호출을 하는 함수를 재귀 호출 함수라고 한다.
코드 예시) 무한루프에 빠지므로 실행하지 않는 것을 권장!
public class Ex06 {
public static void main(String[] args) {
disp(); // 메서드 호출 부분
} // main
// 재귀 호출
// 재귀 호출 메서드(함수) -> 아래 disp() 메서드는 무한루프에 빠짐
private static void disp() {
System.out.println("disp() 메서드가 호출된다.");
disp(); // 메서드 호출 부분
}
} // class
코드) 1~n까지의 합을 구하는 메서드와 재귀함수
public class Ex06_02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// int result = sum(10);
int result = recursiveSum(10); // 재귀함수
System.out.println(result);
} // main
// return 10 + 9 + recursiveSum(7)... + recursiveSum(1)
// 10+9+8+7+6+...+1
// 재귀함수
private static int recursiveSum(int n) {
if(n == 1) return n;
else return n + recursiveSum(n-1);
}
// 1~n 까지의 합을 구하는 메서드
private static int sum(int n) {
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += i;
}
return sum;
}
} // class
'TIL > Java' 카테고리의 다른 글
[Java] System.in.read() / System.in.skip() / System.in.available() (0) | 2022.02.27 |
---|---|
[SIST] Java_days09 (0) | 2022.02.25 |
[SIST] Java_days07 (0) | 2022.02.23 |
[SIST] Java_days06 (0) | 2022.02.22 |
[SIST] Java_days05 (0) | 2022.02.21 |