오버로딩
오버로딩은 한 클래스 내에 같은 이름의 메서드를 여러개 정의하는것입니다.
오버로딩의 조건은
1. 메서드 이름이 같아야합니다
2. 매개변수의 타입이나 개수가 달라야 합니다
그럼 오버로딩을 왜 쓰는걸까요?
만약 메서드가 변수처럼 이름만으로 구별이된다면, 모든 메서드의 이름은 달라질겁니다. 그렇게되면 가독성이 떨어질수있고 메소드명을 짓는데도 시간이 걸릴거같군요..? 또 이름을 일일이 기억해야하는데 쉬운일이 아닐겁니다
public class Calculator {
// 두 정수를 더하는 메서드
public int add(int a, int b) {
return a + b;
}
// 세 정수를 더하는 메서드
public int add(int a, int b, int c) {
return a + b + c;
}
// 두 실수를 더하는 메서드
public double add(double a, double b) {
return a + b;
}
}
위 코드는 오버로딩의 예제입니다 모두 add라는 이름을 가지고 있지만 매개변수의 타입이 다르거나 개수가 다르기때문에
에러가 발생하지않습니다.
public class Main {
public static void main(String[] args) {
Calculator c = new Calculator();
c.add(2, 3); // 두 정수
c.add(4, 4, 4); // 세 정수
c.add(2.2, 3.3); // 두 실수
}
}
이런식으로 오버로딩을 사용하면 비슷한 기능들의 메서드가 묶여있기 때문에
가독성이 향상되고 메서드의 이름만 보고 예측이 가능하게됩니다!
단점
비슷한 기능들이 아닌 메서드들을 오버로딩으로 사용해버린다면 혼동을 줄수 있으니 주의해야합니다!
이러한 오버로딩이 잘 이용 되는곳이 생성자입니다!
생성자
생성자의 조건은
클래스의 이름과 같아야하고 리턴값은 없습니다!
public class Person {
private String name;
private int age;
public Person() {
this("Unknown", 0); // 다른 생성자 호출
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Person이라는 클래스 안에 두개의 메서드가 있습니다
첫 번째는 기본 생성자입니다 여기서는 처음보는 this()가 보이네요
두 번째는 매개변수가 들어가있고 this 라는게 적혀있네요
두개의 차이점을 얘기해보겠습니다
생성자 this()는
생성자에서 다른 생성자를 호출할때 사용합니다
다른 생성자 호출시 첫 줄에서만 사용이 가능합니다!
참조변수 this는
인스턴스 자신을 가리키는 참조변수입니다
인스턴스 메서드에서 사용가능합니다
this를 사용하여 인스턴스 변수와, 지역 변수를 구별 할수 있습니다
첫번째 메서드의 this()는 두번째 메서드를 호출한다고 생각하면됩니다
기본 생성자이면서 동시에 두번째 메서드를 호출하면서 기본값을 설정하게됩니다!
두번째 메서드에 있는 this는 참조 변수이기때문에 사용자가 입력한 값이 그대로 들어간다고 보면됩니다!
도대체 인스턴스 변수는 뭘까요?
쉽게 말하면 클래스에서 static이 안붙은 변수라고 생각하면되는데
클래스 변수와 비교해서 코드로 보여드리겠습니다
public class Example {
private int instanceVariable; // 인스턴스 변수
private static int classVariable; // 클래스 변수
public Example(int value) {
this.instanceVariable = value; // 인스턴스 변수를 초기화
classVariable++; // 클래스 변수(공유된 데이터)를 증가시킴
}
public int getInstanceVariable() {
return instanceVariable; // 인스턴스 변수 반환
}
public static int getClassVariable() {
return classVariable; // 클래스 변수 반환
}
}
Example이라는 메서드를 호출하면 value에는 사용자가 입력한 값이 들어가게 될거고
클래스 변수는 1이 증가하게됩니다
public class Main {
public static void main(String[] args) {
Example obj1 = new Example(10);
Example obj2 = new Example(20);
Example obj3 = new Example(30);
// 인스턴스 변수는 각 객체마다 다릅니다.
System.out.println(obj1.getInstanceVariable()); // 출력: 10
System.out.println(obj2.getInstanceVariable()); // 출력: 20
System.out.println(obj3.getInstanceVariable()); // 출력: 30
// 클래스 변수는 모든 객체가 공유합니다.
System.out.println(Example.getClassVariable()); // 출력: 3
}
}
메인 메서드에서 호출시켜보겠습니다
먼저 객체를 생성시켜주고 각각 10, 20, 30이 value값에 담기게 됩니다
실행을 시켜보면 인스턴스 변수는 객체마다 다른값이 출력되지만
클래스 변수에는 1씩 증가가 3번 이루어 지기 때문에 3이 출력됩니다!
객체지향을 공부하다보니 처음에 배운 기본형 변수, 참조형 변수가 아닌 인스턴스변수, 클래스변수, 지역변수 등을
새롭게 공부하게 되네요
'Java' 카테고리의 다른 글
자바 이차원배열 (2) | 2024.01.25 |
---|---|
자바 배열 (0) | 2024.01.15 |
자바 완전수 구하기. (0) | 2024.01.09 |
자바 2438 별찍기.. (0) | 2024.01.09 |
자바 백준 2480번 (0) | 2024.01.08 |