본문 바로가기

DEVELOPER/Java

[JAVA 파헤치기] 필드(Field)와 메서드(Method) 쉽게 이해하기 2 - 메서드

https://kang-james.tistory.com/entry/%EC%9E%90%EB%B0%94-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0-%ED%95%84%EB%93%9CField%EC%99%80-%EB%A9%94%EC%84%9C%EB%93%9CMethod-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-1-%ED%95%84%EB%93%9C

 

[자바 파헤치기] 필드(Field)와 메서드(Method) 쉽게 이해하기 1 - 필드

안녕하세요 :) 백엔드 개발자 제임스입니다.😊😊 이번에 포스팅할 내용은 [필드와 메서드]입니다. 우리가 자바의 객체 지향 프로그래밍(OOP)을 학습하면, 가장 먼저 접하게 되는 개념인데요. 기

kang-james.tistory.com

 

이번 포스팅은 저번에 이어서, [필드와 메서드] 중 메서드에 대해서 작성하도록 하겠습니다.  이전 내용이 궁금한 분들은 위 링크를 참고해주세요.

* 해당 게시글을 읽는데 걸리는 예상 시간 : 14분
내용이 다소 길지만, 끝까지 읽고 피드백을 남겨주시면 감사하겠습니다 :)


메서드(Method)  


메서드(Method) : 객체의 기능, '특정 작업을 수행하는 일련의 명령문들의 집합'

메서드객체의 기능이라고 할 수 있는데요. 우리가 미리 준비해둔 필드(재료)를 활용하며, 목적에 맞게 결과를 만드는 것입니다. 메서드에 대해 간단하게 알아보도록 하겠습니다.

이번에도 커피머신의 예로 객체의 기능을 이해하도록 하겠습니다.

커피머신의 기능

위 그림에서 커피 머신이 가질 수 있는 기능들을 나열했습니다. 이처럼 작성된 기능들이 메서드가 되는 것인데요. 기능은 이 외에도 더 있을 수 있습니다. 따라서 필드와 동일하게 구현한 메서드에 따라 개발의 과정과 결과가 달라지게 됩니다.

 

1) 메서드의 형태

먼저 메서드의 형태를 알아보도록 하겠습니다. 메서드는 어떠한 입력을 받고, 결과를 출력하는 박스와 동일합니다.

입력을 받고, 출력을 하는 메서드

여기서 메서드의 중요한 특징은 박스 안이 어떻게 구현되었는지는 몰라도 된다는 것입니다. 다시 말하면, 어떤 것을 입력했을 때, 어떤 것이 출력된다는 것만 알면 됩니다.

단, 메서드는 입력이 없거나 출력이 없을 수도 있으며, 둘 다 없는 경우도 있습니다.

그렇게 만든 메서드 박스는 이름 앞에 포인트 연산자(.)와 뒤에 '( )'를 붙인 뒤, 호출하여 사용할 수 있습니다.

* 참고 : 메서드 호출

-> 클래스.add(int i, int j); 
- 클래스.메서드 이름(); 형태로 사용 가능
- 해당 메서드가 정수 i와 정수 j를 입력받으면, 두 정수를 더한 결과가 나온다는 것만 알면 됨.

 

2) 메서드의 구성요소

메서드 박스의 코드 형태

메서드는 기본적으로 위와 같은 형태를 갖고 있습니다. 여기서 몇 가지 용어를 같이 알아보도록 하겠습니다.

// 코드 예시
public int add(int x, int y) { // 메서드 시그니처

	int result = x + y; // 메서드 바디
	return result;
}

위 내용이 메서드를 코드로 구현한 예시입니다. 


#1 접근제어자

먼저 접근제어자다른 클래스 및 패기지에서 사용할 수 있는지 여부를 나타내는 것입니다. 위 코드에서는 public이 적혀 있는데요. 이는 해당 메서드가 어디서든 호출될 수 있음을 의미합니다.

 

#2 반환타입

반환(return)
 : '되돌려준다'라는 의미로, 여기서는 메서드를 호출한 곳으로 출력될 값을 돌려준다는 의미로 사용됩니다.

반환 타입은 메서드가 끝난 뒤, 출력할 값의 크기와 형태를 나타냅니다. 위 코드를 보면 int라고 적혀있기 때문에 메서드가 종료될 때 정수를 반환해야 하는 것이죠. 해당 부분에는 기본 타입(int, char, boolean 등), 클래스 타입으로 작성할 수 있습니다.

추가로 때로는 메서드가 출력하는 값이 없을 수도 있다고 언급했었는데요. 그때는 반환 타입 부분에 void를 작성하고, 값을 반환(return) 하지 않습니다.

public void test() {

} // no return;

 

#3 메서드명

해당 기능의 이름이며, 다른 위치에서 이 이름으로 호출할 수 있습니다. 호출 시에는 '클래스(또는 인스턴스).메서드 이름()' 형태로 작성합니다.

Math.add(); 

 

#4 매개변수

