1. 메서드의 정의 & 용법

 현재까지 자바를 공부하면서 다른 언어들과는 다른 규칙들이 있는 것을 알 수 있었습니다. 모든 코드는 클래스라는 파일 안에 작성되고 실질적으로 이루어지는 내용은 main함수 안에 작성해야 이뤄지는 것을 알 수 있었습니다. 메서드란 쉽게 말해서 C언어에서 함수라고 불리는 부분을 메서드라고 부를 수 있습니다. 하지만 C언어에서와 마찬가지로 한 메서드 안에 많은 양의 코드를 작성하는 것은 비효율적이고 복잡하기 때문에 이를 단순화하기 main메서드 외의 다른 메서드를 만들어 사용합니다. 우선 메서드의 형태를 알아보도록 하겠습니다.

 

 - 접근_제한자 [ 지정 예약어 ] 반환형 메서드명( 매개_변수 ) [ throws 예외_클래스들 ]

   {

     내용;

   }

 

 위의 메서드 형식을 자세하게 알 필요는 없습니다. 물론 다양한 요소들이 바뀔 수 있지만 이는 추후에 여러 예제를 보고 더 공부하게 되면 자연스레 알게 되는 것이므로 아래의 형식만을 살펴보도록 하겠습니다.

 

 - public static 반환형 메서드명 ( 매개_변수들 ) [ throws 예외_클래스들 ] 

   { 

     내용;

   }

 

 앞서 보았던 형식과는 크게 다른 것은 없지만 접근 제한자를 public 으로 사용하고 지정 예약어를 static으로 고정한다는 것이 약간 다릅니다. 여기서 알고 넘어가야 할 것은 static 메서드는 static 메서드에서만 사용이 가능하다는 것입니다. 이는 main메서드는 static으로 선언되어 있으므로 main메서드에서 다른 메서드를 호출하여 사용하려면 어쩔 수 없이 static으로 선언되어야 합니다.

 

 1] 반환형

  반환형이란 메서드가 내용을 실행하고 되돌려주는 값을 의미합니다. 때문에 main메서드나 다른 메서드에서 해당 메서드를 호출했다면 내용을 실행하고 다시 자신을 호출했던 메서드에게 결과값을 돌려주어야 합니다. 이때 반환형에는 void를 포함한 여러 자료형이 올 수 있지만 void를 사용했다면 아무것도 돌려주지 않아도 된다는 의미이고, 자료형으로 선언했다면 결과값을 각 자료형에 맞게 반환해주면 됩니다.

 

 2] 메서드명

  메서드명이라는 것은 일련의 이름이기 때문에 main메서드를 제외한 메서드의 이름은 사용자가 임의로 지정할 수 있습니다. 

 

 3] 매개 변수

  매개 변수라는 것은 메서드가 실행될 때 안의 내용을 수행하기 위해 필요로 하는 값을 호출과 동시에 넘겨주는 것입니다. 이는 사용자가 메서드를 어떻게 작성하느냐에 따라 필요할 수도, 필요하지 않을 수도 있습니다.

 

 4] 에외 클래스

  앞서 입력과 출력을 처리할 때에는 '예외처리'라는 것을 해주어야 한다는 것을 배웠습니다. 이는 main메서드에서만 해당되는 것이 아니기 때문에 다른 메서드에서도 필요시 입력해주어야 합니다.

 

 이제 예제를 통해 실질적으로 어떻게 사용되는지에 대해 알아보도록 하겠습니다.

public class Round07_Ex01 {

	public static void x() {
		for(int i=0; i<5; i++) 
			System.out.print("*");
		return;   // 반환형이 void인 경우에는 생략 가능
	}
	
	public static void main(String[] args) {
		
		x();
		System.out.println("\nHello");
		x();
		System.out.println("\nJava");
		x();
		System.out.println("\n!");
		x();
		return;   // main메소드에도 원래는 이 구문이 있어야 하지만 자동 생략
	
	}

}

 위의 코드의 결과를 살펴보면 아래와 같습니다.

 위처럼 메서드를 사용했을 때의 결과를 알 수 있습니다. 만약 이러한 결과가 나오기 위한 코드를 작성할 때 메서드를 사용하지 않고 main메서드 안에서만 해결하려 했다면 for문을 각 문장사이마다 출력해야 하는 번거로움이 있었을 것입니다. 이렇게 메서드를 사용하는 것을 수학에서의 치환과정과 같다고 볼 수 있습니다.

 

 위의 코드를 보면 메서드 x()와 main()의 반환형은 void인 것을 알 수 있는데 이때는 return;을 써주지 않아도 정상적으로 작동하는 것을 확인할 수 있습니다.

 

