JAVA

[JAVA] Method

김디니 2023. 3. 8. 01:46

메서드 Method

메서드란 객체의 동작을 뜻한다.

작업을 수행하는 코드의 집합이다. 

 

메서드를 사용하는 이유는 반복적으로 사용되는 코드의 중복을 방지하고, 

코드의 양을 줄여 유지 보수가 용이해진다.

 

메서드 선언부

modifiers returnType method이름( [DataType 변수이름, DataType 변수이름, ...] ){
 	기능구현 ;
 }

메서드는 선언부와 구현부로 나뉠 수 있다.

메서드를 선언할때는 크게 4가지가 있다.

 

modifiers

modifiers는 제한자의 의미를 가진다.

  • public: 누구나 어디에서나 접근이 가능하다.
  • protected: 상속관계라면 어디서나 사용 가능하다. (상속관계에서만 사용되는 것은 아님)
  • 생략: 같은 package에서 아무나 접근 가능하다.
  • private: 하나의 class의 내부에서만 접근이 가능하다.
public > protected > (생략) > private

 

returnType

 메서드 호출의 결과로 메서드를 호출한 곳으로 돌려주는 값의 타입을 지정하는 역할을 한다.

  • void
    • return값이 없다는 의미이다.
    • 즉, 가지고 갈 수 있는 값이 없다는 의미이다.
  • primitve type (기본형)
    • 반드시 구현부 마지막줄에 return과 값(1개)을 명시해야 한다.
  • object type (참조형)
    • 반드시 구현부 마지막줄에 return과 값(1개)을 명시해야 한다.

 

method이름( 인수 = 매개변수 = parameter )

identifier 작성규칙에 의해 개발자가 만드는 이름이다.

 

메서드를 실행하면서 사용할 값이 있다면 파라미터로 선언한다.

없다면 파라미터 선언을 생략할 수 있다. 

 

메서드 호출 시 파라미터가 일치해야 한다!

 

가변인자 Variable arguments

파라미터로 넘겨주는 데이터가 많을 시 

add(int a, int b, int c)

위 코드와 같이 파라미터의 개수에 맞춰 작성해야 한다.

 

가변인자는 배열을 사용할 때 초기화 과정이 필요 없고 값을 할당할 때 단순히 나열해주면 된다.

 

public void add(int...params) {	// 개수와 상관없이 처리가 가능
	int sum - 0;
    for (int i : params) {
    	sum += i;
    }
    System.out.printf("파라미터 개수: %d, 총 합: %d", params.length.sum);
    
    }
    
    public static void main(String[] args) {
    	VariableArgsTest vt = new VariableArgsTest();
       	vt.add(1, 2, 3, 4, 5);
        vt.add(1, 2, 3);
        vt.add();
    }
  }

main을 통해 출력된 값은

파라미터 개수: 5, 총 합: 15
파라미터 개수: 3, 총 합: 6
파라미터 개수: 0, 총 합: 0

가 되는 것이다.

 

 

메소드 호출방법

static붙은 메소드 호출하는 방법

static 키워드가 붙은 메서드는 개별 객체와 관련 없이 언제나 메모리에 있다.

즉, 호출 시 바로 클래스 이름을 사용하여 호출하는 것이다.

 

ex) Math.random()

 

class 앞에는 올 수 없다.

 

메소드 앞에 올 경우

  • 객체 생성 없이 class이름.mehtod이름( [값,값,…] );으로 호출이 가능하다.
  • 일반(static이 없는) method 호출은 불가능하다.
    • 즉, static method만 호출이 가능하다.
    • 그리하여 static끼리 사용되는 것이다.
  • this 키워드를 사용할 수 없다.
    • 생성한 메소드가 아니기 때문이다.
int no = Integer.parseInt("A");
String s = Integer.toString(4);
double no = Math.random();
public static int parseInt(String string){
    return Integer.parseInt(string);
}

public static String toString(int num){
    return Integer.toString(num);
}

public static double random(){
    return Math.random();
}
  • Integer.parseInt("A");
    • "A"라는 문자열을 정수로 변환한다.
    • ("A"는 정수로 변환될 수 없기 때문에 NumberFormatException이 발생)
  • Integer.toString(4);
    • 4라는 정수를 문자열 "4"로 변환한다.
  • Math.random()
    • 0.0 이상 1.0 미만의 무작위한 실수 값을 반환한다.

 

또한, 변수 앞에 올 경우 대표적인 예로 System.out, System.in 가 있다.

out은 static 변수이다.

 

같은클래스 내부에서 메소드 호출

this.메소드이름(인수값, 인수값....);

같은 클래스 내부에서 메서드를 호출하는 기본 구조는 이러하다.

(this를 생략해서 호출할 수 있다.)

 

class Test{
    public void aa(){                         // non-static

    }
    public int bb(String s){                         // non-static   
        return 4;
    }
    public static String cc(int i, int j){    // static
        return "하이"
    }
    public static void dd(int i){             // static   
        return "졸렵다"
    }
}

 

static이 없는 구문인 non-static과 static 구문이 있을 때

 

public ... {
  string s = Test.cc(3, 2);
}

Test를 호출하는 코드를 작성하였다.

Test 클래스의 cc 메소드를 호출하고, 이를 변수 s에 할당한다.

cc 메소드는 "하이"를 반환하고 있기 때문에 변수 s에 "하이" 가 할당된다.

 

non static에 접근할 수 없고, static이 명시되어 있는 메소드를 호출할 수 있다.

 

static은 this로 호출할 수 없다. 객체 생성 여부에 따라 다르기 때문이다.

 

public int bb(String s){                         // non-static   
    this.aa();        
    return 4;
}

하지만, bb()에서는 this.aa(); 호출이 가능하다.

 

this 키워드는 현재 클래스의 인스턴스를 가리키는 참조 변수로, 

this.aa()를 사용하면 Test 클래스의 aa 메소드를 호출할 수 있다.

bb에서 호출하고 있기 때문에 가능하다.

 

non-static은 static 메소드 호출이 가능하여 bb()에서 cc()를 this로 호출할 수 있지만 권장하지는 않는다.

 

객체 생성 및 접근

위에서 언급한 두 가지의 방법으로 호출되지 않는다면 객체를 생성하는 방법밖에 없다.

클래스이름 변수이름   = new 클래스이름();

 

객체를 생성하는 기본 구조는 이러하다.

 

예를 들어 Test 클래스가 존재한다고 가정해보자.

class Test{
    public void aa(){            

    }
    public int bb(int x) {
        return 4;
    }
    public String cc(int i, int j){
        return "하이";
    }
}

 

Test 클래스의 객체를 생성한다면

 

class Main {
    public...{
        Test t = new Test();
        t.bb(6);
    }
}

이렇게 작성해주면 된다.

이때 t.bb(6);로 bb()를 호출한다면 리턴값은 4이다.