Java에서 기본 데이터 타입(primitives)은 Call by Value로 전달된다. 하지만 객체는 참조(reference)로 전달되기 때문에 함수 내에서 해당 객체의 멤버를 수정하면 원래 객체도 함께 변경된다.
예제 (Java):
class MyList {
ArrayList<Integer> list = new ArrayList<>();
public void add(int value) {
list.add(value);
}
public void printList() {
System.out.println(list);
}
}
public class TestReference {
public static void modifyList(MyList myList) {
myList.add(100);
}
public static void main(String[] args) {
MyList myList = new MyList();
myList.add(1);
myList.add(2);
myList.add(3);
modifyList(myList);
myList.printList(); // 출력: [1, 2, 3, 100]
}
}
해당 예제에서 MyList 클래스의 객체 myList를 modifyList 함수에 전달하면, 함수 내의 myList 매개변수는 원본 myList 객체의 참조를 받고, 따라서 함수 내에서 해당 객체를 수정하면 원본 myList 객체도 함께 수정된다.
Override (오버라이드):
상속 관계에 있는 클래스들 사이에서 동일한 이름의 메서드를 재정의하는 것을 의미한다.
자식 클래스에서 부모 클래스의 메서드를 자신의 필요에 맞게 변경하여 사용할 때 사용되며
메서드의 시그니처(이름, 매개변수 타입 및 수)는 동일해야 한다.
예제 (Java):
class Animal {
void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("Dog barks");
}
}
Overload (오버로드):
동일한 클래스 내에서 메서드 이름은 동일하지만 매개변수의 타입, 수, 순서가 다른 여러 버전의 메서드를 정의하는 것을 의미한다.
같은 기능을 하는 메서드에 대해 다양한 입력 형태를 제공할 수 있다.
예제 (Java):
class Calculator {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
}
이 예제에서 Calculator 클래스는 add라는 메서드를 오버로드하여 여러 버전을 제공하고 있다.