static(정적인)
static은 인스턴스 없이 사용 가능한 필드(변수) / 메소드로 멤버에만 해당된다. (지역변수에는 붙지 않음)
제어자)
- 접근제어자 : public, protectedm default, private
- 기타제어자 : static, final
static 멤버 변수는 사용 시 클래스의 이름으로 사용되며, 같은 클래스로 만들어진 모든 인스턴스가 공유하는 공간이 된다.
인스턴스 멤버와 스태틱 멤버의 사용에 대한 제약사항)
- 인스턴스 멤버는 스태틱 메소드에서 사용 불가 (인스턴스 멤버는 스태틱 메소드에서만 사용 가능)
- 스태틱 멤버는 모든 경우에 사용 가능 => static 멤버는 보호하기 어려운 멤버이다.
final 제어자
변수 앞에 final이 붙으면 상수가 된다.
final이 클래스 앞에 붙으면 => 상속 불가능한 클래스
final이 메소드 앞에 붙으면 => 재정의가 안 되는 메소드
메소드의 다형성
하나의 클래스에 같은 이름의 메소드를 다수 정의하는 것이 메소드의 다형성이다. 또 다른 말로는 메소드 오버로딩(Method Overloading)이라고 한다.
오버로딩의 조건)
- 메소드의 이름이 같아야 한다.
- 매개변수의 개수 또는 자료형이 달라야 한다.
- 반환형은 상관없다.
public class OverloadingTest {
public static void main(String[] args) {
System.out.println();//대표적인 오버로딩 메소드
SimpleCal sc = new SimpleCal();
int result = sc.add(10, 20);
result = sc.add(1, 3.14f);
float rf = sc.add(5.4f, 3.7f);
result = sc.add(10, 20, 30);
}
}
// 메소드의 이름이 모두 같지만 매개 변수의 개수 혹은 타입이 다름
class SimpleCal {
public int add(int a, int b){ // 정수만 덧셈한다.
int r = a + b;
return r;
}
public int add(int a, float b){
float r = a + b;
return (int)r;
}
public int add(int a, int b, int c){
int r = a + b + c;
return r;
}
// 오버로딩이 안 되는 경우
// public float add(int x, int y){
// float r = x + y;
// return r;
// }
public float add(float a, float b){ // 실수 덧셈
float r = a + b;
return r;
}
}
생성자(Constructor)
생성자는 인스턴스가 생성될 때 호출(사용)되는 메소드이다.
기본 생성자는 생성자 중 매개가 없는 생성자를 말하는데, 생성자가 없는 클래스에는 자동으로 기본 생성자를 컴파일러가 작성하여 처리한다.
또한 생성자는 인스턴스를 생성할 때만 새용할 수 있는 특수한 메소드로 필드(멤버 변수)의 값을 초기화할 때 사용한다.
생성자는 인스턴스의 생성과 관련된 메소드이기 때문에 public으로 작성한다. (예외 존재)
인스턴스 생성 문법)
클래스명 인스턴스명 = new 생성자();
생성자의 특수성)
- 클래스의 이름과 같은 이름을 갖는다. (대소문자까지)
- 반환형을 작성하지 않는다. (void도 사용하지 않음)
- 모든 클래스는 최소 하나의 생성자가 있어야 한다.
생성자 오버로딩)
생성자 오버로딩을 통해 다양한 매개변수를 갖는 여러 개의 생성자를 작성할 수 있다.
멤버변수의 초기값
지역변수는 자동으로 초기값이 들어가지 않는다. 그러나 멤버변수는 자동으로 0에 해당하는 초기값을 넣어준다.
종류는 다음과 같다.
- 정수형(byte, short, int, long) = 0
- 실수형(float, double) = 0.0
- 문자형(char) = '\0' <- null 문자
- 논리형(boolean) = false
- 문자형(String) = null
this 키워드
this란 인스턴스를 구별하기 위한 방법으로 일종의 참조변수, 멤버를 지칭하는 대명사이다.
this.변수명 => 같은 이름의 멤버 변수와 지역 변수를 구분하는 용도
생성자를 나타내는 this() 메소드 => 유일하게 생성자를 호출하는 용도로 생성자 안에서 다른 생성자를 호출한다.
import com.dto.PhoneInfo;
public class ThisConstructorTest {
public static void main(String[] args) {
Car c1 = new Car("white");
String str = "홍길동";
PhoneInfo p = new PhoneInfo(str,
"010-1234-5678",
"12-12", 25);
}
}
class Car {
private String color;
private String gearType;
private int door;
// 기본 생성자
public Car() {}
public Car(String color) {
// this.color = color;
this(color, null);
}
public Car(String color, String gearType) {
// this.color = color;
// this.gearType = gearType;
this(color, gearType, 0);
}
public Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
public void constrCall() {
// this("white")
// 생성자 this는 생성자 메소드에서만 사용할 수 있음
// 인스턴스 생성 후 생성자인 this를 사용하는 것은 말이 되지 않음
}
}