자바의 정석

메소드 Method

야생늑대 2022. 4. 12. 19:35
반응형

메소드는 객체의 동작에 해당하는 중괄호 { } 블록을 말하며, 메소드를 호출하면 블록안의 모든 코드들이 일괄적으로

 실행된다.

메소드 선언방법

  선언부와 실행블록으로 구성된다. 

 메소드 선언부를 메소드 시그니처(signature) 라고한다.

 메소드 선언부는  리턴타입, 메소드 이름, 매개 변수 선언  부분을 말한다.

리턴타입 메소드이름 (매개변수선언, .....) {
             실행할 코드를 작성하는 곳                    //메소드 실행 블록
}

   리턴타입

   메소드가 리턴하는 결과의 타입을 표시

        메소드를 실행한 후 나오는 결과 값의 타입을 말한다.   

리턴갑이 있으면 리턴타입이 선언부에 명시되어야 한다.

 리턴값이 없는 메소드는 리턴타입에 void로 기술하며 , 리턴값이 있는 메소드는 리턴값의 타입을 기술한다.

결과 값이 int값이면 int , String값이라면 String,  double값이라면 라면 double을 기술한다.

    리턴값이 있느냐 없느냐에 따라 호출방법이 다르다.

 

public void showMenu(){      <--리턴값이 없는 메소드다.
}

showMenu();      <--- 리턴값이 없어 변수에 저장할 내용이 없으므로 단순히 메소드만 호출
	public int deleteGoods(String selNum) {              
		String sql = "DELETE FROM ORDERINFO WHERE ODCODE = ? ";
		int delGoods = 0;	
			try {
				pstmt = con.prepareStatement(sql);
				pstmt.setString(1, selNum);
				delGoods = pstmt.executeUpdate();
			} catch (SQLException e) {
				e.printStackTrace();
			}		
		return delGoods;
	}     
       //리턴타입은 int : 리턴받은 값을 저장하기위해 변수선언
       //매개변수타입은 String(매개값을 String만 받을 수 있음.)
       
        ex)   int delGoods = deleteGoods("문자열")

  ↑ deleteGoods 메소드에 "문자열"을 매개값으로 주고 호출해서 실행시킨 후 나온 값을 리턴받아서          delGoods 변수에 저장

      

 

 

 

  메소드 이름

  • 메소드의 기능이 드러나도록 식별자 규칙에 맞게 이름을 지어준다.
  •  숫자로 시작하면 안되고, $와 _를 제외한 특수문자는 사용하지 말아야 한다.     
  • 관례적으로 소문자로 작성한다.  (run, name)
  • 서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫글자는 대문자로 작성한다.(getName)             
  • 메소드가 어떤기능을 수행하는지 쉽게 알 수 있도록 이름을 지어주는 것이 좋다.
  • 메소드 이름 길이는 프로그램 실행과는 무관하니, 너무 짧게 주지 않도록 한다.

 리턴문

리턴값이 있는 메소드

 리턴타입이 있는 메소드는 return문을 사용해서 리턴값을 지정해줘야한다.  return문이 없으면 컴파일 에러가 발생한다.

 리턴값은  리턴타입이거나 리턴타입으로 변환될 수 있어야한다.

int plus(int x, inty){                                   
int result = x + y;
return result;
}

int plus(int x, int y) {
byte result = (byte) (x+y);
return result;
}

  byte와 short타입은 연산시 int 로 자동 타입 변환되어 리턴되기 때문에 정상작동한다.

 

※ return문 이후의 실행문은 결코 실행되지 않는다. 그래서 return 이후에 실행문이 오면 "Unreachable code" 라는

컴파일 에러가 발생한다.

 

int plus(int x, inty){                                   
int result = x + y;
return result;
System.out.println(result);     //Unreachable code    컴파일에러
}

리턴값이 없는 메소드

리턴타입으로 void를 사용한다.

void로 선언된 메소드도 return문을 사용할 수 있지만  리턴값을 지정하는 것이 아니라 메소드 실행을 강제종료시키는 역할을 한다.

 break을 대신 사용 할 수도 있지만,  메소드안에 다른 반복문이나 작업이 있다면 break문을 써야한다. 

 return문은 즉시 메소드를 종료하고 값을 반환.

 break문은 지금 실행하고 있는 반복문을 중지하고 나간다. 그리고 메소드안의 다음 구문으로넘어간다.

 continue문은 반복문내의 지금 실행하고 있는 구문을 중지하고 다음 구문으로 넘어가 진행한다.

 

메소드호출 

 

객체내부에서의 호출

 메소드 (매개값, ....);     

 

객체외부에서의 호출

클래스 참조변수 = new 클래스(매개값,...);

 

new 연산자로 클래스로부터 객체를 생성해야한다.  

