본문 바로가기
Backend

05월 23일 목 | OOP 08 - JAVA의 Method

by 구라미 2019. 5. 23.

8. 자바의 메소드

메소드란

메소드는 함수이다.

매우 중요한 기능이라 연습을 많이 해야한다.

어떤 특별한 기능을 갖고 있는 것. object의 행동에 해당하는 것이 메소드.

수학의 함수라는 것과 비슷한 기능

*javascript의 function, DB의 procedure와 같은 개념이다.

매 번 인자(argument), 매개변수(parameter)의 개념이 헷갈렸는데 잘 배워둬야겠다.

메소드는 클래스가 가지고 있는 기능이다. 클래스 안에서 선언된다.

 

입력값 -> 입력값을 받아 기능수행 -> 결과도출

을 하는 것이다.

 

 

메소드의 형식

 

함수명() *반드시 괄호가 나와야한다.

 

함수는,

- maker가 제공하는 함수 (제일 중요 )

- 사용자가 필요에 의해 정의한(user defined) 함수가 있다.

함수는 호출한 곳으로 되돌아가는 리턴하는 특징이 있다. 맨 마지막줄의 리턴은 생략하는 경우가 많다.

- 리턴타입은 메소드가 실행된 후 결과값을 되돌려주는 것이다. 그 때 어떤 타입으로 결과값으로 돌려줄 것인지가 리턴타입

 

public 리턴타입 메소드명 (매개변수들) {구현}

 

- 함수를 정의하고 호출해야한다. 

 

maker가 제공하는 함수를 잘 다루려면 class를 잘 다룰 수 있어야한다.

자바의 모든 maker 제공 함수를 쓸 수는 없다. *너무 방대해서 다 외울 수도 없고 그것들을 불러다 사용하는 것임.

주로 자주 사용하는 함수들이 있다. 

함수명도 식별자(식별자의 개념 : 5월15일 포스트 참조 )이다.

함수 안에 함수를 선언할 수 없다. 그렇기 때문에 함수를 작성할때 main 함수 바깥에 작성해야한다.

package oop0523;

public class Test01_Method {	
	//함수를 작성하는 영역
	

	public static void main(String[] args) {
		//자바의 메소드
		//함수 연습	
        
	}//main end
}//class end

함수는 코드를 재사용하기 위해 사용한다.

 

식별자

구분하기 위해 주는 이름 (클래스명, 변수명, 함수명, 패키지명, 프로젝트명 등이 있음)

모든 식별자의 명명규칙:

-의미를 부여해야한다.

-공백, 한글은 절대 X

-첫 글자로 숫자 사용 불가

-영문자와 숫자 등을 조합해서 작명한다.

-단어와 단어가 조합될 경우 첫 글자는 주로 대문자로 사용한다.(Camelcase) ex) VariableTest 

 

 

우리가 지금 작업하고 있는 프로젝트명 : basicJava

패키지명: oop0523

클래스명: Test01_Method

변수명:

함수명:

 

함수를 작성할 때 고려사항

1.매개변수(parameter, 전달값이라.는 이야기)가 있는지?

 - 중개자 역할을 하는 

2. 리턴값이 있는지?

3. 함수정의 (작성)을 하고 호출해야 사용할 수 있다. *함수는 필요한 걸 우선 만들고 필요한 때에 불러서 쓴다.

 

함수의 형식

리턴형 함수명()

public static void test1() {
	System.out.println("JAVA");
}//test1 end

//실행해도 콘솔창의 변화가 없다.
//함수는 호출해서 사용해야하는 호출하지 않았기 때문이다.

main 함수에서 test1함수를 호출할 수 있다.

void는 리턴값이 없을 때

public class Test01_Method {
	
	//함수를 작성하는 영역
	public static void test1() {
		System.out.println("JAVA");
	}//test1 end

	public static void main(String[] args) {
		//자바의 메소드
		//함수 연습
		test1();

	}//main end
}//class end

함수는 함수명(); 이라고 했다.

그렇기 때문에 main 함수안에서 test1(); 라고 치고 호출하면

콘솔창에 JAVA라고 출력된다.

 

workspace를 지정하면 .metadata라는 폴더가 생기는데

그 안에서 실행한 것을 다 관리한다.

 

프로젝트명 -> 우클릭 -> refresh(F5)

프로젝트명 -> 우클릭 -> validate

project -> clean

 

*작업하다 안되면 한번씩 하면 환기됨.

 

메소드의 호출

매개변수(parameter)가 있는 경우

-> 전달값 argument value

 

