일단 시작해보는 블로그

[Java] 메소드 본문

개발/Java

[Java] 메소드

Selina Park 2019. 8. 8. 16:00

보통 다른언어에는 함수라는 것이 별도로 존재한다. 하지만 자바는 클래스를 떠나 존재하는 것은 있을 수 없기 때문에 자바의 함수는 따로 존재하지 않고 클래스 내에 존재한다.

이 클래스 내의 함수를 메소드라고 부른다.

 

java는 객체지향언어이므로, 보통은 함수라고 불리지만 자바에서의 정확한 명칭인 메소드(method)는 반드시 클래스 내에서만 존재함.

 

 

메소드를 사용하는 이유?

자신이 어떤 코드를 반복해서 적고있는 것을 발견할 때가 있다. 바로 이를 위해서 그 반복되는 행동들을 정의해두고 호출만으로 그 메소드를 꺼내서 사용할 수 있도록 하는 것.

 

 

메소드의 구조


public 리턴자료형 메소드명(입력자료형1 입력변수1, 입력자료형2 입력변수2, ...){
	...
    return 리턴값; //리턴자료형이 void인 경우에는 return 문이 필요없음. 생략가능하다.
}

//사용
리턴값을받을변수 = 객체.메소드명(입력인수1, 입력인수2, ...);

 

return의 또 다른 쓰임새

메소드를 빠져나가기를 원할 때 return만 단독으로 써서 메소드를 즉시 빠져나갈 수 있다.

 

다음 예제는 리턴값이 없는 void이지만 "hello"라는 단어와 입력값인 String hello의 값이 같다면 return, 그러니까 메소드를 빠져나가라는 메소드이다.


public void say_hello(String hello) {
    if ("hello".equals(hello) {
        return;
    }
    System.out.println("안녕은 영어로 "+hello+" 입니다.");
}

 

메소드 내에서 선언된 변수의 효력 범위

메소드 내에서 선언된 변수는 로컬 변수(local variable)이다. 즉, 메소드 안에서만 효력이 있는 것.


class Test {
    public void vartest(int a) {
        a++;
    }

    public static void main(String[] args) {
        int a = 1;
        Test myTest = new Test();
        myTest.vartest(a);
        System.out.println(a); //1
    }
}

따라서 위의 예제의 출력값은 1이다. 출력한 메소드는 main함수 내에서 효력이 있는 로컬 변수이고, input값으로 로컬변수 a의 '값'을 메소드에 전달했을뿐 vartest안에서의 a값의 변화는 main함수의 a의 값에 변화를 줄 수 없다.

 

메소드 내에서만 효력을 갖는 로컬변수의 개념은 변수가 int, float, double, boolean, ... 과 같은 primitive type일때만 해당된다. 

reference type인 객체와 같은 변수를 메소드의 입력으로 넘기고 메소드가 객체의 속성값을 변경한다면 메소드 수행 이후에도 객체는 변경된 속성값을 유지한다.


public int vartest(int a) {
    a++;
    return a;
}

public static void main(String[] args) {
    int a = 1;
    Test myTest = new Test();
    a = myTest.vartest(a);
    System.out.println(a); //2
}

또, 객체를 입력값으로 넘기지 않고 위와같은 예제를 실행하는 방법이 있다.


public class Test {

    int a;  // 객체변수 a

    public void vartest() {
        this.a++;
    }

    public static void main(String[] args) {
        Test myTest = new Test();
        myTest.a = 1;
        myTest.vartest();
        System.out.println(myTest.a);
    }
}

클래스 내에 선언된 메서드 vartest내의 this는 객체를 가리킨다. 따라서 myTest.vartest(); 라고 input값을 넣지 않고 호출해주더라도 같은 결과가 나오게 된다.

 

[메소드에서 primitive type (원시형, number, char, boolean 등)과 reference type (참조형, 객체)인 변수를 선언하는 것에 대한 개념은 call by value에서 더 자세하게 정리해놓을 것입니다.]

 

 

 

[REFERENCE]

https://wikidocs.net/225

불러오는 중입니다...

 

'개발 > Java' 카테고리의 다른 글

[Java] HashMap  (0) 2019.08.21
[Java] 문자열 포맷 - String.format(), System.out.printf()  (0) 2019.08.20
[Java] 정적 변수와 메소드 (static)  (0) 2019.08.08
[Java] call by value  (0) 2019.08.08
[Java] Scanner, 입출력 클래스  (0) 2019.08.05
Comments