2026. 1. 12. 17:00ㆍ대우개발원 수업 내용/Java 정리
[클래스의 구성 멤버]
클래스의 맴버
- 필드(field) ex) int fieldname:
- 생성자 (constructor) ex) ClassName() { ... }
-메소드 (method) ex) void methodName() { ... }
[메소드]
메소드(method) = 함수(funtion)
언어마다 이름이 다를뿐 같은것.
[메소드 선언]
메소드 선언부 (signature)
- 리턴 타입 : 메소드가 리턴하는 결과의 타입 표시
- 메소드 이름 : 메소드의 기능 드러나도록
- 식별자 규칙에 맞게 이름 지음
- 매개 변수 선언 : 메소드 실행할 때 필요한
- 데이터 받기 위한 변수 선언
- 메소드 실행 블록 : 실행할 코드 작성
리턴 타입
- 메소드를 실행한 후의 결과값의 타입
- 리턴값 없을 수도 있음
- 리턴값 있는 경우 리턴 타입이 선언부에 명시
- 리턴값 존재 여부에 따라 메소드 호출 방법 다름
메소드 이름
- 숫자로 시작하면 안 되고, $와 _ 제와한 특수문자 사용 불가
- 메소드 이름은 관례적으로 소문자로 작성
- 서로 다른 단어가 혼합된 이름일 경우 뒤이어 오는 단어의 첫 글자를 대문자로 작성하는 "카멜표기법" 사용
매개 변수 선언
- 메소드 실행에 필요한 데이터를 외부에서 받아 저장할 목적
바로 값을 넣는 방법 ↓
double divide( int x, int y) { ... } //int x, int y는 파라미터
double result = divide ( 10, 20 ); // 10, 20은 아규먼트
변수에 값을 담은 다음에 변수의 값을 호출 ↓
bythe b1 = 10;
byte b2 = 20;
double result = divide ( b1, b2 );
- 잘못된 매개값 사용하여 컴파일 에러 발생하는 경우
[메소드 선언]
메소드 예시 계산기 코드

package sec01;
public class Calculator {
// 메소드
// return의 결과 값이 없을때는 void라는 메소드를 쓴다
void powerOn() {
System.out.println("전원을 켭니다.");
}
// return의 결과 값이 있을때는 return타입을 메소드 앞에 명시
int plus(int x, int y) {
int result = x + y;
return result;
}
double divide(int x, int y) {
double result = (double)x / (double)y;
return result;
}
void powerOff() {
System.out.println("전원을 끕니다.");
}
}
package sec01;
public class CalculatorEx {
public static void main(String[] args) {
Calculator myCalc = new Calculator();
myCalc.powerOn(); // 이부분 인스턴스(객체) 필요
int result1 = myCalc.plus(5, 6);
System.out.println("result1 : " + result1);;
byte x = 10;
byte y = 4;
double result2 = myCalc.divide(x, y);
System.out.println("result2 : " + result2);
myCalc.powerOff();
}
}
- 같은 클래스에 있는 메서드는 그냥 호출 가능 인스턴스(객체) 필요 x ↓

package sec01;
public class Exam01 {
public static void main(String[] args) {
// 메서드 예제
int a = 30;
everyone(a); // 이부분 인스턴스(객체) 필요 x 바로 호출 가능 위에 CalculatorEx와 비교해보기
everyone(10);
everyone(20);
everyone(15);
}
public static void everyone(int age) {
System.out.println("제 나이는 " + age + "입니다.");
}
}
[메소드 선언]
Quiz. Exam07.java (class)
입력 받은 두개의 정수를 매개변수로 전달받아 그 중에 큰 수를 찾아 출력하는 메소드를 정의
출력:
숫자를 두개 입력해주세요.
>89
>89
두 수가 같습니다.

