Backend

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

구라미 2019. 5. 23. 13:06

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 그리고 나머지