<1> 메소드에 대한 이해와 메소드의 정의
1. main 메소드에 대해서 우리가 아는것 과 모르는 것
public static void main(String[] args)
{
int num1=5, num2=7;
System.out.println("5+7="+(num1+num2));
}
1) 아는 것
-main는 메소드이다
-메소드는 클래스 내부에 존재한다
-메소드의 중괄호 내에 존재하는 문장들이 위에서 아래로 순차적으로 실행된다.
2) 모르는 것
-public, static (-> 이번 챕터에서 다루지 않는다) void 가 붙어있는 이유
-이름이 항상 main인 이유
-메소드 옆에 있는 소괄호와 소괄호 안의 String[] args
2. 다른 이름의 메소드 만들기
* 만들어온 메소드의 이름이 항상 main 이었던 이유 : " 자바 프로그램의 시작은 main이라는 이름의 메소드를 실행하는 데서부터 시작한다."
-> 프로그램의 시작이 목적이 아니라면 얼마든지 다른 이름의 메소드를 만들 수 있다.
1) main이 아닌 메소드정의 예시
-"hiEveryone 이라는 이름의 메소드 정의 "
-메소드 정의 : 메소드를 만드는것
-메소드 오른쪽 소괄호 : 변수선언.
2) main이 아닌 메소드실행
- 8, 9행 : 메소드 호출문 ( 메소드를 실행하는 문장) 메소드의 이름(전달한데이터); 형태. 호출된 메소드가 다 실행 되고 나서 다음줄으로 넘어간다.
- 12~16행 : 정의한 "hiEveryone" 메소드, 6,7행에서 전달한 데이터가 메소드 이름 옆에 선언된 변수 age에 전달되어 저장, 이렇게 초기화된 변수는 hiEveryone 메소드 안에서 접근 가능
-15행 : 12행에서 선언된 변수의 저장된 값 출력하는 문장
메소드의 호출과 값의 전달 과정 :
hiEveryone(12) 를 통해 public static void hiEveryone(int age)의 age에 12저장(hiEveryone실행) -> 저장된 값이 사용되는 문장에서 사용됨. (hiEveryone끝)다시 hiEveryone(12)로 돌아가고 다음 문장으로 넘어감.
*메소드 실행에서 중요한 규칙들
-메소드 호출문을 접하면 해당 메소드의 실행이 완료된 다음에야 비로소 그 다음 실행
-메소드는 한번 정의됨녀 여러번 실행 가능
-메소드는 메소드이름(값); 으로 호출되고 소괄호에 있는 값이 메소드 정의때 만든 변수에 저장되고 메소드 내에서 사용
-메소드가 정의되는 위치는 프로그램 실행 결과에 영향 x. (hEvery~함수가 main앞에 오든 뒤에 오든 관계 x)
3) 매개변수(parameter) : 메소드의 정의에서 매소드 이름 오른편에 등장하는 변수
* 메소드 호출시 전달되는 값의 자료형과 매개변수의 자료형은 항상 같아야 한다
- 매개변수가 두개인 메소드와 매개변수가 존재하지 않는 메소드의 예시
-8행 : 여러개의 값을 전달할때는 , 를 사용하여 구분한다.
-9행 : 변수에 저장된 값도 전달이 가능하다
-10행 : 값의 전달 없이 메소드 호출
-13행 : int 변수와 double 변수가 순서대로 정의, 따라서 호출할때도 같은 순서로 값을 전달해야 한다
-20행 : 매개변수가 빈 상태로 정의. 따라서 호출할때는 값의 전달이 없어야 한다.
문제1.
Q1 두개의 정수를 전달받아서 두 수의 사칙연산 결과를 출력하는 메소드와 이 메소드를 호출하는 main메소드 정의. 단 나눗셈은 몫과 나머지 각각 출력
* 여러개의 매개변수를 정의할때 int a,b x int a , int b o
Q2. 두개의 정수를 전달받아서, 두 수의 차의 절대값을 계산하여 출력하는 메소드와 이 메소드를 호출하는 main 메소드를 정의해보자. 단 메소드 호출 시 전달되는 값의 순서에 상관없이 절대값이 계산되어서 출력되어야 한다.
- 내가 한것
-책에 나온 것
2. 값을 반환하는 메소드
1) 메소드 이름의 왼쪽에는 반환하는 값의 정보를 삽입하게 되어있다.
-main앞의 void - "이 메소드는 값을 반환(메소드를 호출한 영역으로 값을 전달하지) 않는다." (5행의 main)
-12행, 18행 : adder메소드는 int형 데이터 반환, square메소드는 double형 데이터 반환.
2) 값의 반환
메소드 adder
-int : 반환하는 데이터의 자료형
-return : return의 오른쪽에 등장하는 대상 반환(상수, 연산문(연산의 결과 반환), 변수) , 실행시 메소드 종료, 메소드를 호출한 영역으로 값 반환.
-> int result = adder(4,5) -> int result = 9;
* return addResult : add Result에 저장되어 있는 값 반환 "값의 반환은 메소드의 호출문장이 반환된 값으로 대체됨"
- 메소드는 호직 하나의 값만을 반환할 수 있음
3. 키워드 return이 지니는 두가지 의미
1) 값의 반환
2) 메소드의 종료
-> 메소드 중간에 return문이 실행되면 메소드의 나머지 부분은 실행이 이뤄지지 않고 메소드 종료.
* void 표시가 된 메소드 내에서 반환 목적이 아닌 오로지 메소드의 종료를 목적으로 return문 사용 가능
-> 반환 대상 없이 그냥 키워드 return으로만 구성(반환 대상 있으면 안됨)
문제2
Q1. 원의 반지를 정보를 전달하면 원의 넓이를 계산해서 반환하는 메소드와 원의 둘레를 걔산해서 반환하는 메소드를 각각 정의하고, 이를 호출하는 메소드 정의
-내가 한 것
- 책에 나온 것
Q2. 전달된 값이 소수(prime number)인지 아닌지를 판단하여 소수인 경우 true, 소수가 아닌 경우 false를 반환하는 메소드 정의 이를 이용하여 1이상 100이하의 소수를 전부 출력할 수 있도록 main함수 정의
- 내가 한 것
- 책에 나온 것
*1은 소수가 아님. - 결과는 내가 한 결과에서 1만 빠진다.
<2> 변수의 스코프 : 변수의 접근, 변수가 존재할 수 있는 영역
1. 가시성 (visiblity)
* 중괄호로 영역이 형성되면 감싸이는 영역은 변수에 관한 별도의 스코프 형성
1) 동일한 이름의 변수가 여러개 선언되는 예시
: 선언된 변수가 속하는 중괄호의 영역(스코프)이 다르기 때문에 같은 이름의 변수를 여러개 선언가능.
-10행의 num : 8행의 if에 속하는 중괄호
-16행의 num : 14행의 else에 속하는 중괄호
-25행의 num : 23행의 simple에 속하는 중괄호
*변수는 자신이 족한 중괄호 내에서만 접근 가능(선언된 이후부터)
*for과 메소드의 매개변수는 중괄호 내에서 선언되지는 않지만 이어서 등장하는 중괄호 내에서만 접근 가능.
( 그 영역 내에서는 같은 이름의 변수를 선언할 수 없다.)
2) 해당 영역을 벗어나면 사라진다
- 지역변수 : 중괄호 , for문 안에서 선언되는 변수와 매개변수
" 지역변수는 선언된 지역을 벗어나 버리면 메모리 공간에서 자동으로 소멸 "
<3> 메소드의 재귀호출
: 자바는 메소드의 재귀호출 지원, 자료구조와 알고리즘에서 유용하게 사용된다.
1. 수학적 측면에서 재귀적인(순환적인) 사고 - 팩토리얼의 예
1) 팩토리얼(factorial) n! : n까지의 숫자를 다 곱하는 것
5! = 5 x 4 x 3 x 2 x 1
4! = 4 x 3 x 2 x 1
3! = 3 x 2 x 1
2! = 2 x 1
1! = 1
다르게 표현하면
5! = 5 x 4!
4! = 4 x 3!
3! = 3 x 2!
2! = 2 x 1!
1! = 1
: 재귀 - 팩토리얼의 계산식에서 다시 팩토리얼이 등장한것 .
팩토리얼을 수학의 함수식으로 정의하면
: f(n)={ n x f(n-1) (n>=2) or 1 (n=1) } (편의를 위해 0이상이 아닌 1이상으로 표현)
이와 같은 맥락으로 자바는 메소드 f의 부분에서 메소드 f의 호출문이 삽입되는 것 허용
2. 재귀적 메소드의 정의
1) 수학식과의 관계 :
f(n) = { 1 (n=1) } : if (n ==1) return 1;
f(n) = { n x f(n-1) (n>=2) } : else return n*factorial(n-1);
2) 7행의 메소드 호출부터 factorial 메소드가 실제로 동작하는 방식
3) 아직 실행이 완료되지 않은 메소드를 다시 호출하는 방법 : 메모리에 저장된 메소드를 구성하는 명령문이 cpu로 이동해서 실행
: 메소드의 앞 부분을 구성하는 명령문만 반복해서 cpu로 이동시킬 수 있다
3. 잘못된 재귀 메소드 : 종료조건의 부재
- 위 코드의 문제
(1) --cnt : 재귀호출이 일어난 다음에 cnt가 줄어들으므로 같은 매개변수를 가진 showHi가 계속 일어난다.
(2) if(cnt==1) return; : 조건검사 부분. 매개호출 아래에 들어가므로 조건검사부분이 실행되지 않는다
-올바르게 고친 코드
* 재귀 메소드 정의의 주의사항
(1) 재귀의 연결고리를 끊기 위한 조건검사의 위치가 적절해야 한다
(2) 재귀의 연결고리를 끊기 위한 조건검사가 true가 되도록 적절한 연산이 이뤄져야 한다
4. 과도한 메모리 사용
: 성능의 저하로 이어질 수 있다
1) 그럼에도 불구하고 재귀 메소드가 가진 장점
- 복잡한 문제를 간결하게 해결하는 열쇠
- 비교적 짧은 코드가 요구된다.
문제 3
Q1. 정수 N을 전달받아서 2의 N승을 반환하는 베소드를 재귀의 형태로 정의하고 이의 테스트를 위한 main 메소드도 함께 정의하자
* 책에서는 if (N==0) retrun 1; 로 하였다.
Q2. 10진수 정수를 전달받아서, 전달받은 정수에 해당하는 2진수를 출력하는 메소드를 재귀의 형태로 정의하고, 이의 테스트를 위한 main 메소드도 같이 정의하자. 참고로 아직은 다양한 출력방법을 소개하지 않았으니 여러 줄에 걸쳐서 출력이 이뤄지도록 메소드를 정의하자
: 나의 풀이
-binary(n) = { print(n%2) binary(n/2) , 1 (n이 1일 때) } *%과 /는 java에서의 의미를 갖고있다
-2로 나눠가며 나머지 출력
-2진수를 한 줄에 나타냈을 때 맨 왼쪽에 와야하는 수를 알아보기 위해 a를 같이 출력했다.
-과정을 보기 위해 맨 왼쪽에 와야하는 수가 아닌 다른 수들의 뒤에 b와 dec을 같이 출력했다
=> 위에서 부터 왼쪽이 아니라 오른쪽 수가 출력. 위 아래로 순서가 바껴야 하는 경우. 나머지 출력을 재귀호출 뒤에 넣는게 좋다고 생각
*a와 b, dec를 지우면 코드 완성.
: 책에 나온 코드
차이점
- if 괄호 안 (조건검사) return의 경우/return이 아닌 경우
- 조건검사 : dec=1 , dec=0
- 메소드의 자료형 : void / int
- 변수의 사용 : 변수 x / 나머지변수 bin
-dec or decimal 의 변화 : 메소드호출 안에서 / 메소드호출 밖에서
'언어 > JAVA' 카테고리의 다른 글
Chapter 7. 클래스와 인스턴스 (2) (0) | 2017.05.26 |
---|---|
Chapter7. 클래스와 인스턴스 (0) | 2017.05.18 |
Eclipse 설치 및 실행 (0) | 2017.05.11 |
Chapter5. 실행흐름 컨트롤(2) (0) | 2017.05.06 |
Chapter5. 실행흐름 컨트롤(1) (0) | 2017.05.01 |