JAVA

[JAVA] 인스턴스 멤버와 클래스 멤버

개발 공주 2023. 5. 31. 17:37
728x90

📌 멤버 = 필드 + 메서드

  • 인스턴스 멤버 = 인스턴스 필드 + 인스턴스 메서드
  • 클래스 멤버 = 클래스 필드 + 클래스 메서드

📌 인스턴스 멤버 & 클래스 멤버

  • 필드와 메서드는 선언하는 방법에 따라서 인스턴스 멤버와 클래스 멤버로 구분할 수 있습니다.
  • 인스턴스 멤버는 객체 생성 후에 사용할 수 있고 클래스 멤버는 객체 생성 없이도 사용할 수 있습니다.

1. 인스턴스 멤버

📌객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드를 의미

  • 또한 객체의 인스턴스 필드는 각각의 인스턴스 마다 고유하게 값을 가질 수 있습니다.
  • 메서드는 메서드 영역에 두고서 모든 인스턴스들이 공유해서 사용된다.
  • 대신 무조건 객체를 생성 즉, 인스턴스를 통해서만 메서드가 사용될 수 있도록 제한을 걸어두었다. (메서드)

2. 클래스 멤버

📌 클래스는 Java의 클래스 로더에 의해 메서드 영역에 저장되고 사용됩니다.

  • 이때 클래스 멤버란 메서드 영역의 클래스와 같은 위치에 고정적으로 위치하고 있는 멤버를 의미한다.
  • 따라서 클래스 멤버는 객체의 생성 필요없이 바로 사용이 가능하다.

클래스 멤버 선언

  • 필드와 메서드를 클래스 멤버로 만들기 위해서는 static 키워드를 사용하면 된다.
    • 일반적으로 인스턴스마다 모두 가지고 있을 필요없는 공용적인 데이터를 저장하는 필드를 클래스 멤버로 선언하는것이 좋다
    • 또한 인스턴스 필드를 사용하지 않고 실행되는 메서드가 존재한다면 static키워드를 사용하여 클래스 메서드로 선언하는 것이 좋다

⚠️ 주의사항

  • 클래스 멤버로 선언된 메서드는 인스턴스 멤버를 사용할 수 없습니다.
  • 반대로 인스턴스 멤버로 선언된 메서드는 클래스 멤버를 사용할 수 있습니다.
  • 클래스 멤버는 객체 생성없이 바로 사용 가능하기 때문에 객체가 생성되어야 존재할 수 있는 인스턴스 멤버를 사용할 수 없습니다.

클래스 멤버 사용

  • 클래스 멤버를 사용하려면 클래스의 이름과 함께 도트(.) 연산자를 사용하면 됩니다.
  • 참조형 변수를 사용하여 클래스 멤버에 접근은 가능하지만 추천하지 않습니다.
    • 클래스 이름으로 접근하는 것이 좋습니다.

예제)

자동차 클래스

public class Car {

    static String company = "GENESIS"; // 자동차 회사 : GENESIS
    String model; // 자동차 모델
    String color; // 자동차 색상
    double price; // 자동차 가격

    double speed;  // 자동차 속도 , km/h
    char gear; // 기어의 상태, P,R,N,D
    boolean lights; // 자동차 조명의 상태


    public Car() {} // 기본 생성자

    double gasPedal(double kmh, char type) {
        changeGear(type);
        speed = kmh;
        return speed;
    }

    double brakePedal() {
        speed = 0;
        return speed;
    }

    char changeGear(char type) {
        gear = type;
        return gear;
    }

    boolean onOffLights() {
        lights = !lights;
        return lights;
    }

    void horn() {
        System.out.println("빵빵");
    }

    String getCompany() {
        return "(주)" + company;
    }

    static String setCompany(String companyName) {
        // System.out.println("자동차 모델 확인: " + model); // 인스턴스 필드 사용 불가
        company = companyName;
        return company;
    }
}

Main 클래스

public class Main {
    public static void main(String[] args) {
        // 클래스 필드 company 확인
        System.out.println(Car.company + "\n");
        // 클래스 필드 변경 및 확인
        Car.company = "Audi";
        System.out.println(Car.company + "\n");

        // 클래스 메서드 호출
        String companyName = Car.setCompany("Benz");
        System.out.println("companyName = " + companyName);

        System.out.println();
        // 참조형 변수 사용
        Car car = new Car(); // 객체 생성

        car.company = "Ferrari";
        System.out.println(car.company + "\n");

        String companyName2 = car.setCompany("Lamborghini");
        System.out.println("companyName2 = " + companyName2);
    }
}

'JAVA' 카테고리의 다른 글

[JAVA] 생성자  (0) 2023.05.31
[JAVA] 지역변수 및 상수  (0) 2023.05.31
[JAVA] 객체의 속성(필드),행위(메서드)  (1) 2023.05.30
[JAVA] 객체 생성과 참조형 변수  (0) 2023.05.29
[JAVA] 클래스 설계  (0) 2023.05.29