매개 변수의 수를 모를 경우 -> 매개 변수를 배열 타입으로 선언한다.
e.g.
int sum1(int[] values) {
int sum = 0;
for(int i=0; i<values.length; i++) {
sum += values[i];
}
return sum;
}
int sum2(int ... values) {
int sum = 0;
for(int i=0; i<values.length; i++) {
sum += values[i];
}
return sum;
}
-----------------------------------------------
int[] value1 = {1,2,3};
int result1 = sum1(value1);
int result2 = sum1(new int[] {1,2,3.4,5});
int result3 = sum2(1,2,3);
※ 알아둬도 나쁠거 없는 상식
1. int 타입은 double 타입으로 자동 변환된다.
e.g.
double result = 10 + 20; -> 30.0
메소드 오버로딩
매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다.
리턴 타입만 다르고 매개 변수가 동일하다면 오버로딩이 아니다.
e.g.
double areaRectangle(double width) {
return width*width;
}
double areRectangle(double width, double height) {
return width*height;
}
인스턴스 멤버(필드, 메소드)와 this의 관계
= 객체 내부에서 인스턴스 멤버에 접근하기 위해 this를 사용한다.
정적 멤버(클래스 멤버)와 static
- 객체를 생성하지 않고도 사용할 수 있는 특징을 갖고 있다.
- 원칙적으로 클래스 이름으로 접근해야 한다.
- 정적 필드를 위한 초기화 작업을 위해 static block을 제공한다.
- 정적 멤버는 인스턴스 멤버를 사용할 수 없다.
Q. 정적 멤버, 인스턴스 멤버 선언 시 판단 기준은 무엇일까?
A. 객체 마다 가지고 있어야 할 데이터라면 인스턴스 필드로 선언하고, 공용적인 데이터라면 정적 필드로 선언하는 것이 좋다.
싱글톤
- 가끔 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우가 있다.
- 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다. (생성자 앞에 private을 붙인다.)
- private static [클래스] [객체이름] = new [클래스]();
- static [클래스] getInstance() { return [객체이름]; } (항상 동일한 객체를 return 한다.)
final
- 필드 선언 시에 값을 할당하거나, 생성자에서 초기화할 수 있다.
- static으로 선언시에는 static block에서도 초기화할 수 있다.