package exercise;
import java.util.Scanner;
public class Exam07 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("숫자 두 개 입력해주세요.");
System.out.print(">");
int a = scan.nextInt();
System.out.print(">");
int b = scan.nextInt();
maxNumber(a, b);
// 아래도 가능
// System.out.print(">");
// int a1 = scan.nextInt();
//
// System.out.print(">");
// int b1 = scan.nextInt();
//
// maxNumber(a1, b1);
scan.close();
}
public static void maxNumber(int a, int b) {
if (a > b) {
System.out.println(a + " 와 " + b + " 중에 큰수는 " + a + "입니다.");
}
else if (a < b) {
System.out.println(a + " 와 " + b + " 중에 큰수는 " + b + "입니다.");
}
else {
System.out.println("두 수는 같습니다.");
}
}
}
[메소드 선언]
매개 변수의 개수를 모를 경우
- 매개 변수를 배열 타입으로 선언
int sum1(int[] values) { }
int[] values = { 1, 2, 3 };
int result = sum1(values);
int result = sum1(new int[] { 1, 2, 3,4,5});
- 배열 생성하지 않고 값의 목록만 넘겨주는 방식
int sum2(int ... values) { }
int result = sum2(1, 2, 3);
int result = sum2(1, 2, 3, 4, 5);
int[] values={ 1, 2,3};
int result = sum2(values);
int result = sum2(new int[] { 1,2,3,4,5});
예제) Computer.java, ComputerEx.java ↓

package sec01;
public class Computer {
// 안에 코드는 똑같고 파라미터의 형식만 다름 1
int sum1(int[] values) {
int sum = 0;
for (int i = 0; i < values.length; i++){
sum += values[i];
}
return sum;
}
// 안에 코드는 똑같고 파라미터의 형식만 다름 2
int sum2(int... values) {
int sum = 0;
for (int i = 0; i < values.length; i++){
sum += values[i];
}
return sum;
}
}
package sec01;
public class ComputerEx {
public static void main(String[] args) {
Computer myCom = new Computer();
int[] values1 = {1, 2, 3};
int result1 = myCom.sum1(values1);
System.out.println("result1 : " + result1);
int result2 = myCom.sum1(new int[] {1, 2, 3, 4, 5});
System.out.println("result2 : " + result2);
// 가변길이 메개변수
int result3 = myCom.sum2(1, 2, 3);
System.out.println("result3 : " + result3);
int result4 = myCom.sum2(1, 2, 3, 4, 5);
System.out.println("result4 : " + result4);
}
}
[리턴(return)문]
리턴값이 있는 메소드
▪ 메소드 선언에 리턴 타입 있는 메소드는 리턴문 사용하여 리턴값 지정
return 리턴값;
▪ return문의 리턴값은 리턴타입이거나 리턴타입으로 변환될 수 있어야 함
int plus(int x, int y) {
int result = x + y;
return result;
}
--------------------------------
int plus(int x, int y) {
byte result = (byte) (x + y);
return result;
}
리턴값이 없는 메소드 : void
- void 선언된 메소드에서 return문 사용하여 메소드 실행 강제 종료
result;
void run() {
while(true) {
if(gas > 0) {
System.out.println("#44.(gas2#:" + gas + ")");
gas -= 1;
} else {
System.out.println("#44.(gas2#:"+ gas +")");
return; // run() 메소드 실행 종료
}
}
}
예제) Car, CarEx ↓


