9일차 강의 정리
DAY8, DAY9 는 클래스의 구성요소에 대해 다룬다
1. 멤버필드(멤버변수,전역변수)/지역변수
소스
public class Ex01 {
public int a = 100; //멤버필드 - 인스턴스변수
int c;
//c=5; //분리하면 오류
public static int b = 50; //멤버필드 - 클래스변수
public static void main(String[] args) {
func1(); //static 메소드 호출
Ex01 me = new Ex01(); //클래스이름 (...) = new 클래스이름(); 선언
me.func2(); //non - static 메소드 호출
}//main end
//클래스 메소드,static 메소드
public static void func1(){
System.out.println("나는 static");
//System.out.println("멤버 필드는 a="+a); //오류
System.out.println("멤버 필드는 b="+b); //static 끼리는 가능
Ex01 me = new Ex01();
int temp=me.a; //클래스의 a 를 가져와 temp에 저장
System.out.println("멤버 필드는 a="+temp); //이렇게 사용해야 가능
}
//인스턴스메소드,non-static 메소드
public void func2(){ //static 과 non 은 오버로드가 안됨 그래서 이름 변경
System.out.println("나는 non-static");
System.out.println("멤버 필드는 a="+a);
System.out.println("멤버 필드는 b="+b); //static 변수는 사용가능
}
}//class end
static 변수,static메소드 간의 호출 및 사용은 가능하지만 non - static 변수,메소드를 사용하기 위해서 객체를 선언해야 사용이 가능
하지만 반대로 non - static 변수,메소드는 객체 선언을 하지않아도 static 변수,메소드를 사용가능하다
결과
소스
public class Ex02 {
int a=0; //멤버필드
public static void main(String[] args) {
Ex02 me = new Ex02();
/*Ex02 me; //선언(참조변수의 선언)
me = new Ex02(); //초기화
*/
me.func1();
me.func1();
me.func2();
System.out.println("a="+me.a); //멤버필드
int a=1;
System.out.println("a="+a); //지역변수
int temp=me.func3();
System.out.println("func3:"+temp); //지역변수
}//main end
public void func1(){
a++;
}
public void func2(){
a += 10;
}
public int func3(){
int a=0; //지역변수
a += 100; //우선순위 : 지역변수 > 멤버필드
return a;
}
}//class end
지역변수와 멤버필드의 변수명이 동일할 경우
우선순위가 지역변수>멤버필드 이다
결과
소스
public class Ex03 {
int a=0;
public static void main(String[] args) {
Ex03 me; //선언(참조변수의 선언)
me = new Ex03(); //초기화
System.out.println(me.a);
me.a++;
System.out.println(me.a);
me = new Ex03();
System.out.println(me.a);
String st = null; //null != ""
Scanner sc = null;
sc = new Scanner(System.in);
}//main end
}//class end
참조변수의 선언을 다시 하게되면 다시 초기값을 갖게된다
2. 문제
Q1. 은행 입출금하기
* static 메소드 이용
소스
import java.util.*;
public class Ex03 {
static int money=0;
public static void main(String[] args) {
System.out.println("환영합니다.");
bankCD(); //bankCD() 호출
}//main end
public static void bankCD(){
boolean tf = true;
while(tf){
System.out.println("------------------------------------");
System.out.println("1. 입금 2. 출금 3. 계좌확인 0. 종료");
System.out.println("------------------------------------");
Scanner sc = new Scanner(System.in);
System.out.print("메뉴선택:");
String st = sc.nextLine(); //메뉴 입력
int input = Integer.parseInt(st); //문자열을 정수형으로 변환
int input2;
switch(input){
case 1: //입금
System.out.print("입금 금액: ");
input2 = Integer.parseInt(sc.nextLine());
func1(input2);
break;
case 2: //출금
System.out.print("출금 금액: ");
input2 = Integer.parseInt(sc.nextLine());
func2(input2);
break;
case 3: //계좌확인
System.out.println("현재 은행 잔고는 "+money+"입니다.");
break;
case 0: //종료
tf=false;
System.out.println("종료합니다.이용해 주셔서 감사합니다.");
break;
default: //입력오류
System.out.println("입력범위는 0-3 입니다.");
}//switch end
}
}
public static void func1(int a){ //입금 기능
money += a ;
}
public static void func2(int a){ //출금 기능
money -= a ;
}
}//class end
결과
* non - static 메소드 이용
소스
import java.util.Scanner;
public class Ex04 {
int money=0;
boolean tf = true;
public static void main(String[] args) {
System.out.println("***어서 오십시오 환영합니다***");
Ex04 me = new Ex04();
while(me.tf){
me.bankCD();
}
System.out.println("종료합니다.이용해 주셔서 감사합니다.");
}//main end
public void bankCD(){
System.out.println("------------------------------------");
System.out.println("1.입금 2.출금 3.계좌확인 0.종료");
System.out.println("------------------------------------");
Scanner sc = new Scanner(System.in);
System.out.print("메뉴선택:");
String st = sc.nextLine();
int input = Integer.parseInt(st);
int input2;
String yn;
switch (input) {
case 1: // 입금
System.out.print("입금 금액: ");
input2 = Integer.parseInt(sc.nextLine());
System.out.print(input2 + "원 을 입금하시겠습니까(y/n)?");
yn = sc.nextLine();
if (yn.equals("y")) {
func1(input2); // non - non 끼리 단순 호출가능
System.out.println(input2 + "원 입금되셨습니다.");
}
else { //취소
System.out.println("입금이 취소 되셨습니다.");
}
break;
case 2: // 출금
System.out.print("출금 금액: ");
input2 = Integer.parseInt(sc.nextLine());
System.out.print(input2 + "원 을 출금하시겠습니까(y/n)?");
yn = sc.nextLine();
if (yn.equals("y")) {
func2(input2);
System.out.println(input2 + "원 출금되셨습니다.");
} else { //취소
System.out.println("출금이 취소 되셨습니다.");
}
break;
case 3: // 계좌확인
System.out.println("현재 은행 잔고는 " + money + "원 입니다.");
break;
case 0: // 종료
tf = false;
break;
default: // 입력오류
System.out.println("입력범위는 0-3 입니다.");
}// switch end
}//bankCD end
public void func1(int a){ //예금기능
money += a ;
}//func1 end
public void func2(int a){ //출금기능
money -= a ;
}//func2 end
}//class end
결과
위의 소스와 동일
Q2. 자재관리 프로그램
아이스크림 공장 -> 관리대상 - 물,설탕
아이스크림 1box 당 - 물 3리터, 설탕 2그램
1.입고 2.출고 3.생산 가능량(capa) 4. 종료
소스
import java.util.*;
public class Ex05 {
int water=0;
int sugar=0;
boolean tf = true;
String menu = "1.입고 2.출고 3.생산 가능량 4.생산 출고 0.종료";
public static void main(String[] args) {
Ex05 me = new Ex05();
System.out.println("자재관리시스템(아이스크림 공장)(v1.1.1)");
me.factory(); //메소드 호출
System.out.println("종료합니다.이용해 주셔서 감사합니다.");
}//main end
void factory(){
Scanner sc = new Scanner(System.in); //모든 선언은 반복문 밖에 넣는게 효율적
int input;
int input2;
while(tf){
System.out.println();
System.out.println("--------------------------------------------------");
System.out.println(menu);
System.out.print(">>>");
input = Integer.parseInt(sc.nextLine());
switch(input){
case 1: //입고
System.out.print("입고할 물품 물(1),설탕(2) 중 선택:");
input2 = Integer.parseInt(sc.nextLine());
func1(input2);
break;
case 2: //출고
System.out.print("출고할 물품 물(1),설탕(2) 중 선택:");
input2 = Integer.parseInt(sc.nextLine());
func2(input2);
break;
case 3: //생산가능량
func3();
break;
case 4: //생산출고
System.out.print("생산 할 BOX 입력:");
input2 = Integer.parseInt(sc.nextLine());
func4(input2);
func3();
break;
case 0: //종료
tf = false;
break;
default: //입력오류
System.out.println("입력범위는 0-3 입니다.");
}//switch end
}//while end
}//factory end
public void func1(int a){ //입고 기능
Scanner sc = new Scanner(System.in);
int in;
if(a==1){
System.out.print("입고할 물의 l 수 입력:");
in = Integer.parseInt(sc.nextLine());
water += in;
}else if(a==2){
System.out.print("입고할 설탕의 g 수 입력:");
in = Integer.parseInt(sc.nextLine());
sugar += in;
}else{
System.out.println("잘못입력하셨습니다.");
}
}//func1 end
public void func2(int a){ //출고 기능
Scanner sc = new Scanner(System.in);
int out;
if(a==1){
System.out.print("출고할 물의 l 수 입력(max:"+water+"):"); //출고량이 - 가 되지않게 조건달아주기 if()
out = Integer.parseInt(sc.nextLine());
water -= out;
}else if(a==2){
System.out.print("출고할 설탕의 g 수 입력(max:"+sugar+"):");
out = Integer.parseInt(sc.nextLine());
sugar -= out;
}else{
System.out.println("잘못입력하셨습니다.");
}
}//func2 end
public void func3(){ //생산가능량 아이스크림 1box 당 - 물 3리터, 설탕 2그램
System.out.print("생산 가능량은 물:"+water+"l 설탕:"+sugar+"g 으로");
if(water>=3 && sugar>=2){
if(water/3<sugar/2){
System.out.println(water/3+" BOX 입니다.");
}else{
System.out.println(sugar/2+" BOX 입니다.");
}
}else{
System.out.println("0 BOX 입니다.");
}
}//func3 end
public void func4(int i){ //생산 출고
water -= i*3;
sugar -= i*2;
}//func4 end
}//class end
결과