① static메서드와 인스턴스 메서드
- 인스턴스 메서드
→ 인스턴스 생성 후, '참조변수.메서드이름()'으로 호출
→ 인스턴스 멤버와 관련된 작업을 하는 메서드
→ 메서드 내에서 인스턴스 변수 사용 가능
- static 메서드(클래스 메서드)
→ 객체생성없이 '클래스이름.메서드이름()'으로 호출
→ 인스턴스 멤버와 관련없는 작업을 하는 메서드
→ 메서드 내에서 인스턴스 변수 사용 불가
class MyMath2{
long a, b //인스턴스 변수
long add() { //인스턴스 메서드
return a+b; //인스턴스 변수
}
static long add(long a, long b) { //static 메서드
return a+b; //지역변수
}
}
class MyMath2{
public static void main(String args[]) {
System.out.println(MyMath2.add(200L, 100L); //static 메서드는 객체 생성없이 호출 가능.
MyMath2 mm=new MyMath2(); //객체 생성
mm.a=200L;
mm.b=100L; //인스턴스 변수
System.out.println(mm.add()); //인스턴스 메서드 호출
}
}
결과
300
300
② 메서드 간의 호출과 참조
- static 메서드가 static 메서드 호출 가능한가 ? 네.
- static 메서드가 인스턴스 변수 사용 가능한가 ? 아니요.
- static 메서드가 인스턴스 메서드 호출 가능한가? 아니요.
- 왜 static 메서드는 인스턴스 멤버를 사용할 수 없나? static 메서드 호출 시 객체가 없을 수도 있어서.
③ 메서드 오버로딩
: 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 오버로딩이라 한다.
- 오버로딩의 성립 조건
→ 메서드 이름이 같아야 한다.
→ 매개변수의 개수 또는 타입이 달라야 한다.
→ 반환타입은 관계없다.
// 중복 정의, 오버로딩 X
int add(int a, int b) {return a+b;}
int add(int x, int y) {return x+y;}
// 중복 정의, 오버로딩 X
int add(int a, int b) {return a+b;}
long add(int a, int b) {return (long)(a+b);}
// 오버로딩 O
long add(int a, long b) {return a+b;}
long add(long a, int b) {return a+b;}
④ 생성자
: 생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다. (인스턴스 변수 초기화 작업에 주로 사용된다.)
- 생성자의 조건
→ 생성자의 이름은 클래스의 이름과 같아야 한다.
→ 생성자는 리턴 값이 없다.
Timte t= new Time(); //기본 생성자
t.hour = 12;
t.minute = 34;
t.second = 45; //인스턴스 변수 초기화
Time t= new Time(12, 34, 45); //생성자 호출
⑤ 기본 생성자
: 매개변수가 없는 생성자
클래스이름() {} //기본 생성자
Time() {} //Time클래스의 기본 생성자
class Data_1 {
int value; //컴파일러가 자동으로 생성자를 넣어줌
}
class Data_2 {
int value; //Data_2() {} 기본 생성자를 추가해야 함.
Data_2(int x) {
value = x;
}
}
class Ex6_11 {
public static void main(String[] args) {
Data_1 d1 = new Data_1();
Data_2 d2 = new Data_2(); //compie error 발생
}
}
→ 기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이라서
class Data_2에 기본 생성자를 추가해야 함.
⑥ 매개변수가 있는 생성자
: 생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있다.
(인스턴스마다 각기 다른 값으로 초기화되어야 하는 경우가 많기 떄문에 매개변수를 사용한 초기화를 사용한다.)
class Car{
String color;
String gearType;
int door;
Car() {} //기본 생성자
Car(String c, String g, int d) { //매개변수가 있는 생성자
color = c;
gearType = g;
door = d;
}
}
class Ex6_12 {
public static void main(String[] args) {
Car c1 = new Car();
c1.color = "white";
c1.gearType = "auto";
c1.door = 4; //객체 생성하고 인스턴스 변수의 값을 변경하는 방법
Car c2= new Car("white", "auto", 4); //매개변수를 갖는 생성자로 값을 변경하는 방법
System.out.println("c1의 color=" + c1.color+ ", gearType=" +c1.gearType+ ", door="+c1.door);
System.out.println("c2의 color=" + c2.color+ ", gearType=" +c2.gearType+ ", door="+c2.door);
}
}
결과
c1의 color=white, gearType=auto, door=4
c2의 color=white, gearType=auto, door=4
⑦ 생성자에서 다른 생성자 호출하기 → this()
- 생성자 호출 조건
→ 생성자의 이름으로 클래스이름 대신 this를 사용한다.
→ 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출 가능하다.
class Car2 {
String color;
String gearType;
int door;
Car2() {
this("white", "auto", 4);
}
Car2(String color) {
this(color, "auto", 4);
}
Car2(String color, String gearType, int door) {
this.color = color;
this.geartype = gearType;
this.door = door;
}
}
class Ex6_13 {
public static void main(String args[]) {
Car2 c1=new Car2();
Car2 c2=new Car2("blue");
System.out.println("c1의 color="+c1.color+", gearType="+c1.gearType+", door="+c1.door);
System.out.println("c2의 color="+c2.color+", gearType="+c2.gearType+", door="+c2.door);
}
}
결과
c1의 color=white, gearType=auto, door=4
c2의 color=blue, gearType=auto, door=4
⑧ 객체 자신을 가리키는 참조변수 → this
: 생성자의 매개변수로 선언된 변수의 이름과 인스턴스 변수의 이름이 같을 경우 구별이 안 된다.
이런 경우에는 인스턴스 변수 앞에 'this'를 사용하면 된다.
class MyMath2{
long a,b; //인스턴스 변수
MyMath2(int a, int b) { //생성자 → this 사용 가능
this.a=a;
this.b=b; //지역변수와, 인스턴스 변수를 구별하려고 this 사용
}
long add(){ //인스턴스 메서드 → this 사용 가능
return a+b;
}
static long add(long a, long b) { //클래스 메서드 → this 사용 불가능
return a+b;
}
}
⑨ 변수의 초기화
- 멤버변수(클래스 변수와 인스턴스 변수)와 배열의 초기화는 선택이지만, 지역변수 초기화는 필수이다.
- 멤버변수의 초기화
클래스 변수 초기화 → 인스턴스 변수 초기화
자동 초기화 → 명시적 초기화(간단) → 초기화 블럭, 생성자(복잡)
'프로그래밍 > Java' 카테고리의 다른 글
Java_객체지향언어(5)_참조변수 super, 생성자 super(), 제어자와 접근제어자 (0) | 2022.11.09 |
---|---|
Java_객체지향언어(4)_상속, 포함관계, 오버라이딩 (0) | 2022.11.07 |
Java_객체지향언어(2)_인스턴스변수, 클래스변수, 지역변수, 메서드 사용법, 기본형 매개변수와 참조형 매개변수의 차이 (0) | 2022.10.23 |
Java_객체지향언어(1)_클래스와 객체_객체 생성과 사용 방법 (0) | 2022.10.21 |
Java_배열(2) (0) | 2022.10.10 |