package sec01;
public class Car {
// 필드
int gas;
// 생성자 생략
//-> 생략하면 defualt 생성자가 알아서 생성된다
// 메소드
void setGas(int gas) {
this.gas = gas;
}
boolean isLesftGas() {
if(gas==0) {
System.out.println("gas가 없습니다.");
return false;
}
System.out.println("gas가 있습니다.");
return true;
}
void run() {
while(true) {
if(gas > 0) {
System.out.println("달립니다.(gas잔량:)" + gas + ")");
gas -= 1;
}
else {
System.out.println("멈춥니다.(gas잔량:)" + gas +")");
return;
}
}
}
}
package sec01;
public class CarEx {
public static void main(String[] args) {
Car myCar = new Car(); //인스턴스(객체) 생성
myCar.setGas(5); //Car의 setGas() 메소드 호출
boolean gasState = myCar.isLesftGas(); //Car의 isLesftGas() 메소드 호출
if(gasState) {
System.out.println("출발합니다.");
myCar.run(); //Car의 run() 메소드 호출
}
if(myCar.isLesftGas()) { // Car의 isLesftGas() 메소드 호출
System.out.println("gas를 주입할 필요가 없습니다.");
} else {
System.out.println("gas를 주입하세요.");
}
}
}
Quiz. MemberService.java (class)
MemberService 클래스에는 다음 두 개의 메서드를 선언하려고 합니다.
- login() 메서드
- 매개값으로 id와 password를 받는다.
- 만약 id가 "hong"이고 password가 "12345"이면 true를 리턴한다.
- 그 외의 값일 경우 false를 리턴한다.
- logout() 메서드
- 매개값으로 id를 받는다.
- "로그아웃 되었습니다."가 출력되도록 한다.
리턴 타입메서드 이름매개 변수(타입)
| boolean | login | id(String), password(String) |
| void | logout | id(String) |
[실행 예시]
아이디를 입력해주세요.
hong
패스워드를 입력해주세요.
12345
로그인 되었습니다.
hong 로그아웃 되었습니다.
Quiz. MemberServiceEx.java (class)
MemberService 클래스를 이용하여 아래와 같이 출력되는 MemberServiceEx 실행 클래스를 구현하시오.
스캐너를 통해 아이디와 패스워드를 입력 받습니다.
- Scanner로 아이디(id)와 패스워드(password)를 입력받는다.
- MemberService 객체를 생성한다.
- 입력받은 id, password로 login(id, password)를 호출한다.
- login() 결과가 true이면
- "로그인 되었습니다."를 출력한다.
- logout(id)를 호출한다.
- login() 결과가 false이면
- "id 또는 password가 올바르지 않습니다."를 출력한다.
실행 예시(성공)
아이디를 입력해주세요.
hong
패스워드를 입력해주세요.
12345
로그인 되었습니다.
hong 로그아웃 되었습니다.
------------------
실행 예시(실패)
아이디를 입력해주세요.
lee
패스워드를 입력해주세요.
23698
id 또는 password가
올바르지 않습니다.

package sec01;
import java.util.Scanner;
public class MemberServiceEx {
public static void main(String[] args) {
// 실행 클래스
MemberService memberService = new MemberService(); // 인스턴스(객체) 생성
Scanner scan = new Scanner(System.in); // Scanner 인스턴스 생성
System.out.println("아이디를 입력해주세요.");
String id = scan.nextLine();
System.out.println("비밀번호를 입력해주세요.");
String pw = scan.nextLine();
boolean result = memberService.login(id, pw);
if (result) {
System.out.println("로그인 되었습니다.");
memberService.logout("hong");
}
else {
System.out.println("id 또는 password가 올바르지 않습니다.");
}
scan.close();
}
}
package sec01;
public class MemberService {
// 필드 생략
// 생성자 생략
// 메소드
boolean login(String id, String password) {
// 필드 생략하고 String id, String password 같이 매개변수로 처리
if (id.equals("hong") && "12345".equals(password)) {
return true;
}
return false;
}
void logout(String id) {
// 필드 생략하고 String id 같이 매개변수로 처리
System.out.println(id + " 로그아웃 되었습니다.");
}
}
Quiz. SumAvg.java (class)
크기 5의 배열의 값을 입력(스캐너) 받아서 총점과 평균을 구하는 메서드를 만들어 호출해 보세요.
출력:
정수 5개를 입력하세요.
25
63
48
95
21
입력된 배열의 합은: 252
입력된 배열의 평균은: 50

package sec01;
import java.util.Scanner;
public class SumAvg {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] arr = new int[5];
System.out.println("정수 5개를 입력하세요.");
for(int i=0; i<arr.length; i++) {
arr[i] = scan.nextInt();
}
int sum = sum(arr);
System.out.println("입력된 배열의 합은 : " + sum);
int avg = avg(arr);
System.out.println("입력된 배열의 합은 : " + avg);
scan.close();
}
public static int sum(int[] a) {
int sum = 0;
for(int i=0; i<a.length; i++) {
sum += a[i];
}
return sum;
}
public static int avg(int[] a) {
int sum = 0;
int count = 0;
int avg = 0;
for(int i = 0; i<a.length; i++) {
sum += a[i];
count++;
}
avg = sum/count;
return avg;
}
}
Quiz. maxValue.java (class)
주어진 배열을 입력 받아서 가장 큰 수를 반환하는 메서드를 만들어 보세요.
입력 : {78,54,89,57,84,95,74,91,84,67,52,94,82}
출력:
Quiz. maxValue.java (class)
최대값 : 95

