Java 개념정리 11일차

2026. 1. 13. 16:47대우개발원 수업 내용/Java 정리

반응형

클래스, 배열, 상속, 생성자 다시 공부

 

Quiz. AccountEx.java (class)

1. 예금주와 계좌번호, 초기 예금액을 입력 받아서예금 계좌를 개설한다.
2. 계좌 정보는 총 100명분의 정보만 저장이 가능하도록 합니다.
static Account[] accounts = new Account[100];


3. 은행업무를 하고 싶다면 계좌번호를 입력해서있다면 업무를 볼 수 있고, 없다면 해당 계좌가없다고 출력하세요.
4. 은행 업무(메소드 생성)에 조회 시 해당 계좌의잔액을 조회 할 수 있고, 입금과 출금 기능을 이용할 수 있습니다.
5. 출금 시 잔액 보다 많은 금액을 출금할 수 없습니다.

1단계: [Account클래스]
필드 : 예금주, 계좌번호, 잔고
메서드 : 예금을 입금하는 메서드, 예금을 출금하는 메서드
생성자 : 예금주, 계좌번호, 초기 예금액을 입력 받아서 인스턴스 생성하는 생성자
-----------------------------------------------------
2단계 : [AccountEx클래스] main 메서드
메뉴로 계좌 생성기능, 은행업무 기능, 종료기능 작동시키는 while~ switch문을 완성
------------------------------------------------------
3단계 [AccountEx클래스] Account를 담는 배열타입의static변수를 생성
3-1단계 : 계좌 생성: 3개의 정보를 입력 받고 인스턴스를생성한 후 위 변수 순서대로에 담는다.
3-2단계 : 은행 업무 : 계좌 번호를 입력 요구하고 성공하면입금 출금, 잔액 조회 기능을 할 수 있다.

더보기
package quiz;

public class Account {
	//필드
	String accountNum;
	int balance=0;
	String name;
	
	//생성자
	public Account(String accountNum, int balance, String name){	
		this.accountNum = accountNum;
		this.balance = balance;
		this.name = name;
	}
	
	//Getter 메소드
	public String getName() {
		return name;
	}
	public String getAccountNum() {
		return accountNum;
	}

	//입금
	public void deposit(int money) {
		System.out.println(money+"원 입금합니다.");
		this.balance += money;
		System.out.println("입금완료");
	}
	
	//출금
	public void withdraw(int money) {
	 System.out.println(money+"원 출금합니다.");
	 if(money > balance) {
		 System.out.println("잔액 부족");
	 }else {
		 this.balance -= money;
		 System.out.println("출금 완료");
	 } 
	}

	// 잔액 조회
	public void checkMyBalance() {
	 System.out.println("잔액을 조회합니다.");
	 System.out.println("잔액 : "+this.balance);
	}
}
package quiz;

import java.util.Scanner;

public class AccountEx {
	static Scanner scan = new Scanner(System.in);
	static Account[] accounts = new Account[100];// 100명분 계좌를 저장할 수 있는 배열

	public static void main(String[] args) {
		boolean run =true;
		while(run) {
			System.out.println("그린 뱅크에 오신것을 환영합니다.");
			System.out.println("메뉴를 선택해 주세요.");
			System.out.println("1. 계좌 생성");
			System.out.println("2. 계좌 업무");
			System.out.println("3. 종료");
			System.out.print("선택>");
			
			int selectMenu = Integer.parseInt(scan.nextLine());
			switch(selectMenu) {
			case 1: // 계좌 생성 기능
				System.out.println("계좌를 생성합니다.");
				System.out.println("예금주 이름을 입력하세요.");
				System.out.print(">");
				String name = scan.nextLine();
				System.out.println("계좌번호를 입력하세요.");
				System.out.print(">");
				String accountNum = scan.nextLine();
				System.out.println("초기 입금액을 입력하세요.");
				System.out.print(">");
				int balance = Integer.parseInt(scan.nextLine());
				
				Account newAccount = new Account(accountNum,balance,name);
				for(int i=0;i<accounts.length;i++) {
					if(accounts[i]==null) {
						accounts[i]=newAccount;
						break;
					}
				}
				System.out.println("계좌 생성");
				break;
			case 2: // 계좌 업무  : 입금, 출금, 조회
				int chkAccIdx = -1;
				System.out.println("사용하고자 하는 계좌 번호를 입력하세요.");
				System.out.print(">");
				String selectAccountNum = scan.nextLine();
				for(int i=0;i<accounts.length;i++) {
					if(accounts[i] == null) {
						continue;
					}else if(accounts[i].getAccountNum().equals(selectAccountNum)){
						chkAccIdx = i;
						break;
					}
				}
				if(chkAccIdx == -1) {
					System.out.println("해당 계좌를 찾을수 없습니다.");
				}else {
					//bankFunction() 실행
					bankFunction(chkAccIdx);
				}				
				break;
			case 3: //종료
				System.out.println("프로그램 종료합니다.");
				run = false;
				break;
			default:
				System.out.println("잘못 입력했습니다.");
				System.out.println("다시 확인해 주세요.");
			}
		}

	}
	
