인스턴스 맴버와 클래스 맴버

개발공부기록하기·2024년 4월 24일

java

목록 보기
5/16
post-thumbnail

맴버란?
필드 + 메서드으로 이루어진 관계이다.
맴버에는 인스턴스 맴버, 클래스 맴버가 있는데.

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

으로 구성이 되어있다.

필드와 메서드의 선언하는 방법에 따라서 인스턴스 맴버, 클래스 맴버로 구분할수 있다.
각 특징은 인스턴스 맴버는 객체 생성 후에 사용 할수 있고 클래스 맴버는 객체 생성 없이 사용 할수 있다.

그러면 이렇게 구분짓는 이유는 뭘까..?
인스턴스 맴버는 각 인스턴스 마다 고유한 값을 가질수 있는데 고유값이 동일한 상태에서 여러 인스턴스가 생성이 되면 효율이 떨어지기 때문에 클래스 맴버를 통해 고정적으로 사용하도록 한다.

클래스 맴버를 만들기 위해서는 static 키워드를 사용하면 되는데.공용적인 데이터를 저장하는 필드는 클래스 멤버로 선언하는 것이 좋다, 또한 인스턴스 필드를 사용하지 않고 실행 되는 메서드가 존재 한다면 static 키워드를 사용하여 클래스 메서드로 선언 하는것이 좋다.

클래스 맴버 사용시 주의 사항

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

예제

 car.java
 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() {} // 기본 생성자


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

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

-----------------------------------------------------------------------------------
main.java

public class Main {
public static void main(String[] args) {
    // 클래스 필드 company 확인
    System.out.println(Car.company + "\n"); //car class에 초기값 GENESIS로 설정 되어 있어 GENESIS출력
    // 클래스 필드 변경 및 확인
    Car.company = "Audi"; //Audi로 변경
    System.out.println(Car.company + "\n"); //Audi로 출력 

    // 클래스 메서드 호출
    String companyName = Car.setCompany("Benz"); //매개 변수 Benz 로 받고 car class 내에 company를  Benz로 저장 후 companyName에 Benz로 저장
    System.out.println("companyName = " + companyName);

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

    car.company = "Ferrari"; //생성한 객체에 company값을 Ferrari로 저장
    System.out.println(car.company + "\n");

    String companyName2 = car.setCompany("Lamborghini"); //생성한 객체에 company값을 Lamborghini 저장
    System.out.println("companyName2 = " + companyName2);
    }
}

지역변수
메서드 내에 선언한 변수를 의미하고 메서드가 실행될 때마다 독립적은 값을 저장하고 관리를 한다. 또한 메서드가 정의 될때 생성이되고 종료될때 까지만 유지가 된다.(램이랑 비슷)

final 필드와 상수
final 필드 : 초기값이 저장되면 해당값을 프로그램이 실행하는 도중에는 절대로 수정할 수 없습니다.또한 final 필드는 반드시 초기값을 지정해야 합니다.

상수 : 값이 반드시 한 개이며 불변의 값을 의미합니다.따라서 인스턴스마다 상수를 저장할 필요가 없다

0개의 댓글