괄호로 감싸져 있는 부분으로 입력값을 받는 부분입니다. 즉, 내용 부분에서 사용할 변수를 선언하는 곳인데요. 괄호 안에는 몇 개의 변수를 선언해도 상관없습니다. 심지어 아무것도 없어도 됩니다. 이 말은 입력이 없다는 것이겠죠?

단, 매개변수 안에 변수를 입력할 때는 타입과 변수명을 작성해줘야 합니다. (ex. int num) 이처럼 기본 타입도 가능하며, 클래스 타입도 가능합니다.

대개 많은 분들이 매개변수로 인해서 혼란을 겪는데요. 이 부분은 뒤에서 '지역 변수'라는 개념과 함께 설명하도록 하겠습니다.

 

#5 내용

해당 부분은 원하는 결과를 만들기 위한 과정입니다.

 

#6 출력(반환)할 값

return 키워드를 통해서 메서드를 최종적으로 마무리하고, 값을 반환합니다. 반환하는 방법은 return 뒤에 값을 적는 것입니다. 아래 적힌 코드처럼 다양한 방법으로 반환할 수 있습니다.

// 1. 연산식을 return (결과값 반환)
int A = 1;
int B = 2;
return A+B;

// 2. 값이 담긴 변수를 return
int A = 1;
int B = 2;
int result = A + B;
return result;

이때 위에서 명시한 반환 타입에 맞게 반환해야 하는 것은 절대 잊지 말아야 합니다.

만약 타입이 void라면, 아래 코드처럼 작성할 수 있습니다. 이는 위에서 설명한 대로 반환을 하지 않습니다.

// 반환 타입이 void
public void add() {
    int A = 1;
    int B = 2;
    System.out.println(A+B); // 3 출력
}
* 추가 설명
가끔 메서드의 반환 타입이 void인데, return이 작성된 것을 볼 수 있습니다.
return은 두 가지의 의미를 갖는데요. 첫 번째는 return value;처럼 뒤에 값을 반환하는 의미두 번째로 단순히 return; 만 작성하여 메서드를 종료한다는 의미가 있습니다. 후자의 경우는 반환하는 것이 아니기 때문에 반환 타입이 void가 되는 것입니다. 이는 주로 조건문과 함께 사용될 수 있습니다.

 

3) 커피머신의 기능(메서드) 구현과 사용하기

이제 위에서 정리한 메서드의 개념에 따라서 아래에 적힌 커피머신의 기능을 구현하도록 하겠습니다.

- 머신 이름 조회하기
- 사용할 원두 조회하기 (반환 X)

#1 커피머신 클래스의 필드

public class CoffeeMachine {

    // 필드
    
    static String beans; // 사용할 원두 종류

    String name; // 커피머신의 이름
}

#2 메서드 구현

a) 머신 이름 조회하기 - 매개변수는 없지만, 문자열 값 반환하기

// 메서드

// public, 문자열 타입으로 반환, 매개변수 X
public String getName() {
    
    return this.name; // 해당 인스턴스의 이름을 반환
}

- 실행

public static void main(String[] args) {

    // 커피 머신 인스턴스 생성
    CoffeeMachine machineA = new CoffeeMachine();

    machineA.name = "커피머신A"; // 인스턴스의 name에 이름 할당

    String result = machineA.getName(); // 메서드 호출 후 반환된 값을 result 변수에 할당

    System.out.println(result); // result 출력

}

위 코드를 보면, getName의 이름으로 [머신 이름 조회] 기능을 만들었습니다. 그리고 실행하는 부분에서 machineA 객체를 만들어서 객체.getName(); 형태로 호출하는 것을 볼 수 있습니다. 그럼 메서드는 우리가 작성한 내용대로 문자열 형태의 값으로 반환하고, 이 값을 문자열의 result 변수에 할당하게 됩니다. 이어서 result를 출력하면, '커피머신 A'가 출력되는 것을 알 수 있습니다.

 

b) 사용하는 원두 조회하기 (반환 X) - 매개변수도 없고, 반환도 없음

// 반환 타입이 void이므로, 반환 X
public void getBeans() {

    System.out.println(beans); // 메서드가 호출되면, beans에 저장된 값 바로 출력
}

- 실행

public static void main(String[] args) {

    // 커피 머신 생성
    CoffeeMachine machineA = new CoffeeMachine();

    // 인스턴스의 beans 변수에 값 할당
    machineA.beans = "아라비카";

    // 메서드 호출
    machineA.getBeans();
}

getBeans의 이름으로 [사용하는 원두 조회] 기능을 만들었습니다. 똑같이 객체.beans()를 사용하여 호출했지만, 이번에는 어떠한 변수에도 할당하지 않았습니다. 그 이유는 메서드를 만들 때, 반환 타입을 void로 지정하면서 반환되는 값이 없기 때문입니다. 어디에도 할당할 필요가 없는 것이죠.

그럼 호출해도 아무 일도 없는 것일까요? 그것은 아닙니다. 반환만 안되었을 뿐, 메서드 내부의 코드들은 모두 실행이 되고 메서드가 종료됩니다. 즉, System.out.println(); 명령어가 실행되면서 beans에 저장된 값을 출력하고 메서드가 종료하는 것입니다. 따라서 메서드 호출 시점에서 아래와 같은 결과가 나오게 됩니다.

 