주어진 배열을 입력 받아서 가장 큰 수를 반환하는 메서드
를 만들어 보세요.
입력 : {78,54,89,57,84,95,74,91,84,67,52,94,82}
출력:
Quiz. maxValue.java (class)
최대값 : 95
package sec01;
import java.util.Scanner;
public class MaxValue {
public static void main(String[] args) {
// 문제에서 주어진 값으로 실행하는 방법
//int [] arr = new int[] {78,54,89,57,84,95,74,91,84,67,52,94,82};
// Scanner 사용해서 하는 방법
int[] arr = new int[10];
Scanner scanner = new Scanner(System.in);
System.out.println("정수 10개를 입력해주세요.");
for(int i=0; i<arr.length; i++) {
arr[i] = scanner.nextInt();
}
int max = maxVal(arr);
System.out.println("최대값 : " + max);
scanner.close();
}
public static int maxVal(int a[]) {
// 정수형 배열을 넣으면 최대값을 찾아내는 기능을 가진 메소드
int max = 0;
for(int i=0; i<a.length; i++) {
if(max<a[i]) {
max=a[i];
}
}
return max;
}
}
Quiz. CharChange.java (class)
char[] 배열을 전달받아 배열 속의 공백(' ') 문자를 ','로 대치하는 메소드(replace())를 작성하고
출력하는 메소드(ptr()) 작성해서 예시처럼 호출하세요.
입력 :
{'T','h','i','s',' ','i','s',' ','a',' ','p','e','n','c','i','l','.'}
출력:
Quiz. CharChange.java (class)
This is a pencil.
This,is,a,pencil.

package sec01;
public class CharChange {
public static void main(String[] args) {
char[] arr = new char[] {'T','h','i','s',' ','i','s',' ','a',' ','p','e','n','c','i','l','.'};
prt(arr);
replace(arr);
prt(arr);
}
public static void replace(char a[]) {
for(int i=0; i<a.length; i++) {
if(a[i]==' ') {
a[i] = ',';
}
}
}
public static void prt(char a[]) {
for(int i=0; i<a.length; i++) {
System.out.print(a[i]);
}
System.out.println();
}
}
Quiz. AddTwoArr.java (class)
주어진 두 배열의 같은 위치의 숫자를 합쳐서 하나의 배열로 만들고 (int[] arrAdd(int[] a, int[] b){})
출력하는(void prt(int[] a){}) 메서드를 만드세요.
단, 같은 위치에 숫자가 없다면 해당 위치의 숫자를 그대로 출력하세요.
입력 : {78,54,89,57,84}
{95,74,91,84}
출력:
173, 128, 180, 141, 84,

