[접근제한자][예약어] 반환형 메소드명( [매개변수] ) {
// 기능 정의
}
public void information() { // 반환형 없으면 void
System.out.println(studentNo);
}
| 구분 | 해당 클래스 내부 | 같은 패키지 내 | 후손 클래스 내 | 전체 |
|---|---|---|---|---|
| + public | O | O | O | O |
| # protected | O | O | O | |
| ~ (default) | O | O | ||
| - private | O |
| 구분 | 전체 |
|---|---|
| static | static 영역에 할당하여 객체 생성 없이 사용 |
| final | 종단의 의미, 상속 시 오버라이딩 불가능 (메서드 재정의 불가) |
| abstract | 미완성된, 상속하여 오버라이딩으로 완성시켜 사용해야 함 (추상) |
| synchronized | 동기화 처리, 공유 자원에 한 개의 스레드만 접근 가능함 |
| static final (final static) | static과 final의 의미를 둘 다 가짐 |

배열: public int[] ex() {
int[] arr = {1,2,3};
return arr;
}
클래스 : ex) Studend std = new Student();

1) 매개변수가 없고 리턴 값이 있을 때
[접근제한자] [예약어] 반환형 메소드명() {
// 기능 정의
}
public int information() {
return studentNo;
}
2) 매개변수가 없고 리턴 값이 없을 때
[접근제한자] [예약어] void 메소드명() {
// 기능 정의
}
public void information() {
System.out.println(studentNo);
}
3) 매개변수가 있고 리턴 값이 있을 때
[접근제한자] [예약어] 반환형 메소드명(자료형 변수명) {
// 기능 정의
}
public String information(String studentName) {
return studentNo + " " + studentName;
}
4) 매개변수가 있고 리턴 값이 없을 때
[접근제한자] [예약어] void 메소드명(자료형 변수명) {
// 기능 정의
}
public void information(String studentName) {
System.out.println(studentNo + " " + studentName);
}
[접근제한자] [예약어] void set필드명(자료형 변수명) {
(this.)필드명 = 자료형 변수명;
}
public void setStudentNo(int studentNo) {
this.studentNo = studentNo;
}
[접근제한자] [예약어] 반환형 get필드명() {
return 필드명;
}
public int getStudentNo() {
return studentNo;
}
해당 메소드를 종료하고 자신을 호출한 메소드로 돌아가는 예약어
반환 값이 있다면 반환 값을 가지고 자신을 호출한 메소드로 돌아감

메서드가 호출될 때마다 stack에 메서드를 실행한 이력이 쌓인다
-> 메서드를 호출한 순서대로 쌓임
main -> method1 -> method2
제일 마지막에 쌓인 순서대로 stack에서 나감
method2 -> method1 -> main
LIFO (Last - Input - First - Out) : 마지막에 들어온게 첫번째로 나간다 == 후입선출



내가 쓴 답...
원인 1 : 해당 문제는 정수를 입력하여 구구단을 출력하는 문제로
int input = sc.next(); 구문에서 sc.next(); 부분이 문자열을 입력하는 구문으로 잘못 표기되어있다.
원인 2 : if문의 조건이 (input <= 9) 로 되어있는데, 이는 1단과 10단에서도 값이 출력 될 수 있다.
원인 3 : for문이 반복된 뒤 출력 되는 문구인 System.out.printf("%d * %d = %d\n", input, num); 에서 3번째 정수인 %d의 값을 대입하는 input * num의 코드가 빠져있어 오류가 났다.
원인 4 : while문은 break;가 없으면 계속 반복된다.
따라서 지금 상태도 정수를 입력하면 결과가 나오고 계속하여 정수를 입력하라고 뜰 것이다.
현재 break;가 2개가 빠져있다.
%오답 : 현재 break;가 2개가 빠져있다. -> break 1개 누락.. (-5점)
조치내용 1 : 문자열을 입력하도록 하는 int input = sc.next();를
정수 입력을 하는 int input = sc.nextInt();로 수정해준다.
조치내용 2 : if문 조건의 input의 범위를 (input >= 2 && input <= 9) 로 수정하여
구구단이 2단 ~ 9단만 출력 될 수 있도록 해준다.
조치내용 3 : System.out.printf();는 순서대로 값을 대입하기 때문에
3번째 정수값인 %d의 값을 대입하기 위해 input * num을 넣어
input과 num의 곱한 값이 대입 되도록 해준다.
조치내용 4 : 2 ~ 9 사이 정수를 입력하여 구구단이 출력되거나,
1이하 또는 10이상의 수를 입력하여 2이상 9이하의 정수만 입력하라는 문구가 출력이 된 후
코드를 종료 시키기 위하여 for문 바깥에 break; 를 붙여주고,
또 하나는 else문 안에 System.out.println("2이상 9이하의 정수만 입력해주세요");
다음 break;를 붙여준다.
%오답
-> 문제 파악 미흡 (-10점) : 18번째 줄에 break; 구문을 추가하여 구구단 출력 후 while문을 멈추게 하면 됨.
문제 : 2~9 사이 정수를 입력될 떄 까지 무한 반복하다가,
2~9 사이 정수가 입력되면 해당하는 단의 구구단을 출력하고 종료하는 소스코드.
else 문에서 break; 작성 시 2~9사이 정수가 입력 안되었을때에도 종료되어버림
(문제 의도 : 입력 될때까지 무한반복 해야함)
모범답안...
1) 12번째 줄 Scanner로 입력 받는 값이 int형이 아닌 String 형태여서
입력 타입이 일치하지 않다는 InputMismathException 발생.
2) 15번째 줄 if문의 조건식이 잘못 작성되어
2보다 작은 정수를 입력해도 else구문이 수행되지 않아 "2 이상 9 이하의 숫자만 입력해주세요." 구문이 출력되지 않음.
3) 16번째 줄 printf 구문 출력 시 출력할 정수의 자리를 지정하는 %d 패턴이 3개 있으나,
input, num 2개만 작성되어 있어 값이 하나 모자름.
4) 2~9 사이 정수를 정상 입력한 경우 구구단을 출력하고 프로그램이 종료되어야 하지만
while문을 멈추는 구문이 작성되지 않아 프로그램이 종료되지 않고 무한히 반복됨.
package edu.kh.test1;
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(true) {
System.out.print("2 ~ 9 사이 정수 입력 : ");
int input = sc.nextInt();
if(input >= 2 && input <= 9) {
for(int num = 1; num <= 9; num++) {
System.out.printf("%d * %d = %d\n", input, num, input * num);
}
break;
}else {
System.out.println("2이상 9이하의 정수만 입력해주세요");
}
}
}
}