본문 바로가기
내일배움캠프(Sparta)/Java Handbook

[Java Handbook] Part 5-3

by mmm- 2023. 9. 13.

1. static 메서드 (클래스 메서드)

static 메서드

: 객체 생성 없이 '클래스이름.메서드이름()' 으로 호출

  (ex; Math.random())

  • 인스턴스 멤버(인스턴스 변수, 인스턴스 메서드)와 관련없는 작업을 하는 메서드
  • 메서드 내에서 인스턴스 변수 사용 불가
class StaticMethod7_1 {
    int num1, num2; // 인스턴스 변수 선언

    // 클래스 변수 선언
//    static int num1 = 10, num2 = 20;

    static int add(int num1, int num2) { // 메서드 반환타입 앞에 static이 붙었기 때문에 static 메서드

        System.out.println();
        System.out.println("매개변수로 입력 받은 num1, num2 확인");
        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);

        // 매개 변수에 있는 num1, num2 와 인스턴스 변수로 선언한 num1, num2 는 같지 않음 (서로 영향 받지 않음)

        // num1 과 num2 는 인스턴스 변수와 이름만 같은 지역변수일 뿐 메서드가 종료되면 사라짐
        // 인스턴스 변수는 클래스 메서드에서 사용 불가

        // StaticMethod7_1에 선언한 변수를 사용하고 싶다면 클래스(static) 변수를 선언해야함

        // 클래스 변수를 사용하려면 클래스명.클래스변수로 만 접근 가능

          //System.out.println("클래스변수 확인");
          //System.out.println("StaticMethod7_1.num1 = " + StaticMethod7_1.num1);
          //System.out.println("StaticMethod7_1.num2 = " + StaticMethod7_1.num2);

        System.out.println("num1 + num2 = " + (num1 + num2));
        return num1 + num2;
    }
}

class StaticMethod7_1Main {

    public static void main(String[] args) {
        StaticMethod7_1 methodTest = new StaticMethod7_1(); // 객체 생성
        methodTest.num1 = 10;
        methodTest.num2 = 20;

        // methodTest.add(methodTest.num1, methodTest.num2); // add 는 static 메서드 이기 때문에 객체로 생성된 참조변수로는 접근 불가

        // 클래스이름.메서드이름() 방식으로 static 메서드를 호출
        StaticMethod7_1.add(methodTest.num1, methodTest.num2);
    }
}

2. 인스턴스 메서드

인스턴스 메서드

: 인스턴스를 생성한 후, '참조변수.메서드이름()' 으로 호출

  • 인스턴스 멤버와 관련된 작업을 하는 메서드
  • 메서드 내에서 인스턴스 변수 사용 가능
class InstMethod7_1 {
    int num1, num2; // 인스턴스 변수 선언
    static int num3 = 100;

    int add(int num1, int num2) { // 메서드 반환타입 앞에 static이 없어서 인스턴스 메서드

        System.out.println();
        System.out.println("매개변수로 입력 받은 num1, num2 확인");
        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);

        // this: 인스턴스 변수와 매개변수를 구분하기 위한 것
        System.out.println("this.num1 = " + this.num1);

        System.out.println("매개변수 이자 지역변수 num1 = " + num1);
        // 인스턴스 num1 과 매개변수 num1 은 이름만 같음
        // 그래서 구분을 위해 변수의 이름을 다르게 하거나 this 를 사용해서 구분해야 함

        //         System.out.println("InstMethod7_1.num3 = " + InstMethod7_1.num3); // 일반 메서드여도 클래스 변수 사용 가능

        return num1 + num2;
    }
}

class InstMethod7_1Main {

    public static void main(String[] args) {
        InstMethod7_1 methodTest = new InstMethod7_1(); // 객체 생성
        methodTest.num1 = 10;
        methodTest.num2 = 20;

        // 참조변수를 사용하여 인스턴스 메서드 호출
        System.out.println("result : " + methodTest.add(methodTest.num1, methodTest.num2));
        System.out.println("result : " + methodTest.add(80,90));

    }
}

3. 오버로딩

오버로딩

: 한 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것

 

오버로딩 성립 조건

  1. 메서드 이름이 같아야 함
  2. 매개변수의 개수 또는 타입, 위치가 달라야 함
  3. 반환타입에는 영향을 받지 않음

사용하는 목적

  • 매개변수 즉, 입력하는 값이 다르지만 같은 기능을 수행하는 경우가 많을 때 사용성 및 효율을 높이기 위해 오버로딩 사용
class Overloading8_1 {

    int add(int a, int b) {
        System.out.println("int add(int a, int b)");
        return a + b;
    }

/*    void add(int a, int b) { 반환 타입이 다르다고 오버로딩이 성립되지는 않음
          System.out.println("void add(int a, int b)");
          System.out.println("a + b = " + a + b);
      }
*/

    long add(long a, long b) {
        System.out.println("long add(long a, long b)");
        return a + b;
    }

    long add(long a, int b) {
        System.out.println("long add(long a, int b)");
        return a + b;
    }

    long add(int a, long b) {
        System.out.println("long add(int a, long b)");
        return a + b;
    }

}

class Overloading8_1Main {
    public static void main(String[] args) {
        Overloading8_1 test = new Overloading8_1();
        System.out.println(test.add(10, 20));
        System.out.println(test.add(13L, 17L));
        System.out.println(test.add(5L, 10));
        System.out.println(test.add(12, 23L));

        System.out.println();

        // 위에 int add(int a, int b)를 주석한다면
        test.add(10, 20); // Ambiguous method call Error 발생
        // int, int는 (long, int)와 (int, long) 메서드 모두 가능하기 때문에
        // 컴퓨터가 하나를 마음대로 선택할 수가 없어 발생하는 오류

    }
}

'내일배움캠프(Sparta) > Java Handbook' 카테고리의 다른 글

[Java Handbook] Part 5-4  (0) 2023.09.13
[Java Handbook] Part 5-2  (0) 2023.09.13
[Java Handbook] Part 5-1  (0) 2023.09.12
[Java Handbook] Part 4-2  (0) 2023.09.12
[Java Handbook] Part 4-1  (0) 2023.09.12