	private static void bankFunction(int chkAccIdx) {
		//실제 계좌를 가지고 업무를 사용하는 메서드
		while(true) {
			System.out.println(accounts[chkAccIdx].getName()+"님 환영합니다.");
			System.out.println("업무를 선택하세요.");
			System.out.println("1. 입금");
			System.out.println("2. 출금");
			System.out.println("3. 잔액 조회");
			System.out.println("0. 메인메뉴 돌아가기");
 			System.out.print(">"); 			
 			int selectNum = Integer.parseInt(scan.nextLine());
			int money = 0;
			switch(selectNum) {
			case 1://입금
				System.out.println("입금 금액을 입력하세요.");
				money = Integer.parseInt(scan.nextLine());
				accounts[chkAccIdx].deposit(money);
				break;
			case 2://출금
				System.out.println("출금 금액을 입력하세요.");
				money = Integer.parseInt(scan.nextLine());
				accounts[chkAccIdx].withdraw(money);
				break;
			case 3://조회
				accounts[chkAccIdx].checkMyBalance();
				break;
			case 0:
				System.out.println("메인 메뉴로 돌아갑니다.");
				return;
			default:
				System.out.println("잘못 입력했습니다.");
				System.out.println("다시 확인해 주세요.");
			}
		}
	}
}

Quiz. MonthScheduleEx.java

문제 설명

하루의 할 일을 표현하는 클래스 Day는 다음과 같이 주어진다.

Day 클래스

더보기
class Day {
    private String work;   // 하루의 할 일을 나타내는 문자열

    public void set(String work) {
        this.work = work;
    }

    public String get() {
        return work;
    }

    public void show() {
        if (work == null)
            System.out.println("없습니다.");
        else
            System.out.println(work + "입니다.");
    }
}

Day 클래스는 하루의 할 일을 저장하고 출력하는 기능을 가진다.


과제 내용

한 달의 할 일을 관리하는 클래스 MonthSchedule을 작성하시오.

MonthSchedule 클래스는 Day 객체 배열을 이용하여 한 달 동안의 일정을 관리해야 하며,
사용자로부터 입력을 받아 다음과 같은 세 가지 기능을 제공해야 한다.

  1. 할 일 입력
  2. 할 일 보기
  3. 프로그램 종료

요구 사항

1. MonthSchedule 클래스

  • Day 객체 배열을 필드로 가진다.
  • 생성자를 통해 한 달의 날짜 수를 전달받는다.
  • 다음 메서드를 반드시 포함한다.

메서드명기능

input() 날짜와 할 일을 입력받아 저장
view() 날짜를 입력받아 해당 날짜의 할 일 출력
finish() 프로그램 종료 메시지 출력
run() 메뉴를 출력하고 기능을 반복 실행

2. MonthScheduleEx 클래스

  • main() 메서드를 포함하는 실행 클래스이다.
  • MonthSchedule 객체를 생성하고 run() 메서드를 호출한다.
MonthSchedule april = new MonthSchedule(30);
april.run();

실행 예시

더보기
이번달 스케쥴 관리 프로그램.
할일(입력:1, 보기:2, 끝내기:3) >>1
날짜(1~30)?8
할일(빈칸없이입력)?공부

할일(입력:1, 보기:2, 끝내기:3) >>1
날짜(1~30)?15
할일(빈칸없이입력)?놀기

할일(입력:1, 보기:2, 끝내기:3) >>2
날짜(1~30)?15
15일의 할 일은 놀기입니다.

할일(입력:1, 보기:2, 끝내기:3) >>2
날짜(1~30)?8
8일의 할 일은 공부입니다.

할일(입력:1, 보기:2, 끝내기:3) >>3
프로그램을 종료합니다.

 

더보기
package quiz;

public class Day {
        private String work; // 하루의 할 일

