25.02.21 (금) 10일차 Java

허배령·2025년 2월 21일

괴발개발 TIL

목록 보기
10/54

OOP

메서드

메서드 표현식

[접근제한자][예약어] 반환형 메소드명( [매개변수] ) {
// 기능 정의
}

public void information() { // 반환형 없으면 void
	System.out.println(studentNo);
}

메서드 접근제한자

구분해당 클래스 내부같은 패키지 내후손 클래스 내전체
+ publicOOOO
# protectedOOO
~ (default)OO
- privateO

메서드 예약어

구분전체
staticstatic 영역에 할당하여 객체 생성 없이 사용
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);
}

getter / setter 메소드

  • 왜 만들까?
  • 필드에 선언된 멤버변수들이 캡슐화 원칙에 의해서 private으로 선언됨
  • private은 다른 클래스에서 직접 접근 불가함
  • 간접 접근 방식으로 값을 세팅 / 얻어올 수 있도록 메서드를 만들어 제공함
  • getter / setter의 접근제한자는 public 이어야 한다

setter 메소드

  • 필드에 변경할 값을 전달 받아서 필드 값을 변경하는 메소드

setter 메소드 표현식

[접근제한자] [예약어] void set필드명(자료형 변수명) {
	(this.)필드명 = 자료형 변수명;
}

public void setStudentNo(int studentNo) {
	this.studentNo = studentNo;
}

getter 메소드

  • 필드에 기록된 값을 읽어서 요청한 쪽으로 읽은 값을 넘기는 메소드

getter 메소드 표현식

[접근제한자] [예약어] 반환형 get필드명() {
	 return 필드명;
}

public int getStudentNo() {
	return studentNo;
}

return

  • 해당 메소드를 종료하고 자신을 호출한 메소드로 돌아가는 예약어

  • 반환 값이 있다면 반환 값을 가지고 자신을 호출한 메소드로 돌아감

  • 메서드가 호출될 때마다 stack에 메서드를 실행한 이력이 쌓인다
    -> 메서드를 호출한 순서대로 쌓임

  • main -> method1 -> method2

  • 제일 마지막에 쌓인 순서대로 stack에서 나감

  • method2 -> method1 -> main

  • LIFO (Last - Input - First - Out) : 마지막에 들어온게 첫번째로 나간다 == 후입선출


테스트 (25.02.21 금)

내가 쓴 답...
원인 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이하의 정수만 입력해주세요");
				
			}
			
		}
	}

}
profile
인생은 변수

0개의 댓글