[자바] 클래스 메소드 개념 정리

김동현·2022년 9월 30일
0

메소드란?

  • 객체들은 각각 독립적으로 존재하고 다른 객체와 상호작용하면서 동작하는데 이때 객체들 사이의 상호작용 수단이 메소드이다.
  • 필드가 클래스에 대한 상태를 나타낸다면 메소드는 클래스의 행동에 해당된다.

ex)

public class Car{
	
    // 필드
	int gas;
    
   	...
    
    // 메소드
    boolean isLeftGas(){
    	...
    }
    
    void run(){
    	...
    }
}



메소드 사용 이유

  • 중복되는 코드의 반복적인 프로그래밍을 피할 수 있고 코드의 가독성도 올라간다.
  • 프로그램에 문제가 발생하거나 기능의 변경이 필요할 때에 유지보수 하기 수월하다.

->    메소드를 작성할 때는 되도록 하나의 메소드가 하나의 기능만을 수행하도록 작성.



메소드 선언

ex)

접근제한자 리턴타입 메소드이름 ([매개변수 선언, ...]){
           실행할 코드
}


  • 접근 제한자
    • public, protected, default, private가 있으며 메소드를 선언할 때 접근제한자를 생략하면 default를 갖게된다.

  • 리턴 타입
    • 메소드를 실행한 후의 결과값의 타입을 의미한다.
    • 리턴 값이 없는 경우 void로 작성한다.

  • 메소드 이름
    • 숫자로 시작하면 안되고, 특수문자는 $, _만 사용 가능하다.
    • 관례적으로 메소드 이름은 소문자로 시작하고 뒤이어 오는 단어의 첫 글자는 대문자이다.
    • 메소드의 이름은 기본적으로 동사로 시작한다.

  • 매개 변수 선언

    • 메소드가 실행할 때 필요한 데이터를 외부로부터 받기 위해 사용된다.
    • 매개값(메소드 호출 시 넣어주는 데이터)의 타입과 매개 변수(메소드에 있는 매개변수)의 타입이 다르면 에러가 발생한다.(하지만 매개값의 타입과 매개 변수의 타입이 달라도 byteint로 자동 타입 변환)
    • 매개 변수의 개수를 모를 경우 배열 타입으로 선언하거나 ...을 통해 매개 값을 전달할 수 있다.

    ex)

        public class Main {
            public static void main(String[] args) {
                int[] values = {1, 2, 3, 4, 5};
                int result = sum1(values);
                System.out.println("배열 사용: " + result);

                result = sum2(2, 3, 4, 5, 6);
                System.out.println("... 사용: " + result);
            }

            static int sum1(int[] values) {
                int sum = 0;

                for (int val : values)
                    sum += val;

                return sum;
            }

            static int sum2(int... values) {
                int sum = 0;

                for (int val : values)
                    sum += val;

                return sum;
            }
        }
    
    



리턴(return)문

  • 현재 실행하고 있는 함수를 종료하고 함수를 호출한 곳으로 돌아가는 제어문이다.

  • 리턴값이 있는 메소드
    • 메소드 선언에 리턴 타입이 있는 메소드는 반드시 리턴문을 사용해서 리턴값을 지정해야 한다.
    • 리턴문의 리턴값은 리턴 타입이거나 리턴 타입으로 변환될 수 있어야 한다. (프로그래머스 문제 푸시면서 많이 겪어 보셨을 거라 생각합니다.)

  • 리턴값이 없는 메소드: void
    • 리턴값이 없는 메소드는 리턴 타입으로 void를 사용한다.
    • void로 선언된 메소드에서도 리턴문을 메소드 실행을 강제 종료시키는 역할로 사용할 수 있다.
    • 반복문에서 마치 break를 사용한 것과 같은 효과가 나타난다.



메소드 호출

  • 메소드는 클래스 내,외부의 호출에 의해 실행된다.
  • 객채 내부에서 호출
    • 클래스 내부에서 호출할 경우 단순 메소드 이름만으로 호출이 가능하다.
  • 객체 외부에서 호출
    • 외부 클래스에서 메소드를 호출하려면 클래스로 부터 객체를 생성한 후, 객체가 가지고 있는 필드나 메소드에 접근할 때 사용하는 도트 연산자(.)를 통해 호출할 수 있다.

    ex)

 public class Calculator{
 	
    int plus(int x, int y){
    	int result = x + y;
        return result;
    }
    
    double avg(int x, int y){
    	double sum = plus(x, y); // plus(x, y)는 클래스 내부의 있는 메소드이므로 단순히 메소드 이름으로 부를수 있다.
        double result = sum / 2;
        return result;
    }
    
 }
 
 ...
 
 class CalculatorTest{
 	public static void main(String[] args){
    	Calculator cal = new Calculator();
        double avgResult = cal.avg(6, 4) // avg(x,y)는 현재 클래스 외부에 있으므로 객체를 생성한 후 사용된다.
    }
 }



메소드 오버로딩 (overloading)

  • 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것을 메소드 오버로딩이라 한다.

  • 오버로딩된 메소드를 호출할 경우 JVM은 매개값의 타입을 보고 메소드를 선택한다.

  • 메소드 오버로드 조건
    • 메소드 이름이 같아야한다.
    • 매개 변수의 개수, 타입, 순서 중 하나라도 달라야한다.
    • 리턴 타입은 같아도 되고 달라도 된다.

ex)


public class Main {
    public static void main(String[] args) {
        Main m = new Main();
        m.test();
        m.test(1);
        m.test(1, 2.0);
        m.test(1.0, 2); 

    }

    void test(){
        System.out.println("테스트");
    }

    void test(int a){
        System.out.println(a);
    }

    void test(int a, double d){
        System.out.println(a + " " + d);
    }

    void test(double d, int a){ // 위 메소드와 매개변수의 순서가 다르기 때문에 ok.
        System.out.println(d + " " + a);
    }
}

ex2)

1.
void test(int a, double d){
        System.out.println(a + " " + d);
 }
    
/*
오버로딩 된 메서들 중에 매개변수를 int와 double을 사용하는 메서드 한 개만 있다면 
호출할 때 m.test(1, 2)와 같이 int 값을 두개 넣어주어도 자동형변환이 되어 메소드가 실행되지만
*/

2. 
void test(int a, double d){
        System.out.println(a + " " + d);
 }
 
 void test(double d, int a){
        System.out.println(d + " " + a);
 }
 
 /*
 위와 같이 데이터 타입이 같고 순서가 다른 두 메서드가 있을 시 m.test(1,2)를 넣어주면
 두 메서드 모두 자동 형변환이 되어 둘 다 들어갈 수 있기 때문에 에러 발생.
 Ambiguous method call. Both
 */



<참고>

신용권, 혼자 공부하는 자바, 한빛미디어

profile
오늘은 오늘

0개의 댓글