package sec01;
public class AddTwoArr {
public static void main(String[] args) {
int[] arr1 = new int[] { 78, 54, 89, 57, 84 };
int[] arr2 = new int[] { 95, 74, 91, 84 };
int[] arr3 = arrAdd(arr1, arr2);
prt(arr3);
}
// 두 배열을 더하는 메서드
public static int[] arrAdd(int[] a, int[] b) {
int[] result = null;
if (a.length > b.length) {
result = new int[a.length];
for (int i = 0; i < a.length; i++) {
if (i < b.length) {
result[i] = a[i] + b[i];
} else {
result[i] = a[i];
}
}
} else {
result = new int[b.length];
for (int i = 0; i < b.length; i++) {
if (i < a.length) {
result[i] = a[i] + b[i];
} else {
result[i] = b[i];
}
}
}
return result;
}
// 배열 출력 메서드
public static void prt(int[] sum) {
for (int i = 0; i < sum.length; i++) {
System.out.print(sum[i] + ",");
}
}
}
[메소드 호출]
메소드 호출
- 메소드 블록을 실제로 실행하는 것
- 클래스로부터 객체가 생성된 후에 메소드는 생성자와 다른 메소드 내부에서 호출될 수 있고,
객체 외부에서도 호출될 수 있음
- 외부 객체에서는 참조 변수와 도트(.) 연산자로 호출
객체 내부에서 호출
- 메소드가 리턴값 없거나(void) 있어도 받고 싶지 않은 경우
- 리턴값 있는 메소드 호출하고 리턴값 받고 싶은 경우
객체 외부에서 호출
- 우선 클래스로부터 객체 생성
- 참조 변수와 도트 연산자 사용하여 메소드 호출
[메소드 오버로딩]
메소드 오버로딩 (overloading)
- 같은 이름의 메소드를 여러 개 선언
- 매개값을 다양하게 받아 처리할 수 있도록 하기 위함
- 매개 변수(파라미터)의 타입, 개수, 순서 중 하나가 달라야 함
- 매개 변수 오버로딩은 순서가 달라지는것도 포함
class 클래스 {
리턴 타입 메소드 이름 (타입 변수, ... { ... }
↑ ↑ ↑
무관 동일 매개 변수의 타입, 개수, 순서가 달라야함
↓ ↓ ↓
리턴 타입 메소드 이름 (타입 변수, ...) { ... }
}
오버로딩 예제 코드
직사각형 정사각형의 넓이 구하기

package sec01;
public class RectangleCalc {
// 정사각형의 넓이
double areaRectangle(double width) {
return width * width;
}
// 직사각형의 넓이
double areaRectangle(double width, double height) {
return width * height;
}
}
package sec01;
public class RectangleCalcEx {
public static void main(String[] args) {
RectangleCalc myCalcu = new RectangleCalc();
// 정사각형의 넓이 구하기
double result1 = myCalcu.areaRectangle(10);
// 직사각형의 넓이 구하기
double result2 = myCalcu.areaRectangle(10, 20);
// 결과 출력
System.out.println("정사각형의 넓이 : " + result1);
System.out.println("직사각형의 넓이 : " + result2);
}
}
메소드의 종류
예제 코드

package sec01;
public class Exam3 {
public static void main(String[] args) {
//메서드의 종류
hello();
hello("고길동", 45);
int r = dice();
System.out.println("주사위 값 : " + r);
int num1 = 3;
int num2 = 5;
int result = addr(num1,num2);
System.out.println("합계 : " + result);
}
//입력X 출력X
private static void hello() {
System.out.println("안녕하세요");
}
//입력O 출력X
private static void hello(String name, int age) {
System.out.println("내 이름은 " +name+" 입니다.");
System.out.println("내 나이는 " +age+" 입니다.");
}
//입력X 출력O
private static int dice() {
int dice = (int)Math.random()*6+1;
return dice;
}
//입력O 출력O
private static int addr(int a, int b) {
int c = a+b;
return c;
}
}
Quiz. 구구단 메서드
1. 단을 외부데이터로 입력 받아서 구구단을 출력하는 메서드를 만들어 보세요. (gugudan.java) -라이브러리
2. gugudan.java를 이용하여 숫자를 입력(스캐너) 받으면 해당 숫자의 구구단을 출력하세요. (gugudanIn.java) -실행

package sec01;
public class Gugudan{
public void printDan(int dan){
for (int i = 1; i <= 9; i++) {
System.out.println(dan + " x " + i + " = " + (dan * i));
}
}
}
package sec01;
import java.util.Scanner;
public class GugudanIn {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Gugudan gugudan = new Gugudan();
System.out.print("단을 입력하세요: ");
int dan = scanner.nextInt();
gugudan.printDan(dan);
scanner.close();
}
}
3. 두개의 숫자를 입력 받아서 작은 수부터 큰 수 까지의 구구단을 출력하세요. (gugudanTwoNum.java)
– 라이브러리&실행 클래스 한 클래스에 생성

package sec01;
import java.util.Scanner;
public class GugudanTwoNum {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("두 개의 숫자를 입력해 주세요.");
int a = scanner.nextInt();
int b = scanner.nextInt();
scanner.close();
gugudan(a, b);
}
private static void gugudan(int a, int b) {
int end;
int start;
if (a < b) {
start = a;
end = b;
}
else if (a > b){
start = b;
end = a;
}
else {
System.out.println("두 수가 같습니다 다시 입력해주세요.");
return;
}
for (int dan = start; dan <= end; dan++) {
for (int i = 1; i <= 9; i++) {
System.out.println(dan + " x " + i + " = " + (dan * i));
}
System.out.println();
}
}
}
4. 숫자가 하나만 입력되면 해당 숫자의 구구단을 출력하고
두개의 숫자가 입력되면 작은 수부터 큰 수까지의 구구단을 출력하세요. (메서드 오버로딩이용, gugudanOver.java)
– 라이브러리&실행 클래스 한 클래스에 생성

