자바의 정석 65~69강 static&인스턴스 메서드, 오버로딩, 생성자, this(), 변수 초기화
ch 6-26~29 static 메서드와 인스턴스 메서드
인스턴스 변수 사용여부가 인스턴스/static 메서드 차이
1. 인스턴스 메서드
- 인스턴스 생성 후 참조변수.메서드이름() 으로 호출
- 인스턴스 멤버와 관련된 작업을 하는 메서드
- 메서드 내에서 인스턴스 변수 사용가능
2. static 메서드(클래스 메서드)
- 객체 생성 없이 클래스이름.메서드이름() 으로 호출
- Math.random(), Math.round()
- 인스턴스 멤버와 관련 없는 작업을 하는 메서드
- 메서드 내에서 인스턴스 변수 사용 불가
class MyMath {
// 인스턴스 변수 iv
long a, b;
// 인스턴스 메서드
// iv 사용 매개변수가 없음
long add() {
return a + b; // 인스턴스 변수 iv
}
// 클래스 메서드(static 메서드)
// iv를 사용하지 않을 때 만듦
// iv 사용안함 매개변수를 사용
static long add(long a, long b) {
return a + b; // 지역 변수 lv
}
}
class MyMathTest2 {
public static void main(String args[]) {
// 클래스 메서드 호출
// 객체 생성없이 사용가능
System.out.println(MyMath2.add(200L, 100L);
// 인스턴스 생성
MyMath2 mm = new MyMath2();
mm.a = 200L;
mm.b = 100L;
// 인스턴스 매서드 호출
// 객체 생성 후 사용가능
System.out.println(mm.add());
}
}
3. static
속성 중 공통 속성에 static
인스턴스 멤버를 사용하지 않는 메서드에 static
4. 메서드 간의 호출과 참조
- static메서드는 인스턴스 변수를 사용할 수 없음
- 객체 생성 후 사용가능
- static메서드는 인스턴스 메서드를 호출할 수 없다
- 인스턴스 메서드는 인스턴스 변수를 사용하는 메서드로 객체를 생성 후 사용 가능
자바의 정석 56~60강 클래스의 정의, 변수 종류, 클래스/인스턴스 변수, 메서드
ch 6-9~10 클래스 정의 1. 클래스 설계도 데이터+함수 사용자 정의타입 변수 : 하나의 데이터를 저장할 수 있는 공간 배열 : 같은 종류의 데이터를 묶어서 저장할 수 있는 공간 구조체 : 서로 연관된
minghxx.tistory.com
ch 6-30~31 오버로딩
1. 오버로딩
한 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것
예시로 println(), println(boolean x), println(char x) 등
2. 오버로딩이 성립하기 위한 조건
- 메서드 이름이 같아야 함
- 매개변수 개수 또는 타입이 달라야 함
- 반환타입은 영향 없음
// 오버로딩
long add(int a, long b) { return a + b; }
long add(long a, int b) { return a + b; }
add(3, 3); // ambiguous 에러발생. 어떤 메서드를 호출하는지 모호함
+) 메서드 이름은 동사로
ch 6-32~35 생성자, 기본 생성자
1. 생성자 constructor
인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드
- 클래스 이름과 같아야 함
- 리턴값이 없음(void 안 붙임) → 반환값이 없기 때문
- 모든 클래스는 반드시 생성자 있어야 함
2. 기본 생성자
매개변수가 없는 생성자
생성자가 하나도 없을 때만 컴파일러가 자동 추가
// 생성자가 하나도 없으면 컴파일러가 자동으로 추가 Data_2(){}
class Data_1 {
int value;
}
// 생성자가 하나라도 있으면 직접 추가 Data_2(){}
class Data_2 {
int value;
// Data_2(){} 기본 생성자 추가해야함
Data_2(int x) {
value = x;
}
}
class Ex6_11 {
pubic static void main(String[] args) {
Data_1 d1 = new Data_1();
// 에러 발생, 기본 생성자가 없어서 Data_2 찾지못함(cannot resolve symbol)
Data_2 d2 = new Data_2();
}
}
3. 매개변수가 있는 생성자
// 기본생성자
Car(){}
// 매개변수가 있는 생성자
Car(String c, String g) {
color = c;
type = g;
}
// 객체 생성
Car c = new Car();
c.color = "white";
c.type = "auto";
// 객체생성시 코드 간결
Car c = new Car("white", "auto")
/*
1) 참조변수 c 생성
2) new -> 객체 생성
3) 생성자 -> 객체 초기화
4) 참조변수 c에 객체 주소값 대입
*/
ch 6-36~37 생성자 this(), 참조변수 this
1. 생성자 this()
같은 클래스 내 생성자에서 다른 생성자 호출할 때 사용
다른 생성자 호출 시 첫 줄에서만 가능
코드 중복을 제거하기 위해 서로 호출하는 경우 많음 this로 간결하게 사용할 수 있음
2. 참조변수 this
인스턴스 자신을 가리키는 참조변수
인스턴스 메서드에서 사용가능(생성자 포함)
지역변수 lv와 인스턴스 변수 iv를 구별할 때 사용
Car(String color, String type) {
this.color = color;
this.type = type;
// this.-는 iv 인스턴스 변수
// color, type은 lv 지역변수
// color = color 이름이 같으면 서로 구별이 불가 this사용하여 구분
}
3. 참조변수 this와 생성자 this()
this | this() |
인스턴스 자신을 가리키는 참조변수 인스턴스 주소 저장 선언 없이도 사용 가능(인스턴스 메서드에 지역변수로 숨겨진채 존재) 인스턴스 메서드에서 사용가능 (클래스 메서드 static은 인스턴스 변수 iv 사용불가!! this도 불가) |
생성자 같은 클래스의 다른 생성자 호출 시 클래스 이름 대신 사용 |
ch 6-38~41 변수의 초기화, 멤버변수의 초기화
1. 변수 초기화
지역변수 lv는 수동 초기화 필요
멤버변수 iv, cv는 자동초기화
class Init{
// 멤버변수(인스턴스 변수, 클래스 변수)는 자동 초기화
int x;
int y = x;
void method() {
int i;
int j = i; // 에러. 초기화 없이 사용
}
}
자동초기화 기본값
자료형 | 기본값 |
boolean | false |
char | '\u0000' |
byte, short, int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d 또는 0.0 |
참조형 | null |
2. 멤버변수 초기화
1) 명시적 초기화 (=)
// 기본형 변수 초기화
int door = 4;
// 참조형 변수 초기화
Car c = new Car();
2) 초기화 블럭
인스턴스 초기화 블럭 {}
클래스 초기화 블럭 static {}
3) 생성자(iv 초기화)
3. 초기화 시점
클래스 변수 초기화 시점 : 클래스가 메모리에 로딩될 때 단 한번
인스턴스 변수 초기화 시점 : 인스턴스가 생성될 때 마다
클래스 변수 초기화 → 인스턴스 변수 초기화
자동(0) → 간단(=) → 복잡(static {}, 생성자)순으로 진행