1. 메소드
- 객체의 동작에 해당하는 실행 블록
- 메소드는 필드를 읽고 수정하는 역할도 있지만, 다른 객체를 생성해서 다양한 기능을 수행하기도 합니다.
- 메소드는 객체 간의 데이터 전달의 수단으로 사용됩니다. (객체 간 상호작용)
- 외부로부터 매개 값을 받을 수 있고, 실행 후 어떤 값을 리턴할 수도 있습니다.
2. 메소드 선언
리턴타입 메소드이름 ( [매개변수, ...] ) {
// 실행할 코드를 작성하는 곳
}
- 메소드 선언부(리턴 타입, 메소드 이름, 매개변수)와 실행 블록으로 구성
- 메소드 선언부를 메소드 시그니처라고 합니다.
- 메소드 이름은 관례적으로 소문자로 작성합니다. (그 이후에는 낙타 표기법)
3. 매개 변수
- 메소드가 실행할 때 필요한 데이터를 외부로부터 받기 위해 사용합니다.
- 매개 변수 간 자동 타입 변환이 가능합니다.
- int 타입의 매개 변수를 가지고 있다면 byte, short로 자동 타입 변환이 되므로 매개 값으로 전달할 수 있습니다.
예시
public class A {
void sumPrint(int num1, int num2) {
System.out.println(num1 + num2);
}
public static void main(String[] args) {
A a = new A();
int num1 = 1;
int num2 = 2;
a.sumPrint(num1, num2);
// 매개 변수 자동 형변환 byte -> int
byte bNum1 = 3;
byte bNum2 = 4;
a.sumPrint(bNum1, bNum2);
}
}
4. 리턴 타입
- 리턴 값은 있을 수도 있고 없을 수도 있습니다.
- 리턴 값이 없는 메소드는 리턴 타입에 void가 와야 하며 리턴 값이 있는 메소드는 리턴 값의 타입이 와야 합니다.
- 리턴 값이 있는 리턴 타입 = 기본 타입(정수, 실수, 논리), 참조 타입(클래스, 배열, 열거, 인터페이스)
리턴 값이 있는 메소드
- 메소드 선언에 리턴 타입이 있는 메소드는 반드시 리턴 문을 사용해서 리턴 값을 지정해야 합니다.
- return문의 리턴 값은 리턴 타입이거나 리턴 타입으로 변환될 수 있어야 합니다. (자동 타입 변환 가능)
- return문 이후에 실행문은 결코 실행되지 않습니다.
// 리턴 값이 있는 메소드 (기본 타입)
int sum(int num1, int num2) {
return num1 + num2;
}
// 리턴 값이 있는 메소드 (참조 타입 : String 클래스)
String helloPrint(String name) {
String hello = "hello " + name;
return hello;
}
리턴 값이 없는 메소드
- void로 선언된 리턴 값이 없는 메소드에서도 return 사용이 가능합니다.
- return 사용 시 메소드 실행을 강제 종료시킵니다.
// 리턴 값이 없는 메소드
void helloPrint() {
System.out.println("hello");
}
주의) 무한 Loop 반복문 조건에 따라 종료하기 break와 return 차이
break는 Loop를 벗어나는 것이고 return처럼 메소드를 종료하지 않습니다.
public static void run() {
int i = 0;
while (true) {
if(i < 10) {
System.out.println(i);
i++;
} else {
//break;
return;
}
}
//System.out.println("hi"); // break 의 경우 이게 실행 가능함
}
5. ... 매개 변수
- 매개 변수로 몇 개가 입력될지 알 수 없는 경우 사용합니다.
- ...로 선언된 매개 변수는 배열 타입이므로 배열을 직접 매개 값으로 사용할 수 있습니다.
예시
public class A {
void sumPrint(int ... num) {
System.out.println(Arrays.stream(num).sum());
}
public static void main(String[] args) {
A a = new A();
a.sumPrint(1, 2, 3, 4, 5); // 15
int[] numberArr = new int[]{6, 7, 8, 9, 10}; // 40
a.sumPrint(numberArr); // ... 은 배열 타입이므로 배열을 전달해도 사용 가능합니다.
}
}
6. 메소드 오버로딩
- 메소드 이름은 같고 매개 변수의 타입, 개수, 순서를 다르게 하여 선언합니다.
- 메소드 오버로딩을 사용하는 이유는 다양한 요구 조건을 받아 처리할 수 있도록 하기 위해서입니다.
예시 (String 클래스)
메소드 오버로딩 예시로 String 클래스의 정적 메소드인 valueOf()를 확인해 볼 수 있습니다.
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
public static String valueOf(boolean b) {
return b ? "true" : "false";
}
public static String valueOf(char c) {
if (COMPACT_STRINGS && StringLatin1.canEncode(c)) {
return new String(StringLatin1.toBytes(c), LATIN1);
}
return new String(StringUTF16.toBytes(c), UTF16);
}
public static String valueOf(int i) {
return Integer.toString(i);
}
public static String valueOf(long l) {
return Long.toString(l);
}
public static String valueOf(float f) {
return Float.toString(f);
}
public static String valueOf(double d) {
return Double.toString(d);
}
// ... (생략)
}
사용 예시 (기본 타입 → 문자열 )
// 기본 타입 → 문자열
byte b = 10;
int i = 1;
double d = 1.0;
boolean check = true;
// String.valueOf()
String byteToStr1 = String.valueOf(b);
String intToStr1 = String.valueOf(i);
String doubleToStr1 = String.valueOf(d);
String booleanToStr1 = String.valueOf(check);
'Backend > 객체 지향 프로그래밍' 카테고리의 다른 글
[Java] 정적 멤버 (0) | 2022.04.09 |
---|---|
[Java] 인스턴스 멤버 (0) | 2022.04.08 |
[Java] 클래스의 구성 멤버 (생성자) (0) | 2022.04.06 |
[Java] 클래스의 구성 멤버 (필드) (0) | 2022.04.05 |
[Java] 객체와 클래스 (Object & Class) (0) | 2022.04.04 |