본문 바로가기
# Coding/Java

자바 메서드

by hxodoo.cookie 2023. 9. 20.

메서드는 자바 프로그램의 빌딩 블록 중 하나로, 코드의 재사용성, 가독성 및 유지보수성을 향상시키는 데 중요한 역할을 합니다. 이 글에서는 자바 메서드의 개념, 작성 방법, 다양한 유형 및 최적화에 관해 자세히 알아보겠습니다.

 

 

 

메서드의 정의

자바 메서드는 자바 프로그램의 구성 요소 중 하나로, 특정 작업을 수행하는 코드 블록입니다. 이 코드 블록은 메서드 이름으로 호출되며, 필요한 입력 값을 받아 작업을 수행한 다음 결과를 반환할 수 있습니다. 자바 메서드는 코드의 재사용성을 높이고, 프로그램을 더 모듈화하고 이해하기 쉽게 만드는 데 중요한 역할을 합니다.

 

 

메서드의 구조와 문법

자바 메서드는 다음과 같은 기본 구조를 가지고 있습니다.

 

접근제어자 반환형 메서드이름(매개변수) {
    // 메서드 내용
    // 결과 반환 (return 반환값;)
}

 

  • 접근 제어자(access modifier): 메서드의 접근 권한을 제어합니다. public, private, protected, package-private 등이 있습니다.
  • 반환형(return type): 메서드가 반환하는 값의 데이터 타입을 지정합니다. 반환값이 없을 경우 void를 사용합니다.
  • 메서드 이름(method name): 메서드를 호출할 때 사용되는 식별자입니다.
  • 매개변수(parameter): 필요한 경우 메서드에 전달되는 값을 받는 변수입니다.
  • 메서드 내용(method body): 메서드가 수행하는 작업을 구현하는 코드 블록입니다.
  • 반환문 (return statement): 반환형이 void가 아닌 경우, 메서드가 결과를 반환하는 데 사용됩니다.

 

 


메서드 호출과 반환

메서드는 다른 코드에서 호출되며 호출 과정에서 매개변수를 전달하고, 메서드 내에서 실행된 후 결과를 반환할 수 있습니다. 반환값은 메서드 호출을 통해 다른 변수에 저장하거나 직접 사용할 수 있습니다. 아래의 예제 코드를 통해 메서드 호출과 반환을 이해해 보겠습니다.

 

public class MethodExample {

    // 반환형이 int인 메서드 정의
    public static int add(int a, int b) {
        int sum = a + b;
        return sum; // 결과 반환
    }

    public static void main(String[] args) {
        int num1 = 5;
        int num2 = 3;

        // 메서드 호출과 반환값 저장
        int result = add(num1, num2);

        // 결과 출력
        System.out.println("덧셈 결과: " + result);
    }
}

 

 

위의 코드에서는 다음과 같은 과정이 이루어집니다.

 

(1) add 메서드가 호출될 때 num1과 num2의 값을 매개변수 a와 b에 전달합니다.

(2) add 메서드 내에서 a와 b를 더한 후, 그 결과를 sum 변수에 저장합니다.

(3) return sum; 구문을 통해 sum 값을 반환합니다.

(4) 메서드 호출 결과로 반환된 값을 result 변수에 저장합니다.

(5) result 변수의 값을 출력하여 덧셈 결과를 확인합니다.

 

 

:: 이렇게 메서드를 호출하고 반환값을 활용함으로써 메서드는 다른 부분에서 여러 번 사용될 수 있고, 코드의 재사용성을 높일 수 있습니다. 메서드의 반환값을 다른 변수에 할당하여 활용할 수 있으므로 코드를 더 모듈화하고 이해하기 쉽게 만들 수 있습니다.

 

 

 


메서드 시그니처와 매개변수

메서드 시그니처는 메서드를 고유하게 식별하는 표식입니다. 메서드 시그니처는 다음과 같은 구성 요소로 구성됩니다.

 

반환형 (Return Type): 메서드가 어떤 유형의 값을 반환하는지를 나타냅니다. 반환값이 없는 경우에는 void로 표시됩니다.

메서드 이름 (Method Name): 메서드를 호출할 때 사용하는 이름입니다. 메서드 이름은 중복되지 않아야 합니다.

매개변수 목록 (Parameter List): 메서드가 호출될 때 전달해야 하는 값을 나타내는 매개변수 목록입니다. 매개변수의 수, 유형 및 순서는 메서드를 식별하는 시그니처 중 하나입니다.

 

