일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 코딩테스트
- OOP
- 자료구조
- puppeteer
- Kubernetes
- 인접리스트
- LifeCycle
- nestjs
- Interceptor
- typescript
- winston
- 탐욕법
- javascript
- REST API
- TIL
- bean
- Spring
- 프로그래머스
- 인접행렬
- GraphQL
- html
- java
- JWT
- dfs
- node.js
- Deep Dive
- css
- MySQL
- Linux
- 알고리즘
- Today
- Total
처음부터 차근차근
[Java] Method 본문
Javascript에서 자주 사용하는 함수, 그러나 Java는 Class 기반 언어입니다.
어떻게 함수를 사용할 수 있을까요??
메서드를 사용한다.
자바에서는 함수 대신 메서드를 사용합니다.
(주관적 생각이지만, 자바는 Class 기반이기 때문에 메서드만 쓸 수 있는게 아닐까..)
간단한 예시를 하나 만들어봤습니다.
package method;
public class Method1Ref {
public static void main(String[] args) {
int sum1 = add(5, 10);
System.out.println("결과1 출력:" + sum1);
int sum2 = add(15, 20);
System.out.println("결과2 출력:" + sum2);
}
//add 메서드
public static int add(int a, int b) {
System.out.println(a + "+" + b + " 연산 수행");
int sum = a + b;
return sum;
}
}
여기서 add 메서드는 간단하게 덧셈을 해주는 메서드입니다.
메서드 구조 분석
메서드는 크게 선언부분과 본문 부분으로 나옵니다.
제어자 반환타입 메서드이름(매개변수 목록) {
메서드 본문
}
- 메서드 본문
- 제어자(Modifier) : public, static과 같은 부분입니다. 제어자는 다음시간에 입력하며, 메서드를 함수처럼 이용하고 싶다면 public static키워드를 항상 적자.
- 반환타입(Return Type) : 메서드가 실행된 후 반환하는 데이터의 타입을 지정한다. 만약 메서드가 값을 반환하지 않는 경우, 없다는 뜻의 void를 사용해야 한다.
- 메서드 이름 : 메서드의 이름이며, 변수처럼 사용할 수 있다.
- 매개변수(parameter) : 입력 값으로, 메서드 내부에서 사용할 수 있는 변수입니다. 매개변수는 옵션이며, 필요없을 경우 적지 않아도 무방하다.
- 메서드 본문
- 실제 메서드 내에서 동작할 코드가 위치한다.
여기서 간단하게 public과 static을 알고 가자면
- public : 다른 클래스에서 호출할 수 있는 메서드라는 뜻이다.
- static : 객체를 생성하지 않고 호출할 수 있는 정적 메서드라는 뜻이다.
메서드 호출과 용어 정리
메서드를 호출할 때는 다음과 같이 메서드에 넘기는 값과 매개변수(파라미터)의 타입이 맞아야 합니다. 그리고 넘기는 값과 매개변수 순서와 갯수도 맞아야 합니다.
호출: call("hello", 20)
메서드 정의: int call(String str, int age)
인수(Argument)
여기서 "hello", 20 처럼 넘기는 값을 영어로 Argument(아규먼트), 한글로 인수 또는 인자라 한다.
실무에서는 Argument, Args, 인수, 인자라는 용어를 모두 사용한다.
매개변수(Parameter)
메서드를 정의할 때 선언한 변수인 String str, int age를 매개변수, 파라미터라 한다.
메서드를 호출할 때 인수를 넘기면, 그 인수가 매개변수에 대입된다.
실무에서는 매개변수, 파라미터 용어를 모두 사용한다.
반환 타입
반환 타입이 있는 메서드는 반드시 return을 사용해서 값을 반환해야 합니다.
그러나 반환 타입이 void인 경우 return이 없어도 무방합니다.
이 부분은 특히 조건문과 함께 사용할 때 유의해야 하며, 다음과 같은 예시가 있습니다.
package method;
public class MethodReturn1 {
public static void main(String[] args) {
boolean result = odd(2);
System.out.println(result);
}
public static boolean odd(int i) {
if (i % 2 == 1) {
return true;
}
}
}
이 코드에서 `if` 조건이 만족할 때는 `true` 가 반환되지만, 조건을 만족하지 않으면 어떻게 될까? 조건을 만족하지 않은 경우에는 `return` 문이 실행되지 않는다. 따라서 이 코드를 실행하면 `return` 문을 누락했다는 다음과 같은 컴파일 오류가 발생한다.
java: missing return statement
따라서 else문을 추가시켜 조건을 만족시켜줘야 합니다.
return 문을 만나면 그 즉시 메서드를 빠져나가는 특징
package method;
public class MethodReturn2 {
public static void main(String[] args) {
checkAge(10);
checkAge(20);
}
public static void checkAge(int age) {
if (age < 18) {
System.out.println(age + "살, 미성년자는 출입이 불가능합니다.");
// return을 만나면 그 즉시 해당 메서드를 나간다.
return;
}
System.out.println(age + "살, 입장하세요.");
}
}
메서드 반환 값 무시
반환 타입이 있는 메서드를 호출했는데, 만약 반환 값이 필요없다면 사용하지 않아도 무방합니다.
자바의 중요한 대원칙
자바는 항상 변수의 값을 복사해서 대입합니다.
int num2 = num1;
- 이 부분은 생각해보면 `num1` 에 있는 값 `5` 를 복사해서 `num2` 에 넣는 것이다.
- 복사한다고 표현한 이유는 `num1` 의 값을 읽어도 `num1` 에 있는 기존 값이 유지되고, 새로운 값이 `num2` 에들어가기 때문이다. 마치 `num1` 의 값이 `num2` 에 복사가 된 것 같다.
- `num1` 이라는 변수 자체가 `num2` 에 들어가는 것이 아니다. `num1` 에 들어있는 값을 읽고 복사해서 `num2`에 넣는 것이다.
- 간단하게 `num1` 에 있는 값을 `num2` 에 대입한다고 표현한다. 하지만 실제로는 그 값을 복사해서 대입하는 것이다.
이것은 메서드에도 적용이 됩니다.
public class MethodValue1 {
public static void main(String[] args) {
int num1 = 5;
System.out.println("1. changeNumber 호출 전, num1: " + num1);
changeNumber(num1);
System.out.println("4. changeNumber 호출 후, num1: " + num1);
}
public static void changeNumber(int num2) {
System.out.println("2. changeNumber 변경 전, num2: " + num2);
num2 = num2 * 2;
System.out.println("3. changeNumber 변경 후, num2: " + num2);
}
}
그림을 통해 확인해보겠습니다.
이는 같은 이름의 변수(메서드가 다른)에도 적용됩니다.
메서드 형변환
메서드를 호출할 때도 형 변환이 적용됩니다.
큰 값에서 작은 값으로 대입할 경우, 명시적으로 형 변환을 해주고,
작은 값에서 큰 값을 대입할 경우에는 자동 형변환이 가능합니다.
메서드 오버로딩
이름이 같고 매개변수가 다른 메서드를 여러개 정의하는 것을 메서드 오버로딩(Overloading)이라 합니다.
오버로딩 규칙
// 오버로딩 성공
add(int a, int b)
add(int a, int b, int c)
add(double a, double b)
// 오버로딩 실패
int add(int a, int b)
double add(int a, int b)
int add(int c, int d)
매서드의 이름이 같아도 매개변수의 타입 및 순서가 다르면 오버로딩을 할 수 있습니다.
단, 반환 타입은 인정하지 않으며, 매개변수의 변수명이 다르다는 것 또한 인정하지 않습니다.
이는 메서드 시그니처 때문에 이러한 결과가 만들어지는 것입니다.
메서드 시그니처
메서드 시그니쳐 = 메서드 이름 + 매개변수 타입(순서)
메서드 시그니처는 자바에서 메서드를 구분할 수 있는 고유한 식별자나 서명을 뜻한다. 메서드 시그니처는 메서드의 이름과 매개변수 타입(순서 포함)으로 구성되어 있다. 쉽게 이야기해서 메서드를 구분할 수 있는 기준이다. 자바 입장에서는 각각의 메서드를 고유하게 구분할 수 있어야한다. 그래야 어떤 메서드를 호출 할 지 결정할 수 있다.
따라서 메서드 오버로딩에서 설명한 것 처럼 메서드 이름이 같아도 메서드 시그니처가 다르면 다른 메서드로 간주한다. 반환 타입은 시그니처에 포함되지 않는다. 방금 오버로딩이 실패한 두 메서드를 보자. 두 메서드는 add(int a, int b) 로 메서드 시그니처가 같다. 따라서 메서드의 구분이 불가능하므로 컴파일 오류가 발생한다.
간단한 메서드 오버로딩 예제
덧셈 메서드를 오버로딩해보겠습니다.
package overloading;
public class Overloading1 {
public static void main(String[] args) {
System.out.println("1: " + add(1, 2));
System.out.println("2: " + add(1, 2, 3));
}
// 첫 번째 add 메서드: 두 정수를 받아서 합을 반환한다.
public static int add(int a, int b) {
System.out.println("1번 호출");
return a + b;
}
// 두 번째 add 메서드: 세 정수를 받아서 합을 반환한다.
// 첫 번째 메서드와 이름은 같지만, 매개변수 목록이 다르다.
public static int add(int a, int b, int c) {
System.out.println("2번 호출");
return a + b + c;
}
}
'Language > Java' 카테고리의 다른 글
[Java] 기본형과 참조형 (1) | 2023.12.21 |
---|---|
[Java] Class와 데이터 (1) | 2023.12.21 |
[Java] Array (1) | 2023.12.15 |
[Java] Scanner (0) | 2023.12.15 |
[Java] 형변환 (0) | 2023.12.15 |