Sample s1 = new Sample(); <-- 생성자
// 객체를 생성하는 것은 new 키워드
클래스이름() {}
// 기본 생성자
클래스이름(타입 변수명, 타입 변수명, ...) {
// 인스턴스 생성시 수행될 코드,
// 주로 인스턴스 변수의 초기화 코드를 적는다.
}
생성자 메소드의 이름이 클래스(설계도) 이름과 동일함으로, 객체 생성에 사용되는 설계도가 무엇인지 알려준다.
모든 객체는 초기화 작업을 수행한 후에 사용할 수 있다. 즉, 객체가 생성된 후에는 즉시 초기화 작업을 수행해야 한다. 생성자 메소드에 초기화 작업을 구현해 놓으면, 생성자 메소드를 통해서 객체 생성에 사용할 설계도 이름, 객체 생성 직후에 실행할 메소드 이름을 한번에 알려줄 수 있다.
생성자에서 다른 생성자를 호출하는 메소드이며 오직 생성자에서만 사용할 수 있다.
코드의 중복을 제거하기 위해 사용하며 반드시 첫줄에 적어야 한다.
같은 클래스 내의 생성자들은 일반적으로 서로 관계가 깊은 경우가 많다. 이처럼 서로 호출하도록 하여 유기적으로 연결해주면 수정이 필요한 경우 보다 적은 코드만을 변경하면 되므로 유지보수가 쉬워진다.
예)
Employee (String id, String name,
String department, int salary) {
this(id, name, department, salary, 0.0);
}
Employee (String id, String name,
String department, int salary,
double commissionPct) {
this.id = id;
this.name = name;
this.department = department;
this.salary = salary;
this.commissionPct = commissionPct
}
예)
public class Product {
int no;
String name;
}
Product(int no, String name) {
this.no = no;
this.name = name;
}

명시적 초기화
- 변수를 선언과 동시에 초기화하는 것을 명시적 초기화라고 한다.
- 가장 기본적이면서 간단한 초기화 방법이다.
초기화 블럭
클래스 초기화 블럭
: 클래스 변수의 복잡한 초기화에 사용된다.
: 인스턴스 초기화 블럭 앞에 static을 덧붙이기만 하면 된다.
인스턴스 초기화 블럭
: 인스턴스변수의 복잡한 초기화에 사용된다.
: 단순히 클래스 내에 블럭{}을 만들고 그 안에 코드를 작성하기만 하면 된다.
초기화 순서
- 클래스 변수의 초기화 --> 인스턴스 변수의 초기화
- 자동 초기화 --> 명시적 초기화(간단) --> 초기화 블럭, 생성자(복잡)
public static final 타입 상수명 = 값;
public class Sample {
int x;
static int y;
static void m1() {
// 클래스메소드는 멤버변수에 접근할 수 없다.
sop(x); //오류
sop(y);
}
// 클래스메소드는 멤버메소드를 실행할 수 없다.
static void m2() {
m1();
m3(); //오류
}
// 멤버메소드는 멤버변수, 클래스변수 모두 사용할 수 있다.
void m3() {
sop(x);
sop(y);
}
// 멤버메소드는 멤버메소드, 클래스메소드 모두 실행할 수 있다.
void m4() {
m1();
m2();
}
}
* Sample.m1(); 수행문을 실행했을 때,
클래스변수 y, 클래스메소드 m1(), m2()는 사용가능한 상태다.
멤버변수 x, 멤버메소드 m3(), m4()는 사용가능한 상태가 아니다.
따라서, 클래스메소에서는 멤버변수와 멤버메소드를 사용할 수 없다.
* 멤버변수를 사용하기 위해서는 객체를 생성하고,
생성된 객체를 참조하는 참조변수를 이용해야한다.
- main이 static인 이유
: 객체 생성 없이 바로 실행 가능하게 하기 위해서
public class Circle {
// 멤버변수, 인스턴스 변수
double r;
// 클래스 변수
static final double PI = 3.141592;
Circle(double r) {
this.r = r;
}
// 멤버 메소드, 인스턴스 메소드
void round() {
double result = 2*Circle.PI*r
return result;
}
}
public final class A { <--- final 클래스
final int B = 10; <--- final 멤버변수
public void C { <--- final 메서드
final int D = B; <--- final 지역변수
}
}
final 클래스
- 변경될 수 없는 클래스, 확장될 수 없는 클래스다.
- 다른 클래스의 조상이 될 수 없다.
final 멤버변수
- 변경될 수 없는 메서드다.
- 오버라이딩을 통해 재정의 될 수 없다.
final 메서드
- 값을 변경할 수 없는 상수가 된다.
final 지역변수
- 값을 변경할 수 없는 상수가 된다.