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

결과


'* Programming > JAVA' 카테고리의 다른 글

DAY10 업다운 게임  (0) 2016.07.18
DAY10 Class/생성자  (0) 2016.07.18
Apache Ant  (0) 2016.07.13
DAY8 클래스 메소드  (0) 2016.07.13
DAY 7 문제  (0) 2016.07.12

8일차 강의 정리


1. static 메소드(클래스 메소드)

public static 자료형 메소드명(인자){ }

메소드 의미 - 기능요소를 분리

자료형의 결정은 return xx; 중 xx에 의해 결정

단, return 없거나(생략) reuturn; 인 경우 void

public class Ex01 {

public static void main(String[] args) {

func1(hap());                            //함수 func1 호출

System.out.println("---------------");

System.out.println(sum(hap())); //3+3

System.out.println("---------------");

System.out.println(sum(sum(hap())));//6+6

System.out.println("---------------");

System.out.println(sum(sum(sum(hap()))));//12+12

}//main end


static void func1(int a){

System.out.println("func1");

if(a>10)return; //return 을 만나면 아래의 소스 실행 X

System.out.println("a>10이라서 실행!!");

return;

}//func1 end

static int hap(){ //return 3

return 1+2;

}//hap end

static int sum(int a){

int add = a+a;

System.out.println(a+"+"+a+"="+add);

return add;

}//sum end

}//class end

결과

소스(return 과 break 의 차이)

public class Ex02 {

public static void main(String[] args) {

func1(10);                //func1 호출

}//main end

static void func1(int a){

while(a<20){

System.out.println("run"+a++);

if(a>15)break; //break->a출력 O / reuturn->a출력 X

}

System.out.println("aaaaaaaa");

}//func1 end

}//class end

결과(break 경우)

결과(빨간 부분 return으로 변경한 경우)

*재귀함수

재귀함수는 자바에는 존재 하지않지만 재귀함수 처럼 작성이 가능하다

소스

public class Ex03 {

public static void main(String[] args) {

//재귀함수(나를 다시 호출)

//메소드 == 함수

say(5);

}//main end

static void say(int a){ //재귀함수

System.out.println("say hello");

if(a==1){return;}

say(--a); //다시 호출

}

}

결과

재귀함수이용한 문제

Q. 7+6+5+4+3+2+1=?

public class Ex03 {

public static void main(String[] args) {

qus(7,0);

//System.out.println(say(7));

}//main end

static void qus(int a,int sum){

System.out.print(a);

sum +=a;

if(a>1){

System.out.print("+");

}else {

System.out.print("="+sum);

return;}

qus(--a,sum);

}

//다른방법

/* static int say(int a){

if(a==1){

System.out.print(a+"=");

return 1;

}else{

System.out.print(a+"+");

}

return a+say(--a);

}*/

}//class end

결과


2. non-static 메소드

public 자료형 메소드명(인자){ }

static메소드는 static메소드 끼리의 접근만 허용

static메소드에서 non-static메소드로 접근하려면 

클래스명 변수명 = new 클래스명(); 으로 생성된 변수를 통해서만 실행가능

반면, non-static메소드에서는 non-static메소드 접근 허용하며

또한 static으로의 호출도 허용

소스

public class Ex01 {

public static void main(String[] args) {

//func1(); //오류

Ex01 ex = new Ex01(); //static 없는 함수 func1 사용하는 방법(참조변수를 생성을 해야가능)

ex.func1(); //func1 호출(다른 클래스에서 호출이 불가)

System.out.println("----------------------");

ex.func2(100);

System.out.println("----------------------");

Ex01 ex1 = new Ex01();        //재선언

ex1.func2(50);

System.out.println("----------------------");

Ex01.prn(); //static 있는 함수 prn() 사용(내 클래스(Ex02)안의 static이기 때문에 "Ex02."생략가능)

}//main end


static void prn(){

System.out.println("난스태틱");

Ex01 me = new Ex01(); //여기서도 참조변수 생성 static에서 non-static을 사용하기위해

me.func1(); //non-static 호출

}//prn end

void func1(){

System.out.println("func1 호출");

}//func1 end

void func2(int a){

prn(); //non-static 에서 static메소드 호출은 그냥해도 ok

func1(); //main에서 이미 참조변수 생성해서 ok

System.out.println(a+"을 인자로 전달받은 메소드");

}//func2 end

}//class end

결과

소스(Scanner 사용)

import java.util.Scanner;     //Scanner를 사용하기 위한 import


public class Ex02 {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in); //Scanner 선언

Ex01 func = new Ex01(); //non-static 메소드를 사용하기 위해 

System.out.print("첫번째 수: ");

String input1 = sc.nextLine(); //입력

System.out.print("연산자: ");

String input2 = sc.nextLine(); //입력

System.out.print("두번째 수: ");

String input3 = sc.nextLine(); //입력


int a = Integer.parseInt(input1); //첫번째 숫자 String 형에서 int 형으로 변환

int b = Integer.parseInt(input3); //두번째 숫자 String 형에서 int 형으로 변환


func.cal(a, input2, b); //메소드 호출

}

void cal(int a,String s, int b){

switch(s){

case "+":

System.out.println(a+"+"+b+"="+(a+b));

break;

case "-":

System.out.println(a+"-"+b+"="+(a-b));

break;

case "*":

System.out.println(a+"X"+b+"="+(a*b));

break;

case "/":

System.out.println(a+"÷"+b+"="+(a/b));

break;

default:

System.out.println("잘못입력하셨습니다.");

}//switch end

}//cal end

}//class end

결과

새로운 내용!

Scanner 사용하여 입력을 콘솔 창에서 받는다


'* Programming > JAVA' 카테고리의 다른 글

DAY9 멤버필드  (0) 2016.07.15
Apache Ant  (0) 2016.07.13
DAY 7 문제  (0) 2016.07.12
DAY6 random 함수  (0) 2016.07.12
DAY6 문제  (0) 2016.07.12

+ Recent posts