double avg = sum/(double)n.length;
메서드 호출 후 메서드에서 계산된 결과를 호출한 지점에 리턴 받아서 사용하고자 할 때,
리턴값이 존재하는 메서드를 사용하면, 호출된 메서드가 return 명령을 이용하여 호출된 지점으로 결과값 하나를 되돌려 보내서 활용할 수 있다.
squar()메서드가 호출되어 실행되면,
실행된 결과를 squar메서드 내에서 출력하는 게 아니라 결과만 되돌려 받아서 호출된 곳에서 결과를 출력할 수 있다.
(혹은 다른 연산에 이용할 수도 있다.)
max(65,87,12);
-> 메서드를 호출해서 리턴값을 받았으나 활용하지 않은 상태
리턴 값이 있는 메서드의 호출 시 반드시 리턴값을 받아주는 변수가 있어야 하는 것은 아니다.
다만 리턴이라는 명령을 쓰는 목적은 실행결과를 되돌려 받아 쓰려는 것이므로, 목적에 맞게 사용하는 것이 올바른 사용이라고 할 수 있다.
또한 메서드 실행의 결과(리턴값)는 변수에 저장할 수 있을뿐만 아니라 다음과 같이 다른 메서드 또는 연산의 일부로도 사용할 수도 있다.
[ 예시 ]
maxValue = max(65,87,12);
변수에 저장한 경우
int k = 10+max(65,87,12);
리턴값을 받아서 바로 연산에 적용
메서드가 실행된 결과를 되돌려주는 명령 : return
그동안 형식적으로 void라고 썼던 곳에 리턴되는 값의 자료형을 써준다.
그동안 썼던 void는 리턴값이 없다는 뜻으로 썼던 키워드
문제
내가 쓴 답
전달인수와 리턴 값의 자료형이 다르므로 헷갈리거나 바뀌지 않도록 조심할 것!!
연산이 짧으면 연산을 리턴 값에 변수 없이 바로 넣어도 된다.
예시 : return b*b*3.14;
문제
나의 답
짧게 줄일 수 있었다. 수정한 부분 ⬇
메서드 형태
abc();
- 전달인수 X, 리턴값 X
abc(10,20);
- 전달인수 2, 리턴값 X
k = abc();
- 전달인수 X, 리턴값 O
k = abc(10,20);
- 전달인수 2, 리턴값 O
개발자의 필요에 의해 만들어지는 메서드는 반드시 클래스 안에 정의 되어야 한다.
생성된 메서드들 간에는 자유롭게 서로를 호출하여 사용할 수 있습니다.
그들은 그들을 둘러싼 클래스 속에 있는 멤버들이라고도 부른다.
다만 서로를 자유롭게 호출하는 대상에서 main은 제외 한다.
main을 호출한다는 것은 프로그램을 시작한다는 뜻이며,
개발자에 의해 임의 호출 될 수 없다.
문제
나의 답
문제점
myInput()에서 sc.close;를 하면 실행 중 에러발생
(첫 번째만 실행되고 두 번째 호출에서 오류난 듯)
근데 왜 인지 모르겠고 지우고 그대로 실행하니 실행은 됨
Scanner생성을 main에다가 하니까 또 경고 뜸
이클립스의 에러창을 읽어보니 myInput메서드에서는 sc라는 참조변수를 받은 적이 없다는 듯했다.
(Scanner로 생성된 sc에 계속 경고표시가 떠있어서 옮겨보았다.)
그렇다고 sc.close;만 main메서드 마지막에 써도 안됨.
이클립스 안내(?!) 대로 해본 방법
main에 sc를 만듬
myInput에 sc도 매개변수로 넣어주고 전달도 함
main 마지막에 sc.close();를 넣음
경고 표시 사라짐 WOW~
문제 : 성적표 출력
- prnTitle() : 제목을 출력하는 메서드
- prnScore() : 점수, 총점, 평균을 출력하는 메서드
나의 답
main말고 다른 메서드에서 또 다른 메서드를 호출해도 된다.
avg메서드에서 sum메서드를 사용해서 연산해도 OK!
메소드의 이름은 같고,
매개변수의 타입, 개수, 순서가 다르면 서로 다른 메소드로 인지하는 문법
일관된 메소드 이름을 사용하여 사용자에게 직관적인 이름을 사용하게 한다.
전달인수(매개변수)의 자료형, 순서 등이 서로 달라도 가능
계속 사용했던 print()도 오버로딩이었다.
(참조) Java8 api 페이지 https://docs.oracle.com/javase/8/docs/api/
위에서 (자료형 … 변수명) ⇒ 몇 개가 들어오는지 모를 때 사용
BUT 같은 자료형 이어야 함!!!
다른 자료형은 같이 못쓰는가? Nope! 대신 앞에 붙여야 함!!
같은 형인 개수가 정해지지 않은 전달 인수와 다른 자료형의 전달 인수가
동시에 전달되어야 한다면, 반드시 ... 으로 처리할 데이터들 보다 왼쪽에 전달되게 위치시켜야 한다.
(... 뒤에 넣으면 ...이 언제 끝날지 모르니까 안됨)
문제
내가 쓴 답
이 문제에서 내가 계속 큰 실수를 하고 있었다는 사실을 알았다.
String끼리 같은 지 확인할 땐 .equals()를 써야 하는데 그냥 바로 == 연산자를 사용. (JS에서 습관이 되어버린듯)
그런데 지금까지 잘 실행이 되어왔다.
아마 이클립스의 내 프로젝트가 SE-17버전인 상태라서 그런 듯함
그러나 일할 때에는 8을 가장 많이 쓴다고 하고 수업고 8버전이 기준이므로 .equals()를 사용하는 습관을 들여야겠다.
문제풀기부터 해설까지 2시간 넘게 걸린 문제
문제에서 Scanner의 위치와 sc를 매개변수로 추가한 것은 내가 추가, 수정해본 것이다. 아래에 관련 설명 있음
나의 답
위의 코드도 실행은 되었지만 고쳐야할 부분이 더 있어서 수정했다.
Scanner 변수를 전역변수로 만들지 않으면 각자 필요한 메서드마다 새로 선언하고 사용해야 한다.
호출 당시 전달된 배열의 주소가 매개변수에 저장되어져 사용된다.
이는 호출한 곳에서 사용하고 있는 배열을 직접 제어할 권한을 얻은 것이나 마찬가지이다.
따라서 input()메서드의 s[i][j]에 값을 넣는 것은 main의 scores[i][j]에 값을 넣는 것과 같다.
Scanner sc = new Scanner(System.in);
를 main() 밖에 선언하고 써도 된다. 대신 static을 앞에 붙여 줘야 함static Scanner sc = new Scanner(System.in);
만약 이차원배열에 크기를 선언해주는 메서드를 따로 만든다면?
main 수정
새 메서드 memoryAllocation(); 작성