2. 메서드의 종류

 메서드는 어떤 방식으로 호출되느냐에 따라 크게 3가지로 나눌 수 있습니다. 앞서 봤던 코드처럼 단순한 이름을 호출함으로써 실행되는 'Call By Name', 이름에 매개변수가 추가되어 데이터를 처리하는 'Call By Value', 객체의 주소를 이용해 내용 데이터를 변화시키는 'Call By Reference'가 있습니다. 'Call By Reference'는 알아야 할 요소가 많으므로 추후에 배우도록 하겠습니다.

 

 'Call By Name'은 이름을 통해 메서드를 호출하는 방식으로, public static void aaa() 와 같이 매개 변수 없이 이름만으로 호출이 가능한 메서드가 'Call By Name'에 해당됩니다.

 

 'Call By Value'는 메서드의 매개 변수를 이용하는 방식으로 각 매개 변수는 개수, 자료형에 대한 제한이 없고 클래스형이 사용되어도 무관합니다.

 

3. 반환형

 반환형이라는 것은 해당 메서드가 실행이 완료된 후 반환하는 값을 말합니다. 대표적인 예로 2개의 수를 입력받아 더 큰 수를 반환하는 메서드가 있습니다. 이렇게 결과값의 반환이 필요한 메서드에서는 return이라는 에약어를 통해 결과값을 리턴합니다.

 

 이제 이러한 모든 것들을 섞어놓은 예제를 보도록 하겠습니다.

import java.io.IOException;
import java.util.Scanner;

public class Round07_Ex02 {
	
	public static int aaa() throws IOException {  // 둘 중 큰 수를 출력하는 함수
		
		Scanner sc = new Scanner(System.in);
		System.out.print("첫번째 수 : ");
		int a = sc.nextInt();
		System.out.print("두번째 수 : ");
		int b = sc.nextInt();
		
		if(a>b) 
			return a;
		return b;

	}
	
	public static void bbb() throws IOException {  // 두 수 사이의 합을 구하는 함수
		
		Scanner sc = new Scanner(System.in);
		System.out.print("첫번째 수 : ");
		int a = sc.nextInt();
		System.out.print("두번째 수 : ");
		int b = sc.nextInt();
		
		int tot = 0;
		if(a>b) {
			int tmp = a;
			a = b;
			b = tmp;
		}
		
		for(int i=a; i<=b; i++) 
			tot+=i;
		
		System.out.println(a+" - "+b+"사이의 합 : "+tot);
		
	}
	
	public static String ccc(int x, int y, int z) {  // 세 수를 내림차순으로 정렬하는 함수
		if(y>=x&&y>=z) {
			int tmp = x;
			x = y;
			y = tmp;
		} else if(z>=x&&z>=y) {
			int tmp = x;
			x = z;
			z = tmp;
		}
		
		if(z>=y) {
			int tmp = y;
			y = z;
			z = tmp;
		}
		
		String abc = x+">="+y+">="+z;
		return abc;
	}

	public static void main(String[] args) throws IOException {  // 메인 함수
		
		Scanner sc = new Scanner(System.in);
		int x = 0;
		
		while(true) {
			System.out.print("1.최대수  2.사이합  3.수나열  4.종료 : ");
			x = sc.nextInt();
			if(x == 1) {
				int k = aaa();  // 1이 입력되면 aaa함수 호출
				System.out.println("둘 중 최대수는 "+k+"입니다");
			} else if(x == 2)
				bbb();  // 2가 입력되면 bbb함수 호출
			else if(x == 3) {
				System.out.print("첫번째 수 : ");
				int first = sc.nextInt();
				System.out.print("두번째 수 : ");
				int second = sc.nextInt();
				System.out.print("세번째 수 : ");
				int third = sc.nextInt();
				String str = ccc(first, second, third);  // 3이 입력되면 세 수를 입력받고 ccc함수를 호출하면서 매개변수로 전달
				System.out.println("내림차순은 : "+str);
			} else if(x == 4)
				break;  // 4가 입력되면 탈출
			else
				System.out.println("잘못 입력하셨습니다");
			
			System.out.println();
		}
		
	}

}

 위의 코드는 1~4부터 까지의 숫자 중 하나를 입력받아 각 숫자에 맞는 메서드를 실행하는 프로그램입니다. aaa는 더 큰 수를 출력하는 메서드이고, bbb는 두 수 사이의 합을, ccc는 세 수를 내림차순으로 정렬하는 메서드입니다. 이러한 메서드를 통해 코드를 더 효율적이고 간단하게 생성할 수 있습니다.