메소드는 객체에 소속된 멤버이므로 객체가 존재하지 않으면 메소드도 존재하지 않는다.

객체를 생성하고 참조변수와 함꼐 도트연산자(객체접근연산자)를 사용해서 메소드를  외부에서 호출 할 수 있다.

 

참조변수.메소드(매개값,...);

// 리턴값이 없거나, 있어도 리턴값을 받지 않을 경우

타입 변수 = 참조변수.메소드(매개값,...);

//리턴값이 있고, 리턴값을 받고 싶을 경우

 

 

메소드 오버로딩

 

  • 클래스내에 같은 이름의 메소드를 여러개 선언하는 것을 메소드 오버로딩(overloading)이라고 한다.
  • 메소드 오버로딩의 조건은 매개변수의 타입, 개수, 순서 중 하나가 달라야 한다.
  • 리턴타입은 오버로딩과 상관이없다.
  • 메소드 오버로딩이 필요한 이유는 매개값을 다양하게 받아 처리할 수 있도록 하기 위해서이다.

ex)

	int plus(int x, int y) {
				int result = x + y;
				return result;
			}
     =========================================
    double plus(double x, double y) {
				double result = x + y;
				return result;
			}
            
            
            
   plus(10, 20);       //  int plus( int x, int y){ } 메소드를 불러온다.

   plus(10.5, 20.3);   //  double plus( double x, double y){ } 메소드를 불러온다.
   
   int x = 10; 
   double y = 20.3;
   plus(x, y);       //  double plus( double x, double y){ } 메소드를 불러온다.
   // JVM은 일차적으로 매개변수의 타입을 보지만, 매개 변수의 타입이 일치하지 않을 경우 
   // 자동 타입변환이 가능한지 검사한다. 첫번째 매개변수인 int x 는 double 타입으로 변환이 
   // 가능하므로 최종적으로 plus(double x, double y) 메소드가 선택된다.

  

  ▶ 위 예제에는 이름이 같은 2개의 plus 메소드가 있다. 하지만 타입이 다르기 때문에 컴파일 에러 없이 실행이 된다.

     JVM은 매개값의 타입을 보고 메소드를 선택하기 때문에

      매개값을 int 타입으로 호출하면 int 타입의 plus메소드를 실행하고, 

      매개값을 double타입으로 호출하면 double 타입의 plus메소드를 실행한다.

int divide(int x, int y) {  };
double divide(int boonja, int boonmo) {  };
// 컴파일 에러가 발생한다.

  ▶ 매개변수의 타입과 개수, 순서가 똑같을 경우 매개변수 이름이 다르다고 해서 

      그것을 메소드 오버로딩이라고 하지않는다.  

 

 


22/05/01   추가 정리

static(정적)멤버

  • static 이 붙으면  객채생성없이 호출가능
  • 정적멤버(클래스멤버)는 인스턴스(객체)에 소속된 멤버가 아니라 클래스에 고정된 멤버이다.
  • static 키워드를 통해 생성된 정적멤버들은 힙 (Heap) 영역이 아닌 Static(정적)영역에 할당된다.
  • 정적영역에 할당된 메모리는 모든객체가 공유하며 멤버를 어디서든지 참조할 수 있게된다.
  • 하지만 Garbage Collector의 관리 영역밖에 존재해서 프로그램이 종료될 때까지 메모리에 할당 된 채로 존재하게 된다.
  • 그렇기 때문에 static을 너무 남발하게 되면 만들고자 하는 시스템 성능에 악영향을 끼칠 수 있다.

static메소드 

  • 메소드에 static이 붙으면 static메소드이다. 
  • IV(인스턴스변수;필드)는 static메소드에서 사용할 수 없다.
  • 인스턴스를 생성하지 않아도 클래스이름으로 호출가능하다.

 

인스턴스 메소드

  •  인스턴스는 객채다
  •  인스턴스 메소드는  필드를 사용하는 메소드
  •  인스턴스변수는 필드 
  •  필드는 클래스영역에 선언하고 객체가 생성될 때마다 새로 생성된다. 
  •  필드값은 객체끼리 공유되지 않는다
  •  보통 필드는 초기값 없이 선언하고 객체마다 값을 초기화해서 사용한다.

 

 

▶ 메소드 호출방법

※ 정적 메소드는 클래스가 메모리에 올라갈 때 자동으로 생성되기 때문에 인스턴스를 생성하지 않아도 호출할 수 있다.

 

 

 

반응형

'자바의 정석' 카테고리의 다른 글

상속  (0) 2022.05.23
인스턴스 멤버와 정적 멤버  (0) 2022.04.15
생성자 Constructor  (0) 2022.04.12
필드 Field  (0) 2022.04.11
클래스 Class  (0) 2022.04.11