메서드 시그니처는 메서드의 유일성을 보장하고, 오버로딩된 메서드를 구별하기 위해 사용됩니다. 예를 들어, 같은 이름의 메서드가 다른 매개변수를 가지고 있는 경우에도 메서드 시그니처가 다르므로 자바는 이를 구별할 수 있습니다.

 

매개변수: 메서드에 전달되는 값

매개변수는 메서드에 전달되는 값을 저장하는 변수입니다. 메서드를 호출할 때 전달하는 값을 메서드 내에서 사용하려면 매개변수를 사용합니다. 매개변수는 메서드 시그니처에서 정의되며, 메서드 호출 시 인자로 전달됩니다.

 

public void printMessage(String message) {
    System.out.println(message);
}

 

 

위의 메서드는 message 라는 매개변수를 받아 화면에 메시지를 출력합니다. 메서드 호출 시 printMessage("안녕하세요!")와 같이 매개변수를 통해 메서드에 메시지값을 전달할 수 있습니다.

 

 

 


메서드의 종류

자바 메서드의 종류 중 두 가지 주요 유형, 즉 인스턴스 메서드정적(static) 메서드에 대해 자세히 살펴보겠습니다. 

 

 

1. 인스턴스 메서드: 객체 지향 프로그래밍의 핵심

인스턴스 메서드는 객체 지향 프로그래밍 (Object-Oriented Programming, OOP)의 핵심 개념 중 하나인 "객체"와 관련이 깊습니다. 이러한 메서드는 특정 클래스의 인스턴스(객체)에 속하며, 객체의 상태를 조작하거나 해당 객체와 관련된 동작을 정의합니다. 인스턴스 메서드는 객체를 생성한 후에만 호출할 수 있으며, 객체의 내부 데이터에 접근할 수 있습니다.

 

public class Circle {
    private double radius;

    // 인스턴스 메서드: 원의 넓이 계산
    public double calculateArea() {
        return Math.PI * radius * radius;
    }

    // 인스턴스 메서드: 반지름 설정
    public void setRadius(double r) {
        radius = r;
    }
}

 

 

 

2. 정적(static) 메서드: 클래스 수준의 동작 정의

정적 메서드는 특정 객체에 속하지 않고, 클래스 수준에서 정의되며 호출됩니다. 클래스 자체에 관련된 동작을 정의하는 데 사용됩니다. 정적 메서드는 객체를 생성하지 않고도 호출할 수 있으며, 주로 유틸리티 함수나 도우미 메서드를 구현하는 데 활용됩니다.

 

public class MathUtils {
    // 정적 메서드: 두 숫자의 합을 계산
    public static int add(int a, int b) {
        return a + b;
    }

    // 정적 메서드: 두 숫자의 차를 계산
    public static int subtract(int a, int b) {
        return a - b;
    }
}

 

 

 

3. 메서드 선택 및 활용

자바에서는 인스턴스 메서드와 정적 메서드  가지 주요 메서드 유형을 사용하여 객체 지향 프로그래밍  클래스 수준의 동작을 정의합니다자바 프로그래머는 인스턴스 메서드와 정적 메서드를 적절하게 선택하여 사용해야 합니다. 인스턴스 메서드는 객체의 상태와 동작을 조작하는 데 사용되며, 객체를 생성한 후에 호출됩니다. 반면에 정적 메서드는 객체와 관련 없는 동작을 정의하며, 객체 생성 없이 호출할 수 있습니다.

 

 

 


메서드 오버로딩과 가변 인수

 

메서드 오버로딩

메서드 오버로딩은 같은 이름의 메서드를 다양한 매개변수로 정의하는 기능입니다. 이로써 동일한 작업을 수행하는 메서드를 서로 다른 매개변수 조합으로 호출할 있습니다. 메서드 오버로딩은 메서드 이름을 기억하고 사용하기 쉽게 만들어주며, 코드의 가독성을 높입니다.

 

public class Calculator {
    // 정수형 두 숫자의 합 계산
    public int add(int a, int b) {
        return a + b;
    }

    // 실수형 두 숫자의 합 계산
    public double add(double a, double b) {
        return a + b;
    }

    // 세 숫자의 합 계산
    public int add(int a, int b, int c) {
        return a + b + c;
    }
}

 

 

 


가변 인수