test(5); <- 이 안에 있는게 전달값

리턴값이 없다 -> void

 

매개변수의 전달 값이 1개인 경우

package oop0523;

public class Test02_Method {
	
	public static void test3(int a){//매개변수(인자를 받아올 자료형과 변수)를 작성한다.
		System.out.println(a);
	}//test3 end

	public static void main(String[] args) {
		
		test3(5);
		test3(7);
		test3(9);

	}//main end
}//class end

//결과값
//5
//7
//9

parameter(매개변수) : int a

argument(인자값) : 5,7,9

 

매개변수의 전달 값이 2개인 경우

	public static void test4(int a, int b){ //두 변수 다 자료형 명시 꼭!
		System.out.println(a+","+b);
	}//test4 end

	public static void main(String[] args) {	
		test4(5,8);

	}//main end
}//class end

전달값의 자료형이 다양한 경우

	public static void test5(double d, char ch, String str){
		System.out.println(d+","+ch+","+str);
        return; //호출시점으로 되돌아간다.
	}//test4 end
    
    public static void main(String[] args) {
		
	test5(1.2,'r',"매개변수연습");

	}//main end
}//class end

//결과값
//1.2,r,매개변수연습

 

연습문제 1) 절대값을 출력하시오 

abs(-3);

연습문제 2) 윤년, 평년을 구분해서 출력하시오

leap(2019);

연습문제 3) 팩토리얼값을 출력하시오

fact(4);

연습문제 4) 전달한 수만큼 문자를 출력하시오

grahp(10,'#');

연습문제 5) 두 수 사이의 누적의 합을 출력하시오

hap(2,5);

 

내 풀이

public class Test03_Quiz {
	//연습문제 1)
	public static void abs(int a){
		
		int abs=(a<0) ? -a : a;
		System.out.println(a+"절대값: "+abs);
		
	}//abs end
    
	//연습문제 2)
	public static void leap(int b){
		if(b%4==0 && b%100!=0 ||b%400==0){
			System.out.println("윤년입니다.");
		}else {
			System.out.println("평년입니다.");
		}	
	}//leap end
    
	//연습문제 3)
	public static void fact(int c){
		int fact4 = 1;
		for(int a=1; a<=c; a++){
			fact4 = fact4*a;
		}
		System.out.print(fact4);
		System.out.println();
	}//fact end
    
	//연습문제 4)
	public static void graph(int d, char e){
		for(int a=1; a<=d; a++){
			System.out.print(e+" ");
		}
	}//graph end
	
    //연습문제 5) ★★★★맨날 까먹으니 복습해 스왑변수★★★★
	public static void hap(int f, int g){
		
		int start =f, end=g;
		int sum = 0;
		if(start>end){
			int tmp = start;
			start = end;
			end = tmp;
		}
		
		for (int c=start; c<=end; c++){
			sum = sum +c;
		}		
	}//hap end
	
	

	public static void main(String[] args) {
		// 메소드 연습문제
		//연습문제 1) 절대값을 출력하시오 
		abs(-3);		
		//연습문제 2) 윤년, 평년을 구분해서 출력하시오
		leap(2019);
		//연습문제 3) 팩토리얼값을 출력하시오
		fact(4);
		//연습문제 4) 전달한 수만큼 문자를 출력하시오
		graph(10,'#');
		//연습문제 5) 두 수사이의 누적의 합을 출력하시오
		hap(2,5);
		
	}//main end
}//class end

결과값:

-3절대값: 3
평년입니다.
24
# # # # # # # # # # 
두 수 사이의 누적의 값은: 14

 

■  선생님 답안  

package oop0523;

public class Test03_Answer {
	
	
	// 연습문제 1)
	public static void abs(int a){
		if(a<0){
			System.out.println(a+"절대값: "+(-a));
		}else{
			System.out.println(a+"절대값: "+ a);
		}
		
	}//abs
	
	
	// 연습문제 2)
	public static void leap(int b){
		if(b%4==0 && b%100!=0 ||b%400==0){
			System.out.println("윤년");
		}else {
			System.out.println("평년");
		}
	}//leap end
	
	
	// 연습문제 3)
	public static void fact(int c){
		long gop =1;
		for(int a=c; a>=1; a--){
			gop = gop*a;
		}
		System.out.println(gop);
	}//fact end
	
	
	// 연습문제 4)
	public static void graph(int d, char e){
		for(int a=1; a<=d; a++){
			System.out.print(e);
		}
	}//graph end
	