'프로그래밍 > JAVA' 카테고리의 다른 글

자바 배열  (0) 2019.04.25
자바 메서드 - 문제  (0) 2019.04.22
자바 제어문 - 문제  (0) 2019.04.19
제어문 - 2 ( for, while, do-while )  (0) 2019.04.17
제어문 - 1 ( if, switch-case-break )  (0) 2019.04.17

1. 문자 하나를 입력받아 대문자인지 소문자인지를 판별하는 프로그램

 

 - 코드

import java.io.IOException;
import java.util.Scanner;

public class Test01 {

	public static void main(String[] args) throws IOException {
		
		System.out.print("문자 입력 : ");
		char ch = (char)System.in.read();
		
		if(ch>='A'&&ch<='Z') 
			System.out.println(ch+"는 대문자");
		else 
			System.out.println(ch+"는 소문자");

	}

}

 

2. 연도를 입력받아 윤년인지 아닌지를 판별하는 프로그램( 윤년은 4년마다 한번씩 있고 100으로 나누어떨어지면 윤년이 아니지만, 100으로 나누어떨어지는 년도중 400으로 나누어떨어지는 년도는 윤년 )

 

 - 코드

import java.util.Scanner;

public class Test02 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int str = 0;
		
		System.out.println("연도 입력 : ");
		str = sc.nextInt();
		
		if((str%100==0)&&(str%400==0)&&(str%4==0)) {
			System.out.println("윤년입니다");
		} else
			System.out.println("운년이 아닙니다");
		
	}

}

 

3. 주민등록번호 8번째 자리를 입력받아 출생지를 알아보는 프로그램( 각 번호는 인터넷에서 검색 )

 

 - 코드 

import java.util.Scanner;

public class Test03 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		int num=0;
		System.out.println("주민번호 8째 자리 입력 : ");
		num = sc.nextInt();
		
		if(num>=0&num<=8) 
			System.out.println("서울 출생");
		else if(num>=9&num<=12) 
			System.out.println("부산 출생");
		else if(num>=13&num<=15) 
			System.out.println("인천 출생");
		else if(num>=16&num<=25) 
			System.out.println("경기 출생");
		else if(num>=26&num<=34) 
			System.out.println("강원 출생");
		else if(num>=35&num<=39) 
			System.out.println("충북 출생");
		else if(num==40) 
			System.out.println("대전 출생");
		else if(num>=41&num<=47) 
			System.out.println("충남 출생");
		else if(num==44|num==96) 
			System.out.println("세종 출생");
		else if(num>=48&num<=54) 
			System.out.println("전북 출생");
		else if(num>=55&num<=64) 
			System.out.println("전남 출생");
		else if(num>=65&num<=66) 
			System.out.println("광주 출생");
		else if((num>=67&num<=69)|num==76) 
			System.out.println("대구 출생");
		else if((num>=70&num<=75)|(num>=77&num<=81)) 
			System.out.println("경북 출생");
		else if((num>=82&num<=84)|(num>=86&num<=93)) 
			System.out.println("경남 출생");
		else if(num==85)
			System.out.println("울산 출생");
		else if(num>=94&num<=95)
			System.out.println("제주 출생");

	}

}

 

4. 구구단을 출력하는 프로그램

 

 - 코드

import java.util.Scanner;

public class Test04 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int num = 0;
		
		System.out.println("단수 : ");
		num = sc.nextInt();

		for(int i=1;i<=9;i++) {
			System.out.println(num+" * "+i+" = "+(num*i));
		}
		System.out.println("===="+num+"단====");
		
	}

}

 

5. 계산기 프로그램을 만들어서 계산을 수행한 후 다시 계산을 할 것인지 물어보는 프로그램

 

 - 코드

import java.util.Scanner;

public class Test05 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int num = 0;
		int num2 = 0;
		String str = "";
		String anw = "";
		
		do {
			System.out.print("첫번째 수 : ");
			num = sc.nextInt();
			System.out.print("연산자(+, -, /, %, *) : ");
			str = sc.next();
			System.out.print("두번째 수 : ");
			num2 = sc.nextInt();
			
			if(str.equals("+"))
				System.out.println(num+" "+str+" "+num2+" = "+(num+num2));
			else if(str.equals("-"))
				System.out.println(num+" "+str+" "+num2+" = "+(num-num2));
			else if(str.equals("*"))
				System.out.println(num+" "+str+" "+num2+" = "+(num*num2));
			else if(str.equals("/"))
				System.out.println(num+" "+str+" "+num2+" = "+(num/num2));
			else if(str.equals("%"))
				System.out.println(num+" "+str+" "+num2+" = "+(num%num2));
			
			System.out.print("계속하시겠습니까?(y/n) : ");
			anw = sc.next();
			
			System.out.println();
			System.out.println();
		}while(anw.equals("y"));

	}

}

 

 