c) 해당 커피머신의 이름과 사용하는 원두 같이 반환하기 - 매개변수로 입력받은 후, 새로운 문자열 반환

public String getAll(String name, String name2) {

    // 입력받은 값들을 더하여 새로운 문자열에 할당
    String result = name + "가 사용하는 원두는 " + name2;
    
    // 할당받은 변수를 반환
    return result;
}

-실행

public static void main(String[] args) {

    // 커피 머신 생성
    CoffeeMachine machineA = new CoffeeMachine();

    // 각 변수에 값 할당
    machineA.name = "커피머신A";
    machineA.beans = "아라비카";

    // 매개변수에 값을 입력한 메서드를 호출한 후 String 변수에 할당 
    String str = machineA.getAll(machineA.name, machineA.beans);

    // String 변수 str 호출
    System.out.println(str);
}

이번에는 매개변수를 활용한 메서드를 만들었습니다. 똑같이 객체.getAll(); 방식으로 호출하는데요. 아까와는 다르게 괄호 안에 값을 넣습니다. 이것은 우리가 메서드를 만들 때 만든 형태와 동일해야 합니다. 만약 매개 변수가 더 많거나, 적으면 문제가 발생합니다.

그리고 메서드를 마치면서 반환되는 값을 문자열 변수에 할당합니다. 이어서 출력하면 아래 결과가 나옵니다.


 

4) 메서드 선언할 때의 매개변수는 지역변수!

위에서 매개변수가 있는 메서드를 보면서 혼란을 겪을 사람들이 있을 것 같은데요. 예를 들어서, 아래와 같이 생각할 수 있습니다.

"메서드를 호출할 때 입력하는 변수와 매서드 선언부의 매개변수 이름이 달라도 되는 것일까?"

// 메서드 선언
public int add(int num1, int num2) {
	
    return num1 + num2;
}

// 메서드 실행
public static void main(String[] args) {

    int a = 1;
    int b = 2;
    
    this.add(a,b); // 위에서 선언한 add 메서드 호출
}

위와 같이 작성해도 문제가 안됩니다. 이는 num1 변수에 a의 값을 할당하는 것이고, num2 변수에 b의 값을 할당하는 것입니다. 이 상황을 이해하려면 먼저 [지역변수]에 대해서 알아야 합니다. 지역변수선언된 해당 '{ }' 블록 안에서만 유효한 변수입니다. 즉, num1과 num2는 지역변수인 것인데요. 다시 말하면 add() 메서드가 종료되면 사라지는 변수인 것입니다. 

조금 더 이해하기 쉽게 절차대로 생각해보겠습니다.

실행 부분에서 1이 할당된 a와 2가 할당한 b를 괄호 안에 넣어서 메서드를 호출했습니다. 그럼 메서드가 구현된 위치로 이동하는데요. 괄호 안에 넣었던 a와 b가 각각 num1과 num2로 할당됩니다. 그리고 해당 메서드에서는 지역변수 num1과 num2를 사용하여 값을 만들고 반환하는 것이죠.

결론을 말하자면, 메서드를 선언할 때 매개변수의 이름은 중요하지 않습니다. 반대로 선언한 위치, 개수, 타입은 굉장히 중요하고, 호출할 때 그 조건을 똑같이 맞춰야 합니다.

 

5) 메서드를 다양하게 쓰고 싶다면, 오버로딩(Overloading)

오버로딩 조건
1. 메서드의 이름이 동일
2. 매개변수의 개수 또는 타입이 상이 

메서드 오버로딩하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것입니다. 단, 매개변수가 상이해야 한다는 조건이 있습니다. 오버로딩으로 여러 개의 메서드를 구현해두면, 다양한 상황에 맞게 호출하여 사용할 수 있게 됩니다. 아래 메서드 오버로딩의 예를 보도록 하겠습니다.

class test {
    public void display() { // 메서드 오버로딩. 같은 이름의 메서드 4개.
    
        System.out.println("값 없음");
    }
    
    // 매개변수 한 개 추가
    public void display(int r) {
        System.out.println("입력 받은 값 = " + r);
    }

	// 매개 변수 두 개 추가
    public void area(int w, int l) {
        System.out.println("입력 받은 값의 곱 = " + (w * l) );
    }
	
    // 다른 타입의 매개변수
    public void area(double b, double h) {
        System.out.println("입력 받은 값의 곱 = " + (0.5 * b * h) );
    }
}

 


[필드와 메서드] 정리 마무리

지금까지 두 게시글을 통해서 필드와 메서드 두 개념을 정리했습니다. 최대한 쉽게 작성하려고 노력했지만, 쉽지가 않네요🥲😂

그래도 많은 도움이 되었길 바랍니다. 혹시나 잘못된 부분을 발견했다면, 언제든지 피드백 부탁드립니다.

긴 글 읽어주셔서 감사합니다.

 

반응형