	// 연습문제 5)
	public static void hap(int f, int g){
		if(f>g){
			int tmp = f;
			f = g;
			g = tmp;
		}
		
		int sum =0;
		for(int a=f; a<=g; a++){
			sum = sum+a;
		}
		System.out.println();
		System.out.println(sum);
		
	}//hap end
	


	public static void main(String[] args) {

			// 메소드 연습문제
			//연습문제 1) 절대값을 출력하시오 
			abs(-3);		
			//연습문제 2) 윤년, 평년을 구분해서 출력하시오
			leap(2019);
			//연습문제 3) 팩토리얼값을 출력하시오
			fact(4);
			//연습문제 4) 전달한 수만큼 문자를 출력하시오
			graph(10,'#');
			//연습문제 5) 두 수사이의 누적의 합을 출력하시오
			hap(5,2);
			

	}//main end
}//class end

결과값:

-3절대값: 3
평년
24
##########
14

 

리턴값이 있는 경우 (리턴형)

함수정의 - 리턴형 함수명(){}

void는 리턴값이 없다는 것을 뜻한다.

없거나 하나만: 리턴값은 여러 개 올 수 없다.

package oop0523;

public class Test04_Method {
	
	public static int test1(int a,int b){
		int sum = a+b;
		System.out.println(sum);
		return sum; //없거나 하나만, 리턴값은 여러 개 올 수 없다.
	}//test1 end

	public static void main(String[] args) {
		//리턴값이 있는 경우
		test1(3,5);
		
	}//main end
}//class end

 

1) 리턴값을 정수로 받아오는 경우

package oop0523;

public class Test04_Method {
	
	public static int test1(int a,int b){
		int sum = a+b;
		return sum; //없거나 하나만, 리턴값은 여러 개 올 수 없다.
	}//test1 end

	public static void main(String[] args) {
		//리턴값이 있는 경우
		int result = test1(3,5);
		System.out.println(result);
		
		int result2 = test1(2,4);
		System.out.println(result2);
		
		System.out.println(test1(6,8));

	}//main end
}//class end


결과값:

8

6

 

2) 리턴값을 boolean으로 받아오는 경우

package oop0523;

	public static boolean leap(int y){
		if(y%4==0 && y%100!=0 ||y%400==0){
			return true;
		}else {
			return false;
		}
		
	}//leap end

	public static void main(String[] args) {
    
		if(leap(2019)){ //leap라는 함수의 리턴타입을 boolean형으로 ★★★자주 쓰는 표현★★★
			System.out.println("윤년");
		}else{
			System.out.println("평년");
		}
		
	}//main end
}//class end


결과값:

평년

 

3) 리턴값을 char로 받아오는 경우

package oop0523;

public class Test04_Method {
	
	//-----------------------------------------------------------------------------

	public static char upper(char c){
		if(c>='a' && c<='z'){
			return (char)(c-32);
		}else{
			return c;
		}
	}
	
	public static void main(String[] args) {
		//-----------------------------------------------------------------------------
		//무조건 대문자로만 출력하시오.
		
		char ch = upper('r');
		System.out.println(ch);
		

 

결과값:

R

 

4) 리턴값을 String으로 받아오는 경우

package oop0523;

public class Test04_Method {
	public static String append(String a, String b){
		return a+", "+b;		
	}	

	public static void main(String[] args) {
    
		String str = append ("손흥민","토트넘");
		System.out.println(str);
		
	}//main end
}//class end


결과값:

손흥민, 토트넘

 

연습문제 1) 세 개의 정수 중에서 최대값을 출력하시오. //삼항연산자 이용 맨날 헷갈린다.

package oop0523;

public class Test04_Method {

	public static int max(int a, int b, int c){
		
		int max = (a<b) ? b : a;
		max = (c<max) ? max : c;
		return max;
	}
	
	public static void main(String[] args) {

		//연습문제 1) 세 개의 정수 중에서 최대값을 출력하시오.
		int m =  max(3,7,9);
		System.out.println("세 개의 정수 중 최대값은: "+m);

	}//main end
}//class end

결과값:

9

 

5) 정수 배열의 경우

package oop0523;

public class Test05_Method {
	
	
	public static void test1 (int a, int b){ //배열의 요소
		System.out.println(a+b);
	}//test1 end
	
	public static void test2 (int[] a){
		for(int i=0; i<a.length; i++){
			System.out.print(a[i]+" ");
		}//for end		
	}//test2 end
    
	public static void main(String[] args) {
		// 전달값이 배열인 경우
		int [] su ={2,4,6};
		test1(su[0], su[2]); //2, 6

	}//main end
}//class end

 

