메소드
메인 메소드는 하나만 있음
디버깅 단계별로 체크해볼 수 있음
왼쪽 막대기에 더블클릭 하면 점이 생김 : 중단점 breakpoint
이부분에 프로그램 실행을 멈춤 상단에 debug 벌레 아이콘 키보드로는 그냥 f11
switch-> 회색블록이나 그린블록이됨 중단된 부분이 해당코드가 아직 실행 안된상태
f5: 상세하게 보기 진행 f6 : 단계별로 진행 f8: 단계를 아예넘기는
오른쪽 차에 add new expression에 app1 f6 -> app1.hashCode() ->f6 ->
메소드는 호출을 다하면 다시 호출된곳으로 다시 돌아가는 특징을 가짐
아래에 빨간색 네모는 실행중 일때 실행 끝나면 불이 꺼짐
static 예약어 가 빠져 있을 때는
java package 생성chap03-method-and-api-lecture-source
application1
package com.greedy.section01.method;
public class Application1 {
public static void main(String[] args) {
/*메소드란?
* 메소드(method)는 어떤 특정 작업을 수행하기 위한 명령문의 집합이라고 할 수 있다.
* */
System.out.println("main() 시작됨...");
/*클래스 내에 있는 메소드를 호출 하는 방법
*
* 클래스명 사용할 이름 = new 클래스명(); // 객체 생성
* 사용할이름.메소드명();
* */
Application1 app1 = new Application1();
app1.methodA();
System.out.println("main() 종료됨...");
}
/*메소드(method)선언*/
/*접근제한자(*public*,protected,default,private) 반환형(void, 기본자료형, 참조자료형...) 메소드명(){}
* 접근제한자 반환형 메소드명(){
*
* }
*/
/* 호출 확인을 위한 출력메소드*/
public void methodA() {
System.out.println("methodA() 호출함...");
methodB();
System.out.println("mdthodA() 종료됨...");
}
public void methodB() {
System.out.println("methodB() 호출함...");
}
}
->main() 시작됨...
methodA() 호출함...
methodB() 호출함...
mdthodA() 종료됨...
main() 종료됨...
application2
package com.greedy.section01.method;
public class Application2 {
public static void main(String[] args) {
System.out.println("main() 시작함...");
Application2 app2 = new Application2();
app2.methodA();
app2.methodC();
app2.methodB();
System.out.println("main() 종료됨...");
}
public void methodA() {
System.out.println("methodA() 호출됨..");
System.out.println("methodA() 종료됨..");
}
public void methodB() {
System.out.println("methodB() 호출됨..");
System.out.println("methodB() 종료됨..");
}
public void methodC() {
System.out.println("methodC() 호출됨..");
System.out.println("methodC() 종료됨..");
}
}
->main() 시작함...
methodA() 호출됨..
methodA() 종료됨..
methodC() 호출됨..
methodC() 종료됨..
methodB() 호출됨..
methodB() 종료됨..
main() 종료됨...
application3
맨상단에 있으면 전역변수 (필드변수) 클래스가 생성되고 종료될때까지 살아있음
밑에있으면안쪽 지역변수
int age는 매개변수
안에 넣을 값을 전달인자
package com.greedy.section01.method;
public class Application3 {
public static void main(String[] args) {
/*전달인자(argument)와 매개변수(parameter)를 이용한 메소드 호출
*
* 변수의 종류
* 1.지역변수
* 2.매개변수
* 3.전역변수(필드 field)
* 4.클래스(static) 변수
*
* 지역변수는 선언한 메소드 블럭 내부에서만 사용이 가능하다. 이것을
* 지역변수의 스코프라고 한다.
*
* 이 때 전달하는 값을 전달인자(argument)라고 부르고,
* 메소드 선언부 괄호 안에 전달 인자를 받기 위해 선언하는 변수를
* 매개변수(parameter)라고 부른다.
* */
Application3 app3 = new Application3();
/*전달인자와 매개변수를 이용한 메소드 호출 테스트*/
/*1.전달인자로 값 전달 테스트*/
/*호출하려는 메소드의 매개변수 선언부에 미리 선언해둔 자료형과, 갯수, 순서가
* 일치하게 값을 넣어 호출해야 한다.
* */
app3.testMethod(40);
// app3.testMethod("40"); // 매개변수는 int형이지만 인자가 String형이기 때문에 호출할 수 없다.
// app3.testMethod(20, 30, 40); // 매개변수는 int형 1개이지만 인자는 3개이기 때문에 호출할 수 없다.
// app3.testMethod(); // 매개변수는 선언되어 있지만 인자로 값을 전달하지 않으면 호출할 수 없다.
/*2. 변수에 저장한 값 전달 테스트*/
int age = 20;
app3.testMethod(age);
/*자동형변환을 이용하여 값을 전달을 할 수 있다.*/
byte byteAge = 10;
app3.testMethod(byteAge);
/*강제형변환을 이용해서 값을 전달을 할 수 있다.*/
long longAge = 80;
// app3.testMethod(longAge); // 자동형변환을 할 수 없어서 에러 발생
app3.testMethod((int)longAge); // 강제형변환을 이용하여 자료형을 맞춘 후 호출할 수 있다(데이터 손실 주의)
/*연산결과를 이용해서 값 전달을 할 수 있다.*/
app3.testMethod(age * 3);
}
public void testMethod(int age) {
System.out.println("당신의 나이는" + age + "세 입니다.");
}
}
-> 당신의 나이는40세 입니다.
당신의 나이는20세 입니다.
당신의 나이는10세 입니다.
당신의 나이는80세 입니다.
당신의 나이는60세 입니다.
apllication4
alt shift j 썸머리 작성 메소드 에커서놓고 단축키
package com.greedy.section01.method;
public class Application4 {
public static void main(String[] args) {
/*여러 개의 전달인자를 이용한 메소드 호출 테스트*/
Application4 app4 = new Application4();
app4.testMethod("홍길동", 20, '남');
// app4.testMethod(20, "유관순", '여'); // 값의 갯수는 맞지만 순서가 다르게 전달되면 호출하지 못한다.
/*변수에 저장된 값을 전달하여 호출할 수 있다.*/
String name = "유관순";
int age = 20;
char gender = '여';
app4.testMethod(name, age, gender);
}
/**
* <pre>
* 이름과 나이의 성별을 전달받아 한 번에 출력해주는 기능을 제공합니다.
* </pre>
* @param name 출력할 이름을 전달해주세요
* @param age 출력할 나이를 전달해주세요
* @param gender 출력할 성별을 전달해주세요. 성별은 변경되지 않을 것을 보장합니다.
*/
public void testMethod(String name, int age, final char gender) {
/* 매개변수도 일종의 지역변수로 분류된다.
* 매개변수 역시 final 키워드를 사용할 수 있다.
* 지역변수에 final 키워드를 붙여 상수를 만드는 것과 동일하다.
* final 매개변수는 상수 네이밍 규칙을 선택적으로 따르는 경향이 있다.
* */
System.out.println("당신의 이름은 " + name + " 이고, 나이는" +
age + "세 이며, 성별은 " + gender + "입니다.");
}
}
->당신의 이름은 홍길동 이고, 나이는20세 이며, 성별은 남입니다.
당신의 이름은 유관순 이고, 나이는20세 이며, 성별은 여입니다.
application 5
package com.greedy.section01.method;
public class Application5 {
public static void main(String[] args) {
/*메소드 리턴 테스트*/
/*
* 모든 메소드는 내부에는 return;이 존재한다.
* void 메소드의 경우 return;을 명시적으로 작성하지 않아도 마지막줄에
* 컴파일러가 자동으로 추가를 해준다.
*
* return은 현재 메소드를 강제 종료하고 호출한 구문으로 다시 돌아가는 명령어이다.
* */
System.out.println("main() 메소드 시작함...");
Application5 app5 = new Application5();
app5.testMethod();
System.out.println("main() 메소드 종료됨...");
}
public void testMethod() {
System.out.println("testMethod() 동작 확인...");
return;
// System.out.println("test"); // 에러 발생, return은 메소드 가장 마지막에 작성해야한다.
}
}
-> main() 메소드 시작함...
testMethod() 동작 확인...
main() 메소드 종료됨...
Applcation6
package com.greedy.section01.method;
public class Application6 {
public static void main(String[] args) {
/*메소드 리턴값 테스트
*
* 메소드는 항상 마지막에 return 명령어가 존재한다.
* return은 자신을 호출한 구문으로 복귀하는 것을 의미한다.
*
* 복귀를 할 때 그냥 복귀를 할 수도 있지만, 값을 가지고 복귀할 수도 있다.
* 이 때 가지고 가는 값을 리턴값이라고한다.
*
* return값을 반환하기 위해서는 메소드 선언부에 리턴 타입을 명시해주어야 한다.
* void는 아무 반환값도 가지지 않겠다는 리턴타입에 사용할 수 있는 키워드이다.
*
* 반환값이 없는 경우 return 구문은 생략해도 컴파일러가 자동으로 추가해주지만,
* 반환값이 있는 경우 return 구문을 반드시 명시적으로 작성해야한다.
* 또한 메소드 선언부에 선언한 리턴타입 반환값의 자료형은 반드시 일치해야한다.
* */
System.out.println("main() 메소드 시작함...");
Application6 app6 = new Application6();
app6.testMethod();
String returnText = app6.testMethod();
System.out.println(returnText);
System.out.println(app6.testMethod());
int returnIntValue = app6.testMethod2();
System.out.println(returnIntValue);
System.out.println("main() 메소드 종료됨..");
}
/**
* <pre>
* 문자열 형태의 반환값을 확인해보기 위한 메소드
* </pre>
* @return hello world라는 문자열을 반환
*/
public String testMethod() {
return "hello world";
}
public int testMethod2() {
return 10;
}
}
-> main() 메소드 시작함...
hello world
hello world
10
main() 메소드 종료됨..
application7
package com.greedy.section01.method;
public class Application7 {
public static void main(String[] args) {
/*매개변수와 리턴값 복합 활용*/
/*매개변수도 존재하고 리턴값도 존재하는 메소드를 이용하여 간단한 계산기 만들기*/
int first = 20;
int second = 10;
Application7 app7 = new Application7();
System.out.println("두 수를 더한 결과 : " + app7.plusTwoNumbers(first, second));
System.out.println("두 수를 뺀 결과 :" + app7.minusTwoNumbers(first,second));
System.out.println("두 수를 곱한 결과 :" + app7.multipleTwoNumbers(first,second));
System.out.println("두 수를 나눈 결과 :" + app7.divideTwoNumbers(first,second));
System.out.println( app7.plusTwoNumbers2(first,second));
}
/**
* <pre>
* 매개변수로 전달 받은 두 수를 더하여 결과값을 반환하는 기능 제공
* </pre>
* @param first 더하기를 할 첫 번째 정수
* @param second 더하기를 할 두번째 정수
* @return 매개변수로 전달 받은 두 수를 더한 결과
*/
public int plusTwoNumbers(int first, int second) {
// int result = first + second;
// return result;
return first + second;
}
public String plusTwoNumbers2(int first, int second) {
return first + "과(와)" + second + "의 합은" + (first + second) + "입니다.";
}
/**
* <pre>
* 매개변수로 전달 받은 두 수를 뺀 결과값을 반환하는 기능 제공
* </pre>
* @param first 빼기를 할 첫 번째 정수
* @param second 빼기를 할 두번째 정수
* @return 매개변수로 전달 받은 두 수를 뺀 결과
*/
public int minusTwoNumbers(int first, int second) {
return first - second;
}
/**
* <pre>
* 매개변수로 전달 받은 두 수를 곱하여 결과값을 반환하는 기능 제공
* </pre>
* @param first 곱하기를 할 첫 번째 정수
* @param second 곱하기를 할 두번째 정수
* @return 매개변수로 전달 받은 두 수를 곱한 결과
*/
public int multipleTwoNumbers(int first, int second) {
return first * second;
}
/**
* <pre>
* 매개변수로 전달 받은 두 수를 이용하여
* 첫번째 매개변수로 전달한 정수에서
* 두번째 매개변수로 전달한 정수를 나누고 그 몫을 정수형으로 반환하는 기능 제공
* </pre>
* @param first 나누기를 할 첫 번째 정수
* @param second 나누기를 할 두번째 정수
* @return 매개변수로 전달 받은 두 수를 나누기한 몫 결과
*/
public int divideTwoNumbers(int first, int second) {
return first / second;
}
}
->두 수를 더한 결과 : 30
두 수를 뺀 결과 :10
두 수를 곱한 결과 :200
두 수를 나눈 결과 :2
20과(와)10의 합은30입니다.
application8
static 은 기울어져 있음
실행용 class 1개 기능용 class 1개
package com.greedy.section01.method;
public class Application8 {
public static void main(String[] args) {
/*static 메소드 호출*/
/*static 메소드를 호출하는 방법
* 클래스명.메소드명();
* */
System.out.println("10과 20의 합 : " + Application8.sumTwoNumbers(10,20));
/*동일한 클래스 내에 작성된 static 메소드는 클래스명 생략이 가능하다.*/
System.out.println("10과 20의 합 : " + sumTwoNumbers(10,20));
}
/**
* <pre>
* 두 수를 더한 결과를 반환하는 기능을 제공
* static 메소드 호출을 위한 메소드
* </pre>
* @param first 더하기를 할 첫 번째 정수
* @param second 더하기를 할 두 번째 정수
* @return 두 수를 더한 결과를 리턴
*/
public static int sumTwoNumbers(int first, int second) {
return first + second;
}
}
->10과 20의 합 : 30
10과 20의 합 : 30
application9 // Caluclator
최댓값과 최솟값을구하는 메소드
디버그 후
중단점에 더블클릭후 f11누르기, f5와 f6 통해서 이동가능하고 expression 창에 nmae 칸에
first 입력하면 대입할 값을 알 수있음
구글 java api 11 -> java.base -> java.util->package-> date
Date date =new Date();
int value = date.getDate();
static이 붙어있으면 Date d = Date.from();
package com.greedy.section01.method;
public class Application9 {
/*실행용 메소드*/
public static void main(String[] args) {
/*최대값 최소값을 비교할 두 정수를 변수로 선언*/
int first = 100;
int second = 50;
/*1. non-static 메소드인 경우*/
/*클래스가 다르더라도 사용하는 방법은 동일하다.
* 클래스명 사용할이름 = new 클래스명();
* 사용할이름.메소드명();
* */
Calculator calc = new Calculator();
int min = calc.minNumberof(first, second);
System.out.println("두 수 중 최소값은 : " + min);
/*2.static 메소드인 경우*/
/*다른 클래스에 작성한 static메소드의 경우
*호출할 때 반드시 클래스명을 기술해야한다.
*클래스명.메소드명();
* */
// int max = maxNumberof(first, second);
int max = Calculator.maxNumberof(first,second);
System.out.println("두 수 중 최대값은 : " + max);
/*주의
* static 메소드도 non-static 메소드처럼 호출은 가능하다
* 하지만 권장하지 않는다
* */
int max2 = calc.maxNumberof(first, second);
System.out.println("두 수 중 더 큰 값은 : " + max2);
}
}
->두 수 중 최소값은 : 50
두 수 중 최대값은 : 100
두 수 중 더 큰 값은 : 100
Calculator
package com.greedy.section01.method;
/기능 클래스/
public class Calculator {
/**
* <pre>
* 매개변수로 전달받은 두 수를 비교하여 더 작은 값을 가진 정수를 반환한다.
* 단, 같은 값을 가지는 조건에 대해서는 처리하지 않는다.
* </pre>
* @param first 최소값 비교를 위한 첫 번째 정수
* @param second 최소값 비교를 위한 두 번째 정수
* @return 두 수 중 작은 값을 정수형으로 반환
*/
public int minNumberof(int first, int second) {
return (first > second)? second: first;
}
/**
* <pre>
* 매개변수로 전달받은 두 수를 비교하여 더 큰값을 가진 정수를 반환한다.
* 같은 값을 가지는 조건에 대해서는 처리하지 않는다.
* </pre>
* @param first 최대값 비교를 위한 첫 번째 정수
* @param second 최대값 비교를 위한 두 번째 정수
* @return 두 수중 큰 값을 정수형으로 반환
*/
public static int maxNumberof(int first, int second) {
return(first > second)? first: second;
}
}
-> com.greedy.section02.package_import
application1
패키지선택후 f2단축키는 rename 이름 변경 및 수정
package com.greedy.section02.package_import;
public class Application1 {
public static void main(String[] args) {
/*non-static인 경우*/
com.greedy.section01.method.Calculator calc
= new com.greedy.section01.method.Calculator();
int min = calc.minNumberof(30,20);
System.out.println("30과 20중 더 작은 값 : " + min);
/*static인 경우*/
int max = com.greedy.section01.method.Calculator.maxNumberof(30,20);
System.out.println("30과 20중 더 큰 값 : " + max);
}
}
-> 30과 20중 더 작은 값 : 20
30과 20중 더 큰 값 : 30
method. (은클래스에서만 사용가능하며 모든 클래스 안에있는 걸로 선언하겠다는뜻)
application2
빈도가 많은 것을 import 를 쓰고 빈도가 낮은것을 수동으로 적기
=> 이름이 같은걸 선언할 경우.?
package com.greedy.section02.package_import;
import com.greedy.section01.method.Calculator;
import java.util.Date;
//import java.sql.Date;
/static import인 경우/
import static com.greedy.section01.method.Calculator.maxNumberof;
public class Application2 {
public static void main(String[] args) {
/*import : 서로 다른 패키지에 존재하는 클래스를 사용하는 경우
* 패키지명을 포함한 풀 클래스 이름을 사용해야한다.
* 하지만 매번 다른 클래스의 패키지명까지 기술하기에는 번거롭다.
* 그래서 패키지명을 생략하고 사용할 수 있도록 한 구문이 import 구문이다.
*
* import는 package 선언문과 class 선언문 사이에 작성하며
* 어떠한 패키지 내에 있는 클래스를 사용할 것인지에 대해 미리
* 선언하는 효과를 가진다.
* */
Calculator calc = new Calculator();
int min = calc.minNumberof(50, 60);
System.out.println("50과 60중 더 작은 값은 : " + min);
/*static method인 경우 import*/
int max = Calculator.maxNumberof(50, 60);
System.out.println("50과 60중 더 큰 값은 : " + max);
/*추가로 static 메소드를 호출할 때 클래스명도 생략하고 사용할 수 있다.*/
int max2 = maxNumberof(100, 200);
System.out.println("100과 200중 더 큰 값은 : " + max2);
java.sql.Date date = new java.sql.Date(System.currentTimeMillis());
}
}
->50과 60중 더 작은 값은 : 50
50과 60중 더 큰 값은 : 60
100과 200중 더 큰 값은 : 200
com.greedy.section03.api.math
application1
코드에 f3 번 혹은 컨트롤 누르면서 코드 누르면 코드에대한 상세보기가 뜬다.
package com.greedy.section03.api.math;
import java.lang.Math;
public class Application1 {
public static void main(String[] args) {
/*API란 ?
*
* Application Programming Interface는 응용프로그램에서 사용할 수 있도록
* 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할수 있도록 만든 인터페이스를
* 뜻한다.
* -> 쉽게 얘기해서 우리가 구현할 수 없거나 번거로운 기능을 JDK를 설치하면
* 사용할 수 있도록 제공해놓은 소스코드들을 의미한다.
*
* -> 더 쉽게 말해 누가 작성해놓은 소스코드이니 가져다 쓰는 방법을 본다
* */
/*다른 패키지에 있는 클래스를 사용하는데 예외적으로 java.lang 패키지에 있는
* 내용은 별도의 import를 하지 않아도 사용할 수 있게 정의되어있다.
* */
/*java.lang.Math
*
* Math클래스는 수학에서 자주 사용하는 상수들과 함수들을 미리 구현해놓은 클래스
* */
System.out.println("PI 변수 " + java.lang.Math.PI);
System.out.println("-7의 절대값 : " + java.lang.Math.abs(-7));
System.out.println("-1.25의 절대값 : " + Math.abs(-1.25));
System.out.println("10과 20중 더 작은 것은 : " + Math.min(10,20));
System.out.println("20과 30중 더 큰 것은 : " + Math.max(20, 30 ));
System.out.println("난수 발생 : " + Math.random());
}
}
->
PI 변수 3.141592653589793
-7의 절대값 : 7
-1.25의 절대값 : 1.25
10과 20중 더 작은 것은 : 10
20과 30중 더 큰 것은 : 30
난수 발생 : 0.35041167023944153
application2
package com.greedy.section03.api.math;
public class Application2 {
public static void main(String[] args) {
/*난수의 활용*]
*
* Math.random()을 이용해 발생하는 난수는 0.0부터 1.0전까지의 실수 범위의
* 난수값을 반환한다.
* */
/* 원하는 범위의 난수를 구하는 공식*/
/* (int) (Math.random()* 구하려는 난수의 갯수) + 구하려는 난수의 최소값*/
/*0~9까지의 난수 발생*/
int random1 = (int) (Math.random()* 10);
System.out.println("0부터 9사이의 난수 : " + random1);
/*1~10 까지의 난수 발생*/
/*10-1+1 -> 10*/
int random2 = (int) (Math.random() * 10) + 1;
System.out.println("1부터 10사이의 난수 : " + random2);
/* 10~15까지의 난수*/
/*15-10 +1 ->6*/
int random3 = (int) (Math.random() * 6 ) +10;
System.out.println("10부터 15사이의 난수 : " + random3 );
/*-128 ~ 127까지의 난수 발생
* 127 - (-128)
* 127 + 128 +1 => 256
* */
// int random4 = (int) (Math.random() 256) + (-128);
int random4 = (int) (Math.random() 256)-128;
System.out.println("-128부터 127까지의 난수 발생 : " + -128);
}
}
-> 0부터 9사이의 난수 : 2
1부터 10사이의 난수 : 4
10부터 15사이의 난수 : 11
-128부터 127까지의 난수 발생 : -128
application3
package com.greedy.section03.api.math;
import java.util.Random;
public class Application3 {
public static void main(String[] args) {
/*java.until.Random 클래스*/
/*
* 원하는 범위의 난수를 구하는 공식
* random.nextInt(구하려는 난수의 갯수)*/
Random random = new Random();
/*0부터 9까지 난수 발생*/
int randomNumber1 = random.nextInt(10);
System.out.println("0부터 9까지의 난수 : " + randomNumber1);
/*1부터 10까지의 난수 발생*/
int randomNumber2 = random.nextInt(10) +1;
System.out.println("1부터 10까지의 난수 : " + randomNumber2);
/*20부터 45까지의 난수 발생*/
int randomNumber3 = random.nextInt(26) +20;
System.out.println("20부터 45까지의 난수 : " + randomNumber3);
}
}
-> 0부터 9까지의 난수 : 7
1부터 10까지의 난수 : 2
20부터 45까지의 난수 : 36
깃랩 문제풀기
문제풀기