Java에서 코드의 재사용성을 높이면 개발 시간을 줄이고 유지보수를 쉽게 할 수 있습니다. 함수와 메서드는 이러한 재사용성을 가능하게 합니다. 이번 글에서는 Java의 함수와 메서드에 대해 설명하고, 구체적인 예제 코드를 통해 알아보겠습니다.
자바의 함수와 메서드의 개념
Java에서 함수와 메서드는 동일한 개념입니다. 둘 다 특정 작업을 수행하는 코드 블록을 의미합니다. 함수는 특정 작업을 수행하는 코드 블록을 의미하며, 메서드는 클래스 내부에 정의된 함수를 지칭합니다. Java는 엄격한 객체 지향 프로그래밍 언어이기 때문에 모든 함수는 클래스에 속한 메서드로 정의됩니다.
메서드 정의하기
메서드는 반환타입 메서드이름(매개변수)
형식으로 정의됩니다. 다음은 간단한 메서드를 정의한 예제입니다:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int subtract(int a, int b) {
return a - b;
}
}
위 예제에서 Calculator
클래스는 두 개의 메서드, add
와 subtract
를 정의합니다. 각각의 메서드는 두 개의 정수를 입력받아 그 합과 차를 반환합니다.
메서드 호출하기
메서드를 호출하려면 객체를 생성한 후, 해당 객체를 통해 메서드를 호출할 수 있습니다. 호출할 때에는 메서드 이름과 필요한 매개변수를 전달합니다. 다음은 위에서 정의한 Calculator
클래스를 사용하는 예제입니다.
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
int sum = calc.add(5, 3);
int difference = calc.subtract(5, 3);
System.out.println("Sum: " + sum);
System.out.println("Difference: " + difference);
}
}
위의 Main 클래스에서는 new
연산자를 사용하여 Calculator
객체를 생성하고, 객체인 calc에
있는 add
와 subtract
메서드를 호출하여 결과를 출력합니다.
메서드의 반환값과 void 메서드
메서드는 반환값을 가질 수 있으며, 반환 타입은 메서드 정의에 명시됩니다. 반환값이 없는 메서드는 반환타입을 쓰는 대신에 void
키워드를 사용합니다. 다음은 반환값이 있는 메서드와 없는 메서드의 예제입니다:
public class MyClass {
// 반환값이 있는 메서드
public int multiply(int a, int b) {
return a * b;
}
// 반환값이 없는 메서드
public void printMessage(String message) {
System.out.println(message);
}
public static void main(String[] args) {
MyClass myClass = new MyClass();
int product = myClass.multiply(4, 5);
System.out.println("Product: " + product); // Product: 20
myClass.printMessage("Hello, World!"); // Hello, World!
}
}
위 예제에서 multiply
메서드는 두 개의 정수 인자를 받아 그 곱을 반환합니다. 반면, printMessage
메서드는 문자열을 받아 콘솔에 출력할 뿐, 반환값은 없습니다.
메서드 오버로딩(Method Overloading)
Java에서는 같은 이름의 메서드를 여러 개 정의할 수 있는데, 이를 메서드 오버로딩이라고 합니다. 오버로딩된 메서드는 매개변수의 타입, 개수 또는 순서가 다릅니다. 다음은 메서드 오버로딩의 예제입니다.
public class MathOperations {
public int multiply(int a, int b) {
return a * b;
}
public double multiply(double a, double b) {
return a * b;
}
public int multiply(int a, int b, int c) {
return a * b * c;
}
}
위 예제에서 multiply
메서드는 세 번 정의되었습니다. 각각 정수 두 개, 실수 두 개, 정수 세 개를 입력받아 곱셈을 수행합니다. 이러한 메서드 오버로딩은 가독성을 높이고 유연성을 제공합니다.
메서드 오버라이딩(Method Overriding)
메서드 오버라이딩은 상속 관계에 있는 클래스에서 상위 클래스의 메서드를 재정의하는 것을 의미합니다. 오버라이딩을 통해 하위 클래스에서 상위 클래스의 동작을 변경할 수 있습니다. 다음의 예제를 살펴보겠습니다.
public class Animal {
public void makeSound() {
System.out.println("Animal sound");
}
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Bark");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
myDog.makeSound();
}
}
위에서 Dog
클래스는 Animal
클래스를 상속받고, 부모클래스의 makeSound
메서드를 오버라이딩하여 'Bark'를 출력합니다. 이를 통해 다형성을 구현할 수 있습니다. 다형성은 객체지향 프로그래밍의 핵심 원리 중의 하나로, 하나의 참조 변수가 여러 형태의 객체를 참조할 수 있는 능력을 의미합니다. 상위 클래스의 참조로 하위 클래스의 인스턴스를 다룰 수 있게 하여 프로그램의 확장성과 유연성을 크게 향상시킵니다.
인스턴스 메서드와 클래스 메서드
메서드는 인스턴스 메서드와 클래스 메서드로 구분됩니다. 인스턴스 메서드는 객체의 인스턴스를 통해 호출되며, 클래스 메서드는 클래스 자체를 통해 호출됩니다. 클래스 메서드는 static 키워드를 사용하여 정의됩니다. 다음의 인스턴스 메서드와 클래스 메서드의 예제를 살펴보겠습니다.
public class MyClass {
// 인스턴스 메서드
public void instanceMethod() {
System.out.println("Instance method");
}
// 클래스 메서드
public static void classMethod() {
System.out.println("Class method");
}
public static void main(String[] args) {
MyClass myClass = new MyClass();
myClass.instanceMethod(); // Instance method
MyClass.classMethod(); // Class method
}
}
이 예제에서는 instanceMethod
와 classMethod
를 정의했습니다. instanceMethod
는 객체 myClass
를 통해 호출되고, classMethod
는 클래스 MyClass
를 통해 직접 호출됩니다. 인스턴스 메서드는 객체 상태에 접근할 수 있지만, 클래스 메서드는 클래스 변수에만 접근할 수 있습니다.
메서드의 접근 제어
메서드의 접근 제어를 통해 메서드의 접근 범위를 지정할 수 있습니다. 메서드의 접근 제어자는 해당 메서드에 접근할 수 있는 범위를 정의합니다. 접근 제어자는 public
, protected
, default
, private
가 있습니다. 다음은 접근 제어자의 예제입니다:
public class MyClass {
// public 메서드
public void publicMethod() {
System.out.println("Public method");
}
// protected 메서드
protected void protectedMethod() {
System.out.println("Protected method");
}
// private 메서드
private void privateMethod() {
System.out.println("Private method");
}
// default 메서드
void defaultMethod() {
System.out.println("Default method");
}
public static void main(String[] args) {
MyClass myClass = new MyClass();
myClass.publicMethod(); // Public method
myClass.protectedMethod(); // Protected method
myClass.privateMethod(); // Private method
myClass.defaultMethod(); // Default method
}
}
이 예제에서는 MyClass에 네 가지 접근 제어자를 사용한 메서드를 정의했습니다. 각각의 메서드는 접근 제어자에 따라 다른 접근 범위를 가지기 때문에 접근 제어자를 통해 메서드의 접근성을 제어할 수 있습니다.
public
: 모든 클래스에서 접근할 수 있습니다.protected
: 같은 패키지 또는 상속받은 클래스에서 접근할 수 있습니다.default
: 같은 패키지에서만 접근할 수 있습니다. 접근 제어자를 명시하지 않으면 기본적으로default
로 설정됩니다.private
: 같은 클래스 내에서만 접근할 수 있습니다.
요약
Java에서 함수와 메서드는 코드를 모듈화하고 재사용성을 높이는 중요한 요소입니다. 메서드를 사용하면 코드의 가독성과 유지보수성을 높일 수 있으며, 메서드 오버로딩과 오버라이딩을 통해 유연한 코드 작성이 가능합니다. 또한 static 메서드를 활용하여 객체를 생성하지 않고도 메서드를 사용할 수 있습니다. 접근 제어자를 통해 메서드의 접근 범위를 제어함으로써 코드의 보안성을 높일 수 있습니다.
2024.06.07 - [Java] - 자바(Java): 스택(Stack)과 힙(Heap) 메모리 영역
자바(Java): 스택(Stack)과 힙(Heap) 메모리 영역
자바에서 메모리 중에서 스택(Stack)과 힙(Heap) 영역은 서로 다른 방식으로 데이터를 저장하고 관리합니다. 이번 글에서는 스택과 힙이 무엇인지, 차이점, 그리고 이들이 자바 프로그램에서 어떻
it-learner.tistory.com