6. 연도와 월을 입력받아 달력을 출력하는 프로그램, 윤년도 확인해야 하고 요일도 나타나야 합니다.

 

 - 코드

import java.util.Calendar;
import java.util.Scanner;

public class Test06 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int num1=0;
		int num2=0;
		
		System.out.print("년도를 4자리까지 입력(예 - 2004) : ");
		num1 = sc.nextInt();
		System.err.print("월 입력(예 - 6) : ");
		num2 = sc.nextInt();
		
		Calendar start = Calendar.getInstance();
		Calendar end = Calendar.getInstance();

		// 월은 시스템에서 0을 1로 인식, -1 필요
		start.set(num1, num2-1, 1);
		// getActualMaximum 함수는 해당 날짜의 가장 큰 숫자를 리턴
		end.set(num1, num2-1, start.getActualMaximum(Calendar.DATE));
		
		
		// week_day는 시작날짜의 요일, 몇번째 날인지 지정
		// DAY_OF_WEEK은 숫자로 1이면 월요일부터 7이면 일요일까지 리턴
		int week_day = start.get(Calendar.DAY_OF_WEEK);
		// day는 해당 날짜 
		int day = end.get(Calendar.DATE);
		
		System.out.println("\t"+num1+" 년"+num2+" 월");
		System.out.println("  일   월   화   수   목   금   토");
		System.out.println("-----------------------");
		
		for(int i=1; i<week_day; i++) {
			System.out.print("   ");
		}
		
		for(int i=1, w=week_day; i<=day; i++, w++) {
			System.out.print(i>=10?" "+i:"  "+i);
			
			if(w%7==0) 
				System.out.println();
		}
		
	}

}

 위의 코드는 아래의 주소에서 참조를 했습니다.

http://blog.naver.com/PostView.nhn?blogId=slrkanjsepdi&logNo=90160701047

 

[java] 간단한 달력 프로그램. (Calendar프로그램)

Java로 이용해서 사용자로부터 년과 월을 입력받고 달력의 형태로 표시해주는 방법을 알아보겠다. 달력을 ...

blog.naver.com

'프로그래밍 > JAVA' 카테고리의 다른 글

자바 메서드 - 문제  (0) 2019.04.22
자바 메서드 ( method )  (0) 2019.04.21
제어문 - 2 ( for, while, do-while )  (0) 2019.04.17
제어문 - 1 ( if, switch-case-break )  (0) 2019.04.17
자바 연산자 - 문제  (0) 2019.04.16

1. for

 for 문의 핵심내용은 반복한다는 것입니다. 만약 같은 변수나 문자를 여러번 출력해야 하는데 for문을 사용하지 않으면 System.out.println();을 출력하고자 하는 만큼 코딩해야 할 것입니다. 하지만 for문을 이용하면 매우 간단하게 줄일 수 있습니다. 아래의 형식을 보도록 하겠습니다.

 

 - for ( 초기화; 조건; 증감 ) {

      내용;

   }

 

 위의 초기화 부분에서는 주로 for문에서 사용될 변수의 초기화가 이루어집니다. 이어서 조건에서는 if문에서와 같이 조건이 작동합니다. 이후 증감부분에서는 초기화에 사용되었던 변수의 증감이 이루어지게 됩니다. 하지만 이러한 초기화, 조건, 증감의 부분에서는 꼭 필요한 것은 아닙니다. 각 영역은 공백이 될 수도 있습니다. 아래에서 특징을 살펴보도록 하겠습니다.

 

 - 초기화 : 공백 가능, 변수 선언과 동시에 초기화 가능( int i = 0 ), 이미 선언된 변수라면 초기화 작업만 가능

 - 조건 : 공백 가능, 논리형 조건 사용 가능

 - 증감 : 공백 가능, 증감 연산자의 사용 가능( x++, ++x ), 수식 사용 가능( x += y )

 

 위처럼 각 영역은 공백이 가능하기도 하고 굳이 정수형이 아닌 String형도 가능하기도 합니다. 그렇다면 이번에는 for문의 실행과정에 대해 알아보도록 하겠습니다.

 

 - for ( ① ; ② ; ④ ) {
      ③;

   } 

 

 이렇게 숫자의 순서대로 작동하게 됩니다. 우선 초기화 부분을 거쳐 초기화가 이뤄지고 난 후 조건에 들어가서 해당 조건이 참인지 거짓인지를 판별합니다. 이후 해당 조건이 참이라면 3번의 내용 부분으로 가서 내용을 수행한 후 증감인 4번으로 가서 증감을 수행하게 됩니다. 이러한 과정을 반복하며 2번에서 조건이 거짓이 나올때까지 반복하게 됩니다. 하지만 이때 1번인 초기화 부분은 처음에만 실행되며 한바퀴를 돌고 난 후에는 작동하지 않습니다.

 

 이번에는 삼각형을 출력하는 코드를 살펴보도록 하겠습니다.