        public void set(String work) {
            this.work = work;
        }

        public String get() {
            return work;
        }

        public void show() {
            if (work == null)
                System.out.println("없습니다.");
            else
                System.out.println(work + "입니다.");
        }
    }
package quiz;

import java.util.Scanner;

public class MonthSchedule {
	private Scanner sc =new Scanner(System.in, "EUC-KR");
	private Day days[];
	
	MonthSchedule(int day) {
		this.days = new Day[day];  
		for(int i=0; i<days.length; i++) {
			days[i] = new Day();
		}
		sc = new Scanner(System.in);
	}
	
	private void input() {
		System.out.print("날짜(1~30)?");
		int day = sc.nextInt();
		System.out.print("할일(빈칸없이입력)?");
		String work = sc.next();
      	day--;  //index num 맞추기 위해
      	if(day < 0 || day > 30) { 
      		System.out.println("날짜를 잘못 입력하였습니다.");
      		return;
      	}
      	days[day].set(work);
	}
	
	private void view() {
		System.out.print("날짜(1~30)?");
		int day = sc.nextInt();
		day--;
		if(day < 0 || day > 30) { // 0~29
			System.out.println("날짜를 잘못 입력하였습니다.");
			return;
		}
      	System.out.print((day+1)+"일의 할 일은 ");
      	days[day].show();
	}
	
	private void finish() {
		System.out.println("프로그램을 종료합니다.");
		sc.close();
	}

	public void run() {
		System.out.print("이번달 스케쥴 관리 프로그램.");
		while(true) {
			System.out.println();
			System.out.print("할일(입력:1, 보기:2, 끝내기:3) >>");
			int select = sc.nextInt();
			switch(select) {
				case 1: input(); break;
				case 2: view(); break;
				case 3: finish(); return;
			}
		}
	}


}
package quiz;


public class MonthScheduleEx {

    public static void main(String[] args) {
        MonthSchedule april = new MonthSchedule(30);
        april.run();
    }
}

[상속과 다형성]

객체 지향 프로그램에서 부모 클래스의 멤버를 자식 클래스에게 물려줄 수 있다.


 상속
- 이미 개발된 클래스를 재사용하여 새로운 클래스를 만들기에 중복되는 코드를 줄임
- 부모 클래스의 한번의 수정으로 모든 자식 클래스까지 수정되는 효과가 있어 유지보수 시간이 줄어듬

 

 클래스 상속
▪ 자식 클래스 선언 시 부모 클래스 선택
▪ extends 뒤에 부모 클래스 기술
▪ 여러 개의 부모 클래스 상속할 수 없음
▪ 부모 클래스에서 private 접근 제한 갖는 필드와 메소드는 상속 대상에서 제외
▪ 부모와 자식 클래스가 다른 패키지에 존재할 경우 default 접근 제한된 필드와 메소드 역시 제외

 

[부모 생성자 호출]

❖ 자식 객체 생성할 때 부모 객체가 먼저 생성되고 그 다음 자식 객체가 생성됨
▪ 자식 생성자의 맨 첫 줄에서 부모 생성자가 호출됨
▪ 명시적으로 부모 생성자 호출하려는 경우

 

예제 코드 CellPhone ↓

더보기
package sec01;

public class CellPhone {
	//필드
	String model;
	String color;
	
	//생성자 생략
	
	// 메소드
	void powerOn() { System.out.println("전원을 켭니다"); }
	void powerOff() { System.out.println("전원을 끕니다"); }
	void bell() { System.out.println("벨이 울립니다"); }
	void sendVoice(String message) { System.out.println("자기: " + message); }
	void receiveVoice(String message) { System.out.println("상대방 : " + message); }
	void hangUP() { System.out.println("전화를 끊습니다"); }
}
package sec01;

public class DmbCellPhoneEx {

	public static void main(String[] args) {
//		DmbCellPhone 객체 생성
		DmbCellPhone dmbCellPhone = new DmbCellPhone("자바폰", "검정", 10);
		
//		CellPhone으로 부터 상속 받은 필드
		System.out.println("모델: " + dmbCellPhone.model);
		System.out.println("색상: " + dmbCellPhone.color);
		
//		DmbCellPhone의 필드
		System.out.println("채널: " + dmbCellPhone.channel);
		
//		CellPhone으로부터 상속 받은 메소드 호출
		dmbCellPhone.powerOn();
		dmbCellPhone.bell();
		dmbCellPhone.sendVoice("여보세요");
		dmbCellPhone.receiveVoice("안녕하세요! 저는 홍길동인데요");
		dmbCellPhone.sendVoice("아~ 예 반갑습니다.");
		dmbCellPhone.hangUP();
		
//		DmbCellPhone의 메소드 호출
		dmbCellPhone.turnOnDbm();
		dmbCellPhone.changeChannelDmb(12);
		dmbCellPhone.turnOffDmb();

	}

}
package sec01;