가변 인수는 메서드가 다양한 개수의 인수를 처리할 있게 해주는 기능입니다. 가변 인수를 사용하면 매개변수의 개수를 미리 정하지 않고도 메서드를 호출할 있습니다. 이를 통해 메서드의 유연성을 향상시킬 있습니다.

 

public class Printer {
    // 가변 인수를 사용한 메서드
    public void printNumbers(int... numbers) {
        for (int num : numbers) {
            System.out.print(num + " ");
        }
        System.out.println();
    }
}

 

 

 

메서드 오버로딩과 가변 인수는 함께 사용될 있습니다. 이를 통해 메서드 호출 다양한 매개변수 개수와 타입을 처리할 있습니다.

 

public class Utility {
    // 가변 인수를 사용한 메서드 오버로딩
    public int sum(int... numbers) {
        int result = 0;
        for (int num : numbers) {
            result += num;
        }
        return result;
    }

    public double sum(double... numbers) {
        double result = 0;
        for (double num : numbers) {
            result += num;
        }
        return result;
    }
}

 

 

:: 메서드 오버로딩과 가변 인수를 사용할 어떤 상황에서 어떤 것을 선택할지 결정해야 합니다. 메서드 오버로딩은 매개변수 타입이나 개수가 명확한 경우에 유용하며, 가변 인수는 다양한 인수 개수를 처리해야 효과적입니다. 이러한 개념을 활용하면 효율적이고 유연한 코드를 작성할 있습니다.

 

 

 


메서드의 가시성과 접근 제어자

 

 

메서드의 가시성은 메서드가 어디서 볼 수 있는지를 결정하는 중요한 요소 중 하나입니다. 자바에서는 다음과 같은 네 가지 접근 수준이 있습니다.

1. public: 어떤 클래스에서든 접근 가능합니다.
2. protected: 동일한 패키지 내에서 또는 상속 관계의 클래스에서 접근 가능합니다.
3. default (package-private): 동일한 패키지 내에서만 접근 가능합니다.
4. private: 같은 클래스 내에서만 접근 가능합니다.

 

public class MyClass {
    public void publicMethod() {
        // 다른 클래스에서 접근 가능
    }
    
    protected void protectedMethod() {
        // 동일 패키지 또는 상속 관계에서 접근 가능
    }
    
    void defaultMethod() {
        // 동일 패키지 내에서만 접근 가능
    }
    
    private void privateMethod() {
        // 같은 클래스 내에서만 접근 가능
    }
}

 

 

접근 제어자

접근 제어자는 메서드의 가시성을 제어하는 사용됩니다. 이를 통해 클래스의 메서드를 외부에서 의도치 않은 접근으로부터 보호할 있으며, 코드를 모듈화하여 유지 보수를 쉽게 만들 있습니다.

 

public class BankAccount {
    private double balance; // private으로 설정하여 외부에서 직접 접근 불가

    // 접근자 메서드 (getter)를 통해 balance에 접근
    public double getBalance() {
        return balance;
    }

    // 수정자 메서드 (setter)를 통해 balance 수정
    public void setBalance(double newBalance) {
        if (newBalance >= 0) {
            balance = newBalance;
        }
    }
}

 

:: 메서드의 가시성을 선택할 , 클래스의 역할과 보안 요구사항을 고려해야 합니다. 공개(public) 메서드는 다른 클래스에서 사용해야 유용하며, private 메서드는 내부 로직을 숨길 유용합니다. 이러한 접근 제어자를 효과적으로 활용하여 코드를 구성하면 코드의 안정성과 유지 보수성을 향상시킬 있습니다.

 

 

 


메서드의 최적화

메서드 최적화는 프로그램의 성능을 향상시키는 과정으로, 메서드를 빠르게 실행하거나 적은 메모리를 사용하도록 최적화하는 것을 의미합니다. 이를 통해 프로그램이 빠르고 효율적으로 실행될 있습니다.

 

 

메서드 디자인 패턴

메서드 디자인 패턴은 특정 상황에서 가장 적합한 메서드 구조를 선택하고, 코드를 재사용하기 위한 일련의 가이드라인과 원칙을 제공합니다. 이러한 패턴은 코드의 유지 보수성을 향상시키며, 다른 개발자와의 협업을 쉽게 만듭니다.

 

 

디자인 패턴 예제: 팩토리 메서드 패턴 (Factory Method Pattern)

 

public interface Shape {
    void draw();
}

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("원을 그립니다.");
    }
}

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("사각형을 그립니다.");
    }
}

public abstract class ShapeFactory {
    public abstract Shape createShape();
}