public class Triangle {

	public static void main(String[] args) {
		
		int i=0,j=0;
		
		for(i=0;i<5;i++) {
			for(j=0;j<=i;j++) {
				System.out.print("*");
			}
			System.out.println();
		}

	}
}

 이 코드는 프로그래밍을 처음 배울 때 쉽게 접하는 삼각형을 출력하는 코드입니다. 이 코드를 살펴보면 for문이 2개가 중첩돼있는 것을 알 수 있습니다. 이는 삼각형을 한줄한줄 순차적으로 표시하기 때문에 이렇게 작성하게 되는 것입니다. 그렇다면 이번에는 좀 다른 코드를 살펴보도록 하겠습니다.

public class ABCD {

	public static void main(String[] args) {
		
		for(char i='A'; i<='Z'; i++) {
			System.out.print(i);
		}
	}

}

 위의 코드는 알파벳을 A부터 Z까지 일렬로 출력하는 프로그램입니다. 이처럼 for문의 초기화, 조건 부분에는 꼭 숫자가 아닌 문자가 와도 상관없습니다.

 

2. while

 while문은 for문과 비슷한 개념의 반복문이지만 while문에는 초기화와 증감이 존재하지 않습니다. 우선 아래의 형식을 보도록 하겠습니다.

 

 - while( 조건 ){
      내용;

   }

 

 위의 while문의 조건에는 논리형 조건식과 수치형 조건식 모두 사용이 가능합니다. 또 C언어에서는 while(1)이 가능했지만 자바에서는 이를 허용하지 않기 때문에 while(true)와 같이 true혹은 false로 대입해주어야 합니다.

 

3. do ~ while

 do~while은 while과 거의 흡사합니다. 하지만 차이점은 이 do~while문은 안의 내용을 우선 한번 실행하고 난 후 조건을 따지게 되지만 while문은 조건을 우선적으로 따져서 조건이 거짓이라면 안의 내용부를 실행조차 하지 않게 됩니다. 그렇다면 이 do~while문의 예제를 보도록 하겠습니다.

import java.io.*;

public class Round06_Ex07 {

	public static void main(String[] args) throws IOException {
		
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		int kor = 0, eng = 0, mat = 0, tot = 0;
		char point = 0;
		float ave = 0.0f;
		
		do {
			System.out.print("국어 = ");
			kor = Integer.parseInt(in.readLine());
		} while(kor < 0 || kor > 100);
		
		do {
			System.out.print("영어 = ");
			eng = Integer.parseInt(in.readLine());
		} while(eng < 0 || eng > 100);
		
		do {
			System.out.print("수학 = ");
			mat = Integer.parseInt(in.readLine());
		} while(mat < 0 || mat > 100);
		
		tot = kor + eng + mat;
		ave = tot/3.0f;
		
		switch((int)(ave/10)) {
		case 10:
		case 9 : point = 'A'; break;
		case 8 : point = 'B'; break;
		case 7 : point = 'C'; break;
		case 6 : point = 'D'; break;
		default : point = 'F';
		}
		
		System.out.println();
		System.out.println("총점 = "+tot);
		System.out.printf("평균 = %.2f\n", ave);
		System.out.println("학점 = "+point+"학점");

	}

}

 위의 코드는 각 영역의 점수를 입력받아 총점과 평균을 계산하고 그에 따른 학점을 계산하는 프로그램입니다.

'프로그래밍 > JAVA' 카테고리의 다른 글

자바 메서드 ( method )  (0) 2019.04.21
자바 제어문 - 문제  (0) 2019.04.19
제어문 - 1 ( if, switch-case-break )  (0) 2019.04.17
자바 연산자 - 문제  (0) 2019.04.16
자바 연산자 - 2  (0) 2019.04.15

+ Recent posts