함수와 메소드

임준철·2021년 3월 14일
0

JavaAdvanced

목록 보기
3/15

함수와 메소드

함수란?

  • 하나의 기능을 수행하는 일련의 코드
  • 함수는 호출하여 사용하고 기능이 수행된 후 값을 반환 할 수 있다.
  • 함수로 구현된 기능은 여러 곳에서 호출되어 사용될 수 있다.

  • 함수의 입출력 반환

  • 함수는 이름, 매개변수, 반환 값, 함수 몸체(body)로 정의된다.
int add(int num1, int num2){
      int result;
      result = num1 + num2;
      return result;
}
  • 함수와 스택 메모리

    • 스택 - 함수가 호출될 때 사용하는 메모리
      함수가 호출 된 후 수행이 끝나면 자동으로 반환되는 메모리. 메인만 남게된다.


메소드(Method)

  • 객체의 기능을 구현하기 위해 클래스 내부에 구현되는 함수
  • 메소를 구현함으로써 객체의 기능이 구현 됨
  • 객체가 하는 동작(행위)을 정의하는 작업을 수행하는 코드의 집합이자 나열
  • 함수를 사용하는 것을 '호출한다' 라는 것이고 함수는 반환 값이 있어서 결과를 자신을 호출해 준 애한테 돌려 준다. 반환 값을 return 해준다.
  • 함수의 호출이 될 때 생성되서 호출이 끝나면 사라지는 변수들이다. (지역변수)
  • 메소드는 클래스 영역에 생성된다 이 의미는 클래스 영역에 이러한 메소드가 있다는 정보만을 담긴다는 의미이고,
    • 메소드가 실제로 생성이 되는 것은 메인메소드에서 메소드 호출이 생겼을 때 스택영역에 메모리가 잡히게 된다.

메소드의 사용 목적

  • 코드의 중복을 방지, 유지보수성을 향상, 코드의 가독성을 개선하는 역할을 한다.

메소드의 구현

  • 메소드는 함수의 형태로 구성된다.
    • 파라미터(Parameters,입력)
    • 실행문(Executional Statements)
    • 리턴 값(Return Value, 출력)
  • 함수의 작성
    public 리턴자료형 메소드명(입력자료형1, 입력변수1, 입력자료형2, 입력변수2...){ 
                                      //입력변수의 개수는 상관이 없다.
      ...
      return 리턴값; 
      // 리턴자료형과 리턴값의 자료형이 같아야 하고, 
      // void의 경우 return 문을 사용하지 않아도 된다.
    }
    public int add(int x, int y)// 여기까지는 선언 // 입력 파라미터.
    {
        return  x + y; // 반환값 (Return value)
    }
    
  • static 메소드
    • static 키워드를 이용하여 선언된 메소드
    • 인스턴스가 아닌 클래스에 속하는 메소드
    • 대표적으로 main 메소드가 클래스 메소드이다.
    • static 변수를 위한 기능을 제공하는 static 메소드(클래스 메소드, 정적 메소드)
    • static 메소드에서는 인스턴스 변수를 사용할 수 없음
    • static 메소드는 상속시에 오버라이딩 할 수 없다.
    • 클래스 이름으로 참조하여 사용하는 메소드이다.(ex- Student.getSerialNum();)
   ex 1)
   public  static  void classMethod(){
   System.out.println("클래스 메소드 호출");
   }
   classMethod(); 
   // 같은 클래스의 클래스메소드를 바로 호출 가능. 동일 클래스에 속한 클래스 메소드 호출.
   Methods.classMethod(); // 이렇게도 호출 가능.
   Methods m = new Methods();
   m.instanceMethod(); //인스턴스 메소드 호출. //퀴즈에 나올 문제. 중요***

    
    class Person{
        static String korWord = "사람"; //바로 할당됨
        boolean isHungry = true; // 인스턴스 멤버 변수 객체를 만들 때 생성
    
        // 클래스 메소드  메소드라는 것은 변수와 다루는 것이 다름.
       public static  void describe(){ 
       //클래스로 만들기 때문에 각각의 객체와 상관없음.
          System.out.println(korWord+"입니다."); 
          //스태틱 변수는 사용할 수 있음 접근, 수정 가능.
          // 클래스 메소드는 클래스 변수를 사용할 수 있다.
          // 단, 객체에 속하는 속성은 사용할 수 없다.
       }
       //인스턴스 메소드
       public void eat(){
          isHungry = false;
       }
    }  

    ex2)  
    public class Foo{  
       static public void main(String arg[]){
        //class method

      }  
   }

  • 가변 인자(Variable Arguments)
    • 입력 인자의 개수가 정해지지 않은 경우에 사용한다.
    • 입력받은 결과는 배열로 주어진다. 배열로 넘어옴.(가변 인자 variable arguments)
     public static int sumAll(int...params){ 
     // 여러개의 int를 입력 받는다 라는 의미.
        
          int sum = 0;
        for (int value : params){
            sum += value;
        }
          return sum;
     }

  • 기본형 과 참조형 변수
    • 기본형: 메소드 인자로 값이 전달됨(Call by Value)
    • 참조형: 메소드 인자로 참조가 전달됨(Call by Reference)
   public static void swapPrimitive(int x, int y){
        //int x, int y의 사본이 넘어온다. 외부와 전혀 상관없는 값이 된다. 
        // 밖에 있는 값에 영향을 주지 못한다.
        // 기본형 타입인 경우에 해당.
        // call by value : 메소드 호출을 할 때, 값을 복사해서 넘긴다.
        int temp = x;
        x = y;
        y = temp;
   }
   public static void swapReference(Foo x, Foo y){
        // Foo - > class, class는 참조형 변수
        // 참조형 변수이기 때문에 x,y에 참조가 넘어오게 된다.
        int temp = x.value;
        x.value = y.value;
        y.value = temp;
   }

   int x = 10;
   int y = 20;
   Bar.swapPrimitive(x,y); 
   // 메소드를 사용해서 하면 10,20이라는 값이 전달됨. 
   // 변수가 전달되는게 아니라 사본이 넘어가는 것이다.
   // int temp = x; // 이렇게 하면 잘 뒤집어짐
   // x = y;
   // y = temp;
   System.out.println(x+ ","+y);

   Foo f1 = new Foo();
   Foo f2 = new Foo();

   f1.value = 10;
   f2.value = 20;
   Bar.swapReference(f1,f2);
   System.out.println(f1.value +","+f2.value);

  • 메소드 호출 스택 (Method Call Stack)
    • 메소드가 호출될 때 마다 메소드 동작과 로컬 변수가 쌓이는 메소드 영역
    • 메소드가 종료될 때 메모리가 함께 반환됨.

메소드 오버로딩

  • 동일 기능의 함수를 추가로 구현하는 방법
  • 입력 파라미터를 다르게 해서 동일한 함수명으로 구현한다.
    public class Foo {
    public int sumAll(int ... params) {
        int sum = 0;
        for (int i: params) {
            sum += i;
        }
        return sum;
    }
    
    public float sumAll(float ... params) {
        float sum = 0.0f;
        for (float x: params) {
            sum += x;
        }
        return sum;
    }
    }
    
    Foo foo = Foo();
    int sum1 = foo.sumAll(1, 2, 3, 4, 5);
    float sum2 = foo.sumAll(1.0f, 2.0f, 3.0f, 4.0f, 5.0f);
profile
지금, 새로운 문을 열자! 문 저편에 무엇이 있을지 두렵더라도!!

0개의 댓글