결과값:

8

2 4 6 

 

6) String 배열의 경우

package oop0523;

	public static void test3 (String a, String b){
		System.out.println(a+","+b);

	}
	
	public static void test4 (String [] a){
		for(int i=0; i<a.length; i++){
			System.out.println(a[i]);
		}
	}

	
	public static void main(String[] args) { //String[] 스트링 배열
		// 전달값이 배열인 경우
		int [] su ={2,4,6};
		test1(su[0], su[2]); //2, 6
		
		test2(su);
		
		String[] name = {"김이박","김삼박","김사박"};
		
		test3(name[0], name[2]); //배열의 요소		
		test4(name); //배열 자체

	}//main end
}//class end

7) 2차원배열인 경우

package oop0523;

public class Test05_Method {

	public static void test5 (int a, int b){
		System.out.println(a+","+b);		
	}
	
	
	public static void test6 (int[][] g){
		int row = g.length;
		for(int a=0; a<row; a++){
			int col = g[a].length;
			for(int b=0; b<col; b++){
				System.out.println(g[a][b]+" ");
			}
		}
	}

	public static void main(String[] args) { 
		//2차원 배열인 경우
		
		int [][] g = {
						{1,2,3},
						{6,5,4}	
						};

		test5(g[0][0], g[1][2]);
		test6(g);

	}//main end
}//class end

 

 

연습문제 2) 모음의 갯수를 출력하시오

내풀이

package oop0523;

public class Test05_Method {
	
	
	public static void test1 (int a, int b){
		System.out.println(a+b);
	}
	
	public static void test2 (int[] a){
		for(int i=0; i<a.length; i++){
			System.out.print(a[i]+" ");
		}
		
	}
	
	public static void test3 (String a, String b){
		System.out.println(a+","+b);

	}
	
	public static void test4 (String [] a){
		for(int i=0; i<a.length; i++){
			System.out.println(a[i]);
		}
	}
	
	public static void test5 (int a, int b){
		System.out.println(a+","+b);		
	}
	
	
	public static void test6 (int[][] g){
		int row = g.length;
		for(int a=0; a<row; a++){
			int col = g[a].length;
			for(int b=0; b<col; b++){
				System.out.println(g[a][b]+" ");
			}
		}
	}
	
	public static void test7 (char a,char b,char c){
		
		System.out.println(a);
		System.out.println(b);
		System.out.println(c);
	}
	
	public static int mo (char[][] g){
		
		int count = 0;
		int row = g.length;
		for(int i=0; i<row; i++){
			int col = g[i].length;
			for(int j=0; j<col; j++){
				if(g[i][j]>='a'&& g[i][j]<='z'){
					g[i][j] = (char)(g[i][j]-32);
					
					switch(g[i][j]){
					
					case 'A': 
					case 'E': 
					case 'I': 
					case 'O': 
					case 'U': count++;				
				}
					
				}
				
				
			}
			
		}
		return count;
	}
		
		
		
		
	
	
	//int result = mo(ch);
	
	
	public static void main(String[] args) { //String[] 스트링 배열
		// 전달값이 배열인 경우
		int [] su ={2,4,6};
		test1(su[0], su[2]); //2, 6
		
		test2(su);
		
		String[] name = {"김이박","김삼박","김사박"};
		
		test3(name[0], name[2]); //배열의 요소		
		test4(name); //배열 자체
		
		//---------------------------------------------------------------------
		//2차원 배열인 경우
		
		int [][] g = {
						{1,2,3},
						{6,5,4}	
						};

		test5(g[0][0], g[1][2]);
		test6(g);
		
		char [][] ch = {
				{'y','e','a','r'},
				{'M','o','n','t','h'},
				{'D','a','t','e'}			
		};
		
		test7(ch[0][0], ch[1][0], ch[2][0]);

		
		//연습문제 7) 모음의 갯수 출력하시오
		
		int result = mo(ch);
		System.out.println(result);		

	}//main end
}//class end

 

■  선생님 답안  

package oop0523;

public class Test05_Answer {
	
		public static void test7(char a, char b, char c){
			System.out.println(a);
			System.out.println(b);
			System.out.println(c);
		}
		
		public static int mo(char[][] ch){
			int count = 0;
			int row = ch.length;
			for(int i=0; i<row; i++){
				int col = ch[i].length;
				for(int j=0; j<col; j++){
					switch(ch[i][j]){
					
					case 'A': 
					case 'E': 
					case 'I': 
					case 'O': 
					case 'U': count++;				
					}
					
				}
			}
			return count;
		}
	
	