public class CircleFactory extends ShapeFactory {
    @Override
    public Shape createShape() {
        return new Circle();
    }
}

public class RectangleFactory extends ShapeFactory {
    @Override
    public Shape createShape() {
        return new Rectangle();
    }
}

 

 

:: 팩토리 메서드 패턴은 객체 생성을 캡슐화하여 객체 생성 방법을 서브클래스에 위임합니다. 이를 통해 클라이언트 코드는 실제 객체 생성 로직과 분리됩니다. 예제에서는 ShapeFactory 클래스를 상속하여 구체적인 도형을 생성하는 메서드를 제공합니다.

 

 

 


메서드 성능 최적화

메서드 성능 최적화는 코드의 실행 시간과 메모리 사용량을 최소화하여 프로그램이 효율적으로 동작하도록 도와줍니다. 이를 통해 사용자 경험을 향상시키고 서버 자원을 절약할 있습니다.

 

 

메서드 성능 최적화 기법

1. 적절한 자료구조 선택: 적절한 자료구조를 선택하는 것은 성능 최적화의 핵심입니다.  ArrayList, LinkedList, HashMap, ConcurrentHashMap 등과 같은 데이터 구조를 신중하게 선택하여 프로그램의 효율성을 향상시킬 수 있습니다.

2. 루프 최적화: 루프 내부에서 불필요한 계산을 최소화하고 루프의 반복 횟수를 줄이는 것이 성능 향상에 도움이 됩니다.

3. 멀티스레딩: 멀티스레드를 활용하여 병렬 처리를 통해 성능을 향상시킬 수 있지만, 스레드 동기화에 주의해야 합니다.

4. JIT 컴파일러 최적화: 자바의 JIT(Just-In-Time) 컴파일러는 실행 중에 코드를 최적화하므로, 최적화된 코드를 작성하고 반복 호출을 최소화하는 것이 중요합니다.

 

:: 성능 최적화는 코드 작성 후에도 계속 진행되어야 합니다. 프로파일링 도구를 사용하여 어떤 메서드가 성능에 영향을 미치는지 파악하고, 병목 현상을 해결하는 데 도움을 받을 수 있습니다. 이를 통해 성능 문제를 빠르게 식별하고 해결할 수 있습니다.

 

 

메서드 성능 최적화 예제: 루프 최적화 (Loop Optimization)

 

public class LoopOptimizationExample {
    public static int sumArray(int[] array) {
        int sum = 0;
        for (int i = 0; i < array.length; i++) {
            sum += array[i];
        }
        return sum;
    }
}

 

:: 루프 최적화는 반복문 내부의 계산을 최소화하고 불필요한 반복을 줄이는 것을 목표로 합니다. 예제에서는 배열의 합을 계산하는 루프를 최적화하였습니다.

 

 

 


메서드 디자인 패턴과 최적화의 혼합 활용

메서드 디자인 패턴과 최적화 기법은 종종 혼합해서 사용됩니다. 효과적인 코드 디자인 패턴을 사용하면 코드가 더 최적화하기 쉬워집니다.

 

 

혼합 활용 예제: 싱글톤 패턴과 최적화 (Singleton Pattern)

 

public class Singleton {
    private static Singleton instance;
    
    private Singleton() {
        // 생성자 코드
    }
    
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

 

 

:: 싱글톤 패턴은 오직 하나의 인스턴스만 생성하도록 보장하는 패턴입니다. 이를 통해 메모리와 자원을 절약할 있습니다. 코드 최적화를 위해 인스턴스 생성 메서드에 동기화를 추가하였습니다.

 

 

 

 


자바 메서드는 코드의 재사용성과 유지보수성을 높이는 데 중요한 역할을 합니다. 메서드를 올바르게 작성하고 최적화하는 것은 자바 애플리케이션의 성능과 효율성을 향상시키는 데 중요합니다. 메서드의 기본 원리, 작성 방법, 유형  최적화 전략에 대해 이해하고 활용하는 것을 통해 더 나은 소프트웨어를 개발할 수 있습니다. 

 

'# Coding > Java' 카테고리의 다른 글

자바 생성자 소멸자 this 키워드  (0) 2023.09.23
자바 객체와 메모리  (0) 2023.09.22
자바 클래스 제작, 객체 생성  (0) 2023.09.19
자바 객체 지향 프로그래밍  (1) 2023.09.14
자바 조건문 반복문  (0) 2023.09.13