6-4 메소드
선언부, void, 매개변수, 리턴문, 호출, 오버로딩
메소드
메소드 선언: 1.선언부 2.실행블록 으로 구성된다.
(선언부를 메소드 시그니처라고도 한다!)
(선언부 --> 리턴타입, 메소드이름, 매개변수선언)
ㄴ리턴 값이 없을 수도 있다. -->리턴 타입 void로 적는다.
ㄴ리턴값 없으면 저장할 변수도 딱히 필요 없으니까 그냥 메소드만 호출하면 된다.
ㄴ리턴 타입 있어도 반드시 변수에 넣을 필요는 없다. 리턴값이 중요하지 않다면 그냥 메소드만 호출해도 된다.
상황에 맞게 잘 쓰자!!
>>리턴값이 없어 단순 호출만 할건지, 리턴값을 받아서 어떤 변수에 저장해둘건지.
메소드 이름도 자바 식별자 규칙에 맞게 작성한다.
(복습: $랑_만 됨, 숫자로 시작하면 안됨 등등)
+매개변수 관련
매개값 타입이랑 넣는 값이 같아야 한다.
다만 'byte 타입 변수'가 들어간다면 자동으로 int로 변환된다.
+매개변수의 개수를 모른다면 어떻게 할까요?_?
매개변수를 배열 타입으로 선언하면 됩니다>_<
1번처럼 한다면
실행클래스에서 어떤 배열을 따로 선언해 쓰면 되겠다.
호출할때 그 배열의 항목 값들을 메소드 매개변수 자리에 넘겨준다. (또는 매개변수 자리에 직접 배열생성)
2번처럼 한다면
배열을 딱히 먼저 생성하지 않고,
메소드 호출할 때 작성한 데이터 수에 따라서 자동으로 배열이 생성되고 그것이 매개값으로 사용된다.
값 쭈루룩 쓰면 된다. 쉼표로 구분.
다음처럼..
리턴문
메소드 선언할 때 타입 적어줬으면 반드시 리턴문 사용해야 한다. 리턴문 없으면 에러!!
리턴문이 실행됨으로써 메소드가 종료된다.
++리턴문 다음에 뭘 실행하려고 작성하면 컴파일 에러!! --> "Unreachable code"
리턴값은
1. 리턴 타입이거나
2. 리턴 타입으로 변환가능해야한다. (리턴타입 int면 byte, short값 리턴되어도 노상관-->int로 자동 타입 변환된다!)
ㅡㅡㅡㅡㅡ
리턴값이 없는 메소드--> void로 선언된 메소드
void로 선언된 메소드에 return문은 사용한다면, 리턴값을 넣는게 아니라 단지 메소드 실행을 강제종료하는거다.
(break문과 달리, return문은 메소드 자체를 즉시 종료시킨다.)
(break문은 스위치문이나 반복문을 빠져나오는 거였지)
<<return문 실습>>
ㅇ잘 보면, return;을 쓰는 경우와 쓰지 않는 경우를 구분할 수 있다.
메소드 종료가 필요하지 않으면 return문을 쓰지 않는다.
ㅇCar클래스의 메소드를 호출해서 필드값을 변경하기도 하고, 어떤 값을 리턴해내기도 한다.
+16줄... if문과 else문을 사용한 이유:
myCar.isLeftGas()가 true면 if문을, false면 else문을 실행
객체 내/외부에서 메소드 호출
+메소드 익히기
ㅇ클래스내부에서 메소드 호출
ㅇ클래스 외부에서 메소드 호출..
메소드는 객체에 소속된 멤버이므로 메소드 호출 전에 객체 호출 먼저 넵넵
메소드 오버로딩
같은 이름의 메소드를 여러개 선언한다.
매개값을 다양하게 받을 수 있게 하기 위함.
(얼마 전에는 생성자 오버로딩을 학습했다.)
필요성 ++
>>
int plus(int x, int y) { ... };
이 메소드를 호출하려면 int값 2개가 필요하다.
double타입 덧셈은 불가능하다.
그래서, 매개 변수가 double타입인 plus()메소드를 하나 더 선언하는 것이다.
int plus(double x, double y) { ... };
메소드를 호출하면, JVM은 매개값 타입을 보고 메소드를 선택한다.
++일차적으로 매개변수의 타입을 보지만, 타입이 일치하지 않으면 타입자동변환이 가능한지 검사하고, 자동변환이 가능하면 변환하여 알맞은 메소드를 선택한다.
ㅡ주의점 : 이런건 오버로딩이 아니라 컴파일 에러가 난다.
ㄴ리턴 타입만 다르고 매개변수가 동일한 경우.
예를 들면
int divide(int x, int y) {...}
double divide(int boonja, int boonmo) {...}
--->컴파일 에러 발생.
ㅡ오버로딩의 대표적인 예
System.out.println() 메소드....
>>호출 시 주어진 매개값에 따라서 오버로딩된 println()메소도 중 하나 골라 호출한다.
void println() {...}
void println(boolean x) {...}
void println(char x) {...}
void println(char[] x) {...}
void println(double x) {...}
void println(Object x) {...}
등등등~~
<<메소드 오버로딩 익히기>>
매개변수 입력값 개수에 따라
직사각형 넓이 구할지, 정사각형 넓이 구할지
알맞은 메소드를 호출하게 하는
오버로딩 작성
확인문제
03.
ㅠㅠ제발!! 문자열 비교는 .equals() 메소드로 해야지..
==는 참조 비교하는게 되잖아..!!
04.
println() 메소드 오버로딩 해보기
나는
이렇게 했는데
답지 보니까
return;을 쓰지 않고,
메소드 선언을 static void로 시작했다.
왜 그래야 하나요??ㅠㅠ
ㅡㅡㅡㅡㅡㅡㅡㅡㅡ
static을 배우고 다시 여기로 왔따.
여기서 만든 println() 메소드들을
인스턴스 필드를 포함하고 있지 않다.
그래서 정적 메소드로 선언하는 것이 더 메모리 측면에서 효율적이다.
'JAVA' 카테고리의 다른 글
[혼자 공부하는 자바] 7/08 06-6 [패키지와 접근 제한자] (0) | 2020.07.08 |
---|---|
[혼자 공부하는 자바] 7/08 06-5 [인스턴스 멤버와 정적 멤버] [static] / [private] [접근제한자] / [final 필드] [상수] (0) | 2020.07.07 |
[1주차] 기본미션 + 선택미션 [혼공단] [혼공자] (0) | 2020.07.07 |
[혼자 공부하는 자바] 7/06 06-3 [생성자] [생성자 선언] [생성자 오버로딩] (0) | 2020.07.06 |
[혼자 공부하는 자바] 7/06 06-2 [필드] (0) | 2020.07.06 |