public class DmbCellPhone extends CellPhone{
	//필드
	int channel;
	
	// 생성자
//	DmbCellPhone() {
//		super();
//	}
//	
	DmbCellPhone(String model, String color, int channel) {
		this.model = model;
		this.color = color;
		this.channel = channel;
	}
	
	// 메소드
	void turnOnDbm() {
		System.out.println("채널 " + channel + "번 DMB 방송 수신을 시작합니다.");
		
	}
	void changeChannelDmb(int channel) {
		this.channel = channel;
		System.out.println("채널  " + channel + "번으로 바꿉니다.");
	}
	void turnOffDmb() {
		System.out.println("DMB 방송 수신을 멈춥니다.");
	}
}

예제 코드 People ↓

더보기
package sec01;

public class People {
	public String name;
	public String ssn;
	
	public People(String name, String ssn) {
		this.name = name;
		this.ssn = ssn;
	}
}
package sec01;

public class StudentEx {

	public static void main(String[] args) {
		Student student = new Student("홍길동", "123456-1234567", 1);
		System.out.println("name : " + student.name);
		System.out.println("ssn: " + student.ssn);
		System.out.println("studentNo : " + student.studentNO);

	}

}
package sec01;

public class Student extends People{
	public int studentNO;
	
	public Student(String name, String ssn, int studentNo) {
		super(name, ssn);
		this.studentNO = studentNo;
	}
}

[메소드 재정의]

메소드 재정의(오버라이딩 / Overriding)
▪ 부모 클래스의 메소드가 자식 클래스에서 사용하기에 부적합할 경우 자식 클래스에서 수정하여 사용
▪ 메소드 재정의 방법
• 부모 메소드와 동일한 시그니처 가져야 함
• 접근 제한 더 강하게 재정의할 수 없음
• 새로운 예외를 throws 할 수 없음
▪ 메소드가 재정의될 경우 부모 객체 메소드가 숨겨지며, 자식 객체에서 메소드 호출하면 재정의된 자식 메소드가 호출됨

 

예제코드 Airplane

더보기
package sec01;

public class Airplane {
	public void land() {
		System.out.println("착륙합니다.");
	}
	
	public void fly() {
		System.out.println("일반비행합니다.");
	}
	
	public void takeOff() {
		System.out.println("이륙합니다.");
	}
}
package sec01;

public class SupersonicAirplaneEx {

	public static void main(String[] args) {
		SupersonicAirplane sa = new SupersonicAirplane();
		sa.takeOff();
		sa.fly();
		sa.flyMode = SupersonicAirplane.SUPERSONIC;
		sa.fly();
		sa.flyMode = SupersonicAirplane.NORMAL;
		sa.fly();
		sa.land();

	}

}
package sec01;

public class SupersonicAirplane extends Airplane{
	public static final int NORMAL = 1;
	public static final int SUPERSONIC = 2;
	public int flyMode = NORMAL;
	
	@Override
	public void fly() {
		if(flyMode == SUPERSONIC) {
			System.out.println("초음속비행합니다.");
		} else {
//			Airplane 객체의 fly() 메소드 호출
			super.fly();
		}
	}
}

 

[부모 메소드 호출]

- 자식 메소드 내에서 super 키워드와 도트(.) 연산자를 사용하면 숨겨진 부모 메소드를 호출
- 부모 메소드를 재사용함으로써 자식 메소드의 중복 작업 내용을 없애는 효과

 

[Overiding vs Overloading]

Overloading / 확장 : 같은 이름의 메서드 여러 개를 가지면서 매개변수의 유형과 개수가 다르도록 사용하는 것

Overriding / 재정의 : 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용하는 것

'대우개발원 수업 내용 > Java 정리' 카테고리의 다른 글

Java 개념 정리 13일차  (1) 2026.01.15
Java 개념정리 12일차  (2) 2026.01.15
Java 개념정리 10일차  (1) 2026.01.12
Java 개념정리 9일차  (1) 2026.01.12
Java 개념정리 8일차  (0) 2026.01.12