본문 바로가기
개발 수업/JAVA

[Java] 클래스/인스턴스 멤버와 정적 멤버

by 오늘 하루s 2023. 5. 15.
728x90
더보기

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

 

728x90