	public static void main(String[] args) {
		char [][] ch = {
				{'y','e','a','r'},
				{'M','o','n','t','h'},
				{'D','a','t','e'}			
		};
		
		test7(ch[0][0], ch[1][0], ch[2][0]);

		
		//연습문제 7) 모음의 갯수 출력하시오
		
		int result = mo(ch);
		System.out.println(result);		
		
	}//main end
}//class end

 

자바에서 제공하는 기능들

여러가지 클래스들.

https://docs.oracle.com/javase/8/docs/api/

 

 

Math 클래스

java.long 

Method 함수 목록들이 있음

 

Math 클래스의 여러 메소드

System.out.println(Math.abs(-3)); //절대값

System.out.println(Math.ceil(1.3));  //올림
System.out.println(Math.floor(2.7)); //내림 
System.out.println(Math.round(3.8));  //반올림

System.out.println(Math.max(7, 4)); //둘 중 큰값
System.out.println(Math.min(7, 4)); //둘 중 작은값
System.out.println(Math.max(7, Math.max(5,9))); //Math 클래스 중복해서 사용가능

결과값:

3
2.0
2.0
4
7
4
9

 

Random 값 

random은 무작위값 난수값이라고 한다.

Math 클래스에서 가장 중요한 함수(메소드)이다.

매개변수는 없는데 리턴값 있다. // 리턴값 double

랜덤값을 발생시키면 자료형은 double로 온다.

발생범위: 0.0<= r<1.0 

 

//혹시 나중에 배열 6개 요소를 가져와서 곱한다음 로또번호? 

 

1) Math.random()의 사용방법

System.out.println(Math.random()); //java는 딱 여기까지..?
System.out.println((int)(Math.random()*2)); //0 1 정수 2는 곱했을 때 2미만값만 나옴. 
System.out.println((int)(Math.random()*3)); //0 1 2 소수점 버리고 랜덤값에 정수 n을 곱해준 후 정수변환 -> 정수 
System.out.println((int)(Math.random()*4)); //0 1 2 3 

2) 랜덤으로 번호 뽑기

//주사위 수의 범위: 1~6
System.out.println((int)(Math.random()*6)+1);
		
//연습문제 1) 로또번호 범위: 1~45
System.out.println((int)(Math.random()*45)+1);

 

 

 

 


과제

 

과제 1) 누적의 합을 구하시오.


1+....+10 =55
1+....+20 =210
1+....+30 =

1+....+90 =
1+....+100 = 5050

*이중 반복문 이용하기
*힌트 회전수 증가

 

//------------------------------------------------------------------------------------------------------------------- 

 

과제 2)
1~1000까지의 합 중 그 합이 10000이 넘을 때 결과를 출력 후 실행 종료.
출력결과) 1+2+3+4...... 합이 10000이 넘는 언젠가 종료.

 

//------------------------------------------------------------------------------------------------------------------- 

 

과제 3)
3의 배수의 누적 합이 100이 넘어가려면 3부터 어디까지 더해야 하는 지 구하시오
출력결과) 3+6+9+12+...=

 

//------------------------------------------------------------------------------------------------------------------- 

 

과제 4)
로또번호 1~45 사이 중에서 서로 겹치치 않게 6개 발생
int[] lotto = new int[6];

 

//------------------------------------------------------------------------------------------------------------------- 

 

과제 5)
su행렬의 대각선 방향의 각 요소의 합을 구하시오
//대각선 ↘ 방향의 합 (4+9+7)
//대각선 ↙ 방향의 합 (2+9+6)

int [][] su = {
{4,3,2},
{5,9,1},
{6,8,7}
};

위의 su배열에서 행과 열을 바꿔서 출력하시오. <- 스왑변수
전치행렬

4 5 6

3 9 8

2 1 7

 

//------------------------------------------------------------------------------------------------------------------- 

 

과제 6)
행렬 각각의 합, 차를 구하시오
int[][] aa={
{4,3},
{5,9}
};

int[][] bb={
{4,3},
{5,9}
};

int[][] cc ={{0,0}, {0,0}}; //합 
// 5 5
// 11 16

int[][] dd ={{0,0}, {0,0}}; //차
// 3 1
// -1 2

//-------------------------------------------------------------------------------------------------------------------
과제 7)
10진수값을 2진수값으로 변환 후 // 출력하시오.
int binary =13;  //1101 for문으로 2를 계속 나누어서 몫이 있으면 1, 없으면 0 그리고 나머지

 

댓글