package sec01;
import java.util.Scanner;
public class GugudanOver {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("숫자를 입력해 주세요.");
String input = scanner.nextLine();
String[] nums = input.split(" ");
scanner.close();
gugudan(nums);
}
private static void gugudan(String[] nums) {
int start;
int end;
if (nums.length == 1) {
start = Integer.parseInt(nums[0]);
end = start;
}
else if (nums.length == 2) {
int a = Integer.parseInt(nums[0]);
int b = Integer.parseInt(nums[1]);
start = Math.min(a, b);
end = Math.max(a, b);
}
else {
System.out.println("숫자를 1개 또는 2개만 입력하세요.");
return;
}
// 구구단 출력
for (int dan = start; dan <= end; dan++) {
for (int i = 1; i <= 9; i++) {
System.out.println(dan + " x " + i + " = " + (dan * i));
}
System.out.println();
}
}
}
split 사용하지 않는 코드

package sec01;
import java.util.Scanner;
public class GugudanOver {
// split 사용 x
public static void main(String[] args) {
// 숫자가 하나만 입력되면 해당 숫자의 구구단을 출력하고 두개의 숫자가 입력되면 작은 수부터 큰수까지의 구구단을 출력하세요.
Scanner scan = new Scanner(System.in);
System.out.println("구구단에서 출력하고자 하는 단을 입력하세요.");
System.out.print(">");
int dan1 = Integer.parseInt(scan.nextLine());
gugudan(dan1);
System.out.println("구구단 출력을 위해서 2개의 숫자를 입력하세요.");
System.out.print(">");
int dan2 = Integer.parseInt(scan.nextLine());
System.out.print(">");
int dan3 = Integer.parseInt(scan.nextLine());
gugudan(dan2,dan3);
scan.close();
}
public static void gugudan(int n) {
System.out.println(n+"단");
for(int i=1;i<=9;i++) {
System.out.println(n+"*"+i+"="+(n*i));
}
}
public static void gugudan(int n, int m) {
if(n < m) { // n~m
for(int i=n;i<=m;i++) {
System.out.println(i+"단");
for(int j=1;j<=9;j++) {
System.out.println(i+"*"+j+"="+(i*j));
}
}
}else if(n > m){ //m~n
for(int i=m;i<=n;i++) {
System.out.println(i+"단");
for(int j=1;j<=9;j++) {
System.out.println(i+"*"+j+"="+(i*j));
}
}
}else { // n=m
for(int i=1;i<=9;i++) {
System.out.println(n+"*"+i+"="+(n*i));
}
}
}
}
Quiz. BankBookEx.java (class)
1. “BankBook” library class를 선언하여
deposit(int money_in), withdraw(int money_out), showMoney() 메소드를 선언
2. deposit(int money_in) : 입금
withdraw(int money_out) : 출금
showMoney() : 잔액출력
3. 입금액과 출금액은 스캐너로 입력 받아서 2번의 임금과 출금 실행.
4. 출금시 잔액보다 출금액이 많으면 메시지 호출
출력 예시:

