인스턴스 멤버와 클래스 멤버

김나영·2023년 6월 14일
0

Java 문법 종합반

목록 보기
14/21

1. 인스턴스 멤버

  • 인스턴스 필드 + 인스턴스 메서드

  • 객체 생성 후 사용 가능

  • 각각의 인스턴스마다 고유하게 값을 가짐

2. 클래스 멤버

  • 클래스 필드 + 클래스 메서드

  • 객체 생성 없이도 사용 가능

  • 메서드 영역의 클래스와 같은 위치에 고정적으로 위치하고 있는 멤버

  • static을 사용하여 선언

  • 주의!!

    • 클래스 멤버로 선언된 메서드는 인스턴스 멤버 사용 불가

    • 인스턴스 멤버로 선언된 메서드는 클래스 멤버 사용 불가

      • why? 클래스 멤버는 객체 생성없이 바로 사용 가능한 반면에 인스턴스 멤버는 객체가 생성되어야 존재할 수 있기 때문

Car 클래스

static String company = "GENESIS"; // 자동차 회사 : GENESIS
String getCompany() {
    return "(주)" + company;
}
  • 자동차 회사 'GENESIS'로 고정

  • getCompany() : 인스턴스 메서드 => 클래스 필드인 company 사용 가능

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

    • 클래스 메서드로 만들어서 사용할 수 있지만 인스턴스 필드인 model을 사용하려고 하면 오류 발생
Car.company = "Audi";
String companyName = Car.setCompany("Benz"); // static이기 때문에 바로 호출
  • 클래스 멤버를 사용하기 위해 클래스의 이름과 함께 도트(.)연산자 사용
Car car = new Car(); // 객체 생성
car.company = "Ferrari"; // static이기 때문에 인스턴스화X
String companyName2 = car.setCompany("Lamborghini");
package week03.staticFolder;
public class Main {
    public static void main(String[] args) {
        // 클래스 필드 company 확인
        System.out.println(Car.company + "\n"); // GENESIS
        // 클래스 필드 변경 및 확인
        Car.company = "Audi";
        System.out.println(Car.company + "\n"); // Audi
        // 클래스 메서드 호출
        String companyName = Car.setCompany("Benz"); // static이기 때문에 바로 호출
        System.out.println("companyName = " + companyName); // Benz
  • "Audi"로 변경 전 Car.company = GENESIS

  • "Audi"로 변경 후 Car.conpany = Audi

  • "Benz"를 호출했으므로 Car.company = Benz

참조형 변수 사용

        Car car = new Car(); // 객체 생성
        car.company = "Ferrari"; // static이기 때문에 인스턴스화X
        System.out.println(car.company + "\n"); // Ferrari
        String companyName2 = car.setCompany("Lamborghini");
        System.out.println("companyName2 = " + companyName2); // Lamborghini
    }
}

3. 지역 변수

  • 메서드 내부에 선언한 변수

  • 메서드가 실행될 때마다 독립적인 값을 저장하고 관리

  • 메서드 내부에서 정의될 때 생성되어 메서드가 종료될 때까지만 유지

package week03.sample;
public class Main {
    public static void main(String[] args) {
        Main main = new Main();
        System.out.println(main.getNumber()); // 2
        System.out.println(main.getNumber()); // 2
    }
    // 기본 생성자
    // public Main() {} -> 생략가능
    // 메서드
    public int getNumber() {
        // 지역변수 <--> 전역변수(static)
        // 해당 메서드가 실행될 때마다 독립적인 값을 저장하고 관리
        // 이 자연변수는 메서드 내부에서 정의될 때 생성됨
        // 이 메서드가 종료될 때 소멸
        int number = 1;
        number += 1; // number = number + 1
        return number;
    }
}

4. final 필드와 상수

1) final 필드

  • 초기값이 저장되면 해당값을 프로그램이 실행하는 도중에는 절대로 수정 불가

  • 반드시 초기값 지정!!

  • 선언

final String company = "GENESIS";
Car car = new Car();
System.out.println(car.company);
  • 필드 타입 앞에 final을 추가하여 필드 선언

  • 만약 car.company = "Benz"; 이렇게 수정하려면 오류 발생

2) 상수

  • 값이 반드시 한 개이며 불변의 값을 의미

  • 인스턴스마다 상수 저장 불필요

static final String COMPANY = "GENESIS";
System.out.println(Car.COMPANY);
  • final 앞에 static 키워드를 추가하여 모든 인스턴스가 공유할 수 있는 값이 한개이며 불변인 상수 선언 가능

  • 수정이 불가능

    • Car.COMPANY = "Benz"; 이렇게 수정하려하면 오류가 발생
  • 일반적으로 상수는 대문자로 작성하는 것이 관례

0개의 댓글