Day12-1. 230515
인스턴스 멤버와 정적 멤버
인스턴스 멤버와 this
인스턴스 멤버란?
객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드. -> 인스턴스 필드, 인스턴스 메소드.
=> 객체에 소속되어 있기 때문에 객체 없이는 사용할 수 없음.
- 객체마다 가지고 있는 멤버
인스턴스 멤버 선언
public class Car{
//필드
int gas;
//메소드
void setSpeed(int speed){....}
}
gas 필드와 setSpeed() 메소드는 인스턴스 멤버이기 때문에 외부 클래스를 사용하기 위해서 Car객체(인스턴스)를 생성하고 참조 변수(ex. myCar 또는 yourCar)로 접근해야한다.
Car myCar = new Car();
myCar.gas = 10;
myCar.setSpeed(60);
this
객체 외부에서 인스턴스 멤버에 접근하기 위해 참조 변수를 사용하는 것과 마찬가지로
객체 내부에서 인스턴스 멤버에 접근하기 위해 this 사용.
Car(String model){
this.model = model;
}
void setModel(String model){
this.model = model;
}
정적 멤버와 static
정적 멤버란?
클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드. -> 정적 필드, 정적 메소드
정적 멤버 선언
- 필드와 메소드 선언시 static 키워드 추가
정적 필드와 정적 메소드는 클래스에 고정된 멤버이므로
클래스 로더가 클래스(바이트 코드)를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리됨.
-> 클래스의 로딩이 끝나면 바로 사용할 수 있음.
- 객체마다 가지고 있어야 할 데이터 -> 인스턴스 필드로 선언. ex) color
- 객체마다 가지고 있을 필요가 없는 공용 데이터 -> 정적 필드로 선언. ex) Caculator
- 인스턴스 필드를 포함하고 있다. -> 인스턴스 메소드
- 인스턴스 필드를 포함하고 있지 않다. -> 정적 메소드
정적 멤버 사용
클래스.필드;
클래스.메소드(매개값,...);
정적 메소드 선언 시 주의할 점
- 정적 메소드를 선언할 때 이들 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없음
-> 객체가 없어도 실행되기 때문에
- 정적 메소드에서 인스턴스 멤버를 사용하려면 객체를 먼저 생성하고 참조 변수로 접근해야 함.
Car04클래스>
1
2
3
4
5
6
7
8
9
10
|
public class Car04 {
//필드
String color;
static int maxSpeed=300;
//메서드
static void powerOnOff() {
System.out.println("powerOnOff()");
}
}
|
cs |
Car04Main 클래스>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class Car04Main {
public static void main(String[] args) {
//Car04의 인스턴스멤버(필드,메서드) 사용
Car04 mycar = new Car04();
mycar.color = "red";
System.out.println(mycar.color);
mycar.powerOnOff(); //객체 참조 변수로 접근
System.out.println(Car04.maxSpeed);
Car04.powerOnOff();
System.out.println("-----------------");
Car04 mycar2 = new Car04();
mycar2.color = "black";
System.out.println(mycar2.color);
mycar2.powerOnOff();
}
}
|
cs |
- 7줄 객체 참조 변수로 접근
정적 필드와 메소드는 원칙적으로는 클래스 이름으로 접근해야 하지만 객체 참조 변수로도 접근 가능
/하지만 정적 요소로 접근하는 것이 좋음
정적 메소드 선언 시 주의할 점
- 정적 메소드를 선언할 때 이들 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없음
-> 객체가 없어도 실행되기 때문에
- 정적 메소드에서 인스턴스 멤버를 사용하려면 객체를 먼저 생성하고 참조 변수로 접근해야 함.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
public class Static_p277 {
//필드
String f1="인스턴스필드"; //인스턴스필드 - static 안붙으면, 전역변수
static String f2 = "정적필드"; //정적필드(static필드) , 전역변수
void m1() {
this.f1="m1() 메서드에서 접근";
this.f2="m2()메서드에서 접근";
m2();
}
static void m2() {
System.out.println("static 메서드 접근 집입");
//this.f1="m2() 메서드에서 접근";//에러발생
f2="m2()메서드에서 접근";
//m1(); //에러발생
}
public static void main(String[] arg) {
//f1="메인메서드에서 값설정"; //f1필드 접근 불가(인스턴스 필드)
f2="메인메서드에서 값설정"; //f2필드 접근 가능(정적 필드)
//m1();// m1호출 불가(인스턴스 매서드)
m2(); //m2호출 가능(정적 메서드)
//인스턴스 필드와 메서드는 객체참조변수의 주소를 통해 접근가능.
Static_p277 refVal = new Static_p277();
refVal.f1="메인메서드에서 값설정";
refVal.m1();
}
}
|
cs |
'개발 수업 > JAVA' 카테고리의 다른 글
[Java] 상속(inheritance)/클래스 상속 (0) | 2023.05.16 |
---|---|
[Java] 패키지(import문),java.util 패키지(Date 클래스,Calendar 클래스) (0) | 2023.05.15 |
[Java] 클래스/메소드(메소드 오버로딩(overloading)) (0) | 2023.05.12 |
[Java] 클래스/메소드(리턴(return)문) (0) | 2023.05.12 |
[Java] 클래스/Getter와 Setter 메소드 (0) | 2023.05.12 |