package sec01;
public class BankBook {
// 계좌의 잔액을 저장하는 필드
// 객체가 생성될 때 기본값 0으로 초기화됨
int money;
// 입금 메서드
// 전달받은 입금액을 현재 잔액에 더함
int deposit(int money_in) {
this.money += money_in; // 잔액 증가
return money_in; // 입금한 금액 반환
}
// 출금 메서드
int withdraw(int money_out) {
// 출금 금액이 현재 잔액보다 크면 경고 메시지 출력
if (this.money <= money_out) {
System.out.println("금액이 부족합니다.");
}
// 잔액 부족 여부와 상관없이 출금 처리
// (문제의 출력 예시 조건에 맞춘 로직)
this.money -= money_out;
return money_out; // 출금한 금액 반환
}
// 현재 잔액 출력 메서드
void showMoney() {
System.out.println("현재 잔액은 : " + this.money + " ");
}
}
package sec01;
import java.util.Scanner;
public class BankBookEx {
public static void main(String[] args) {
// 키보드 입력을 받기 위한 Scanner 객체 생성
Scanner scan = new Scanner(System.in);
// BankBook 객체 생성 (하나의 통장)
BankBook BK = new BankBook();
// 초기 잔액 출력 (0원)
BK.showMoney();
// 입금 + 출금을 2번 반복 실행
for (int i = 0; i < 2; i++) {
// 입금 처리
System.out.print("입금액: ");
int in = scan.nextInt(); // 입금액 입력
System.out.print(BK.deposit(in) + "원 입금\t");
BK.showMoney(); // 입금 후 잔액 출력
// 출금 처리
System.out.print("출금액: ");
int out = scan.nextInt(); // 출금액 입력
System.out.print(BK.withdraw(out) + "원 출금\t");
BK.showMoney(); // 출금 후 잔액 출력
}
// BankBook 객체의 필드를 직접 접근하여 최종 잔액 출력
System.out.println("\n최종 잔액은 : " + BK.money + "원 입니다.");
// Scanner 자원 해제
scan.close();
}
}
이 코드를 하면서 어려웠던점은
1. 출금 로직에서 “잔액 부족” 처리
가장 헷갈렸던 부분은 출금 시 잔액보다 큰 금액을 입력했을 때 어떻게 처리해야 하는가였다.
보통 은행 시스템이라면 출금을 막아야 하지만, 문제의 출력 예시를 보면 잔액이 음수가 되더라도 출금은 실행되고,
대신 경고 메시지만 출력하도록 되어 있었다.
처음에는 조건문 안에서 return으로 출금을 막으려고 했는데, 그러면 예시 출력과 달라졌다.
그래서 조건문은 메시지 출력 용도로만 사용하고,
실제 잔액 감소(this.money -= money_out)는 항상 실행되도록 구조를 분리해서 해결했다.
2. 라이브러리 클래스와 실행 클래스의 역할 구분
BankBook 클래스에 Scanner를 넣을지 말지 고민했다.
하지만 문제에서 “BankBook library class”라고 명시되어 있었기 때문에,
입출력(Scanner)은 BankBookEx에서 담당하고,
BankBook은 순수하게 라이브러리 클래스로서 계좌 로직만 처리하는 클래스로 분리하는 것이 맞다고 판단했다.
이 코드를 보고 정리한 cs지식
1. 클래스와 객체 (Class & Object)
- BankBook → 설계도(클래스)
- BK → 실제 생성된 통장 객체
- 객체마다 독립적인 필드(money) 를 가짐
2. 필드(Field)와 메서드(Method)
- 필드: 객체의 상태(잔액)
- 메서드: 객체의 동작(입금, 출금, 조회)
- 데이터 + 기능을 하나로 묶는 것이 객체지향의 핵심
3. this 키워드
- this.money
- 현재 객체 자신의 필드를 가리킴
- 매개변수 이름과 필드 이름이 겹칠 때 명확하게 구분 가능
4. 역할 분리 (Separation of Concerns)
- BankBook : 계좌 로직만 담당
- BankBookEx : 입력/출력과 실행 흐름 담당
- 유지보수와 확장성에 매우 중요한 개념
5. 조건문(if)과 비즈니스 로직
- 조건문은 제어를 막는 용도뿐 아니라
- 경고, 로깅, 메시지 출력 용도로도 사용 가능
- 문제 요구사항에 따라 로직이 달라질 수 있음
6. 접근제한자 개념 (확장 학습)
- 현재는 int money가 default 접근
- 실무에서는 private int money; + getter 사용
- 추후 배울 캡슐화(Encapsulation) 개념과 연결됨
7. 자원 관리
- Scanner 사용 후 close()를 호출해서 정상적으로 코드가 동작되게 기억한다.
'대우개발원 수업 내용 > Java 정리' 카테고리의 다른 글
| Java 개념정리 11일차 (1) | 2026.01.13 |
|---|---|
| Java 개념정리 10일차 (1) | 2026.01.12 |
| Java 개념정리 8일차 (0) | 2026.01.12 |
| Java 개념정리 7일차 (0) | 2026.01.12 |
| Java 개념정리 6일차 (0) | 2026.01.12 |