[JAVA] Method
메서드 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이다.