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 그리고 나머지
'Backend' 카테고리의 다른 글
05월 29일 수 | OOP 10 - JAVA의 Class와 접근제한자 (0) | 2019.05.29 |
---|---|
05월 28일 화 | OOP 09 - JAVA의 Method (재귀함수, 메소드오버로딩)과 JVM구조 (0) | 2019.05.28 |
05월 22일 수 | OOP 07 - JAVA의 배열 (0) | 2019.05.22 |
05월 21일 화 | OOP 06 - JAVA의 반복문(while)과 연습문제 (0) | 2019.05.21 |
05월 20일 월 | OOP 05 - JAVA의 반복문 (for, break, continue) (0) | 2019.05.20 |
댓글