본문 바로가기
프로그래밍/JAVA

초보 자바 프로그래밍(50) - 클래스(Class) 멤버

by 머니테크리더 2023. 5. 11.
반응형

자바 클래스 멤버 대표 이미지
자바 클래스 멤버 대표 이미지

🔖 INDEX

     

     

    필드의 구분

     

    필드 (Field)

    필드는 클래스의 멤버 변수로, 클래스의 객체가 생성될 때마다 해당 객체에 할당되는 변수입니다. 필드는 클래스 블록 안에 선언되며, 객체의 상태를 나타내는 데 사용됩니다. 필드의 값은 객체마다 다르게 할당될 수 있으며, 인스턴스 필드와 클래스 필드로 나뉩니다.

     

    인스턴스 필드는 객체마다 고유한 값을 가지며, 키워드 'new'를 사용하여 생성된 객체에 대해 각각 저장되고 관리됩니다. 인스턴스 필드의 소멸 주기는 해당 객체의 생명 주기와 같습니다. 객체가 가비지 컬렉션(Garbage Collection)에 의해 메모리에서 해제될 때, 인스턴스 필드도 함께 메모리에서 해제됩니다.

     

    클래스 필드는 'static' 키워드를 사용하여 선언되며, 모든 객체가 공유하는 하나의 변수입니다. 클래스 필드는 객체를 생성하지 않아도 사용할 수 있습니다. 클래스 필드는 클래스가 로드되면 메모리에 할당되고, 클래스가 언로드되거나 JVM(Java Virtual Machine)이 종료될 때 메모리에서 해제됩니다.

     

    • 선언 위치: 클래스 블록 내부
    • 생성 시기: 인스턴스 필드는 객체 생성 시, 클래스 필드는 클래스 로드 시
    • 소멸 시기: 인스턴스 필드는 객체 소멸 시, 클래스 필드는 클래스 언로드 시
    • 저장되는 메모리 공간: 인스턴스 필드는 힙(Heap) 영역, 클래스 필드는 메서드 영역
    • 사용 방법: 인스턴스 필드는 객체 생성 후 참조변수로 접근, 클래스 필드는 클래스명으로 접근
    public class Car {
        String brand; // 인스턴스 필드
        static int totalCars; // 클래스 필드
    
        Car(String brand) {
            this.brand = brand;
            totalCars++;
        }
    }

     

    지역 변수 (Local Variable)

    지역 변수는 메서드 또는 블록 내에서 선언되는 변수로, 해당 메서드 또는 블록이 실행되는 동안만 사용됩니다. 메서드가 호출될 때마다 메모리에 할당되고, 메서드 실행이 완료되면 메모리에서 해제됩니다. 지역 변수는 메서드 내에서만 접근이 가능하며, 메서드 외부에서는 접근할 수 없습니다.

    • 선언 위치: 메서드 또는 블록 내부
    • 생성 시기: 메서드 호출 시
    • 소멸 시기: 메서드 종료 시
    • 저장되는 메모리 공간: 스택(Stack) 영역
    • 사용 방법: 메서드 또는 블록 내에서 사용
    public class Calculator {
        int add(int a, int b) { // a, b는 지역 변수
            int result = a + b; // result는 지역 변수
            return result;
        }
    }

     

    필드와 지역 변수의 차이점 정리

    필드와 지역 변수의 차이점을 세분화해서 설명하면 다음과 같습니다.

    • 선언 위치: 필드는 클래스 내부에, 지역 변수는 메서드 또는 블록 내부에 선언됩니다.
    • 생성 시기: 인스턴스 필드는 객체 생성 시, 클래스 필드는 클래스 로드 시, 지역 변수는 메서드 호출 시 생성됩니다.
    • 소멸 시기: 인스턴스 필드는 객체 소멸 시, 클래스 필드는 클래스 언로드 시, 지역 변수는 메서드 종료 시 소멸됩니다.
    • 저장되는 메모리 공간: 인스턴스 필드는 힙 영역, 클래스 필드는 메서드 영역, 지역 변수는 스택 영역에 저장됩니다.
    • 사용 방법: 인스턴스 필드는 객체 생성 후 참조 변수로 접근, 클래스 필드는 클래스명으로 접근, 지역 변수는 메서드 또는 블록 내에서 사용합니다.

     

     

    메서드의 구분

     

    인스턴스 메서드 (Instance Method)

    인스턴스 메서드는 객체의 인스턴스에 속하는 메서드로, 객체가 생성된 후에만 호출할 수 있습니다. 인스턴스 메서드는 클래스 안에 선언되지만 'static' 키워드가 붙지 않은 메서드입니다.

    • 선언 위치: 클래스 블록 내부
    • 생성 시기: 객체 생성 시
    • 소멸 시기: 객체 소멸 시
    • 사용 방법: 객체 생성 후 참조 변수로 접근하여 호출
    public class Person {
        String name;
    
        void introduce() { // 인스턴스 메서드
            System.out.println("제 이름은 " + name + "입니다.");
        }
    }

     

    클래스 메서드 (Class Method)

    클래스 메서드는 'static' 키워드를 사용하여 선언되며, 모든 객체가 공유하는 메서드입니다. 클래스 메서드는 객체를 생성하지 않아도 사용할 수 있으며, 클래스가 로드되는 시점에 메모리에 할당됩니다.

    • 선언 위치: 클래스 블록 내부
    • 생성 시기: 클래스 로드 시
    • 소멸 시기: 클래스 언로드 시
    • 사용 방법: 클래스명으로 접근하여 호출
    public class MathUtil {
        static double getSquare(double num) { // 클래스 메서드
            return num * num;
        }
    }

     

    인스턴스 메서드와 클래스 메서드의 차이점 정리

    • 선언 위치: 둘 다 클래스 내부에 선언되지만, 인스턴스 메서드는 'static' 키워드가 없고, 클래스 메서드는 'static' 키워드가 있습니다.
    • 생성 시기: 인스턴스 메서드는 객체 생성 시, 클래스 메서드는 클래스 로드 시 생성됩니다.
    • 소멸 시기: 인스턴스 메서드는 객체 소멸 시, 클래스 메서드는 클래스 언로드 시 소멸됩니다.
    • 사용 방법: 인스턴스 메서드는 객체 생성 후 참조 변수로 접근하여 호출하며, 클래스 메서드는 클래스명으로 접근하여 호출합니다.

     

     

    필드의 초기화

    필드의 초기화는 클래스의 인스턴스가 생성될 때 필드에 값을 할당하는 과정입니다. 필드의 초기화 방법은 다음과 같이 여러 가지가 있습니다.

     

    기본값 초기화

    모든 필드는 생성되면 기본값으로 초기화됩니다. 기본값은 자료형에 따라 다르며, 아래와 같습니다.

    • 정수형(byte, short, int, long) : 0
    • 실수형(float, double) : 0.0
    • 문자형(char) : '\u0000'
    • 논리형(boolean) : false
    • 참조형(객체) : null
    public class DefaultValueExample {
        int intValue;
        double doubleValue;
        boolean booleanValue;
        String stringValue;
    }

     

    선언 시 명시적 초기화

    필드 선언 시 값을 직접 할당할 수 있습니다. 이를 명시적 초기화라고 합니다.

    public class ExplicitInitializationExample {
        int intValue = 10;
        double doubleValue = 3.14;
        boolean booleanValue = true;
        String stringValue = "Hello";
    }

     

    생성자를 통한 초기화

    생성자는 객체 생성 시 호출되는 특별한 메소드로, 필드 초기화에 주로 사용됩니다. 생성자를 통해 값을 전달받아 필드를 초기화할 수 있습니다.

    public class ConstructorInitializationExample {
        int intValue;
        double doubleValue;
        boolean booleanValue;
        String stringValue;
    
        public ConstructorInitializationExample(int intValue, double doubleValue, boolean booleanValue, String stringValue) {
            this.intValue = intValue;
            this.doubleValue = doubleValue;
            this.booleanValue = booleanValue;
            this.stringValue = stringValue;
        }
    }

     

    초기화 블록을 이용한 초기화

    초기화 블록은 인스턴스 초기화 블록과 클래스 초기화 블록이 있습니다.

    • 인스턴스 초기화 블록: 객체 생성 시 실행되며, 중괄호({})로 묶인 코드 블록입니다. 생성자보다 먼저 실행되며, 여러 생성자에서 공통으로 사용되는 초기화 코드를 작성할 수 있습니다.
    public class InstanceInitializationExample {
        int intValue;
        double doubleValue;
    
        {
            intValue = 10;
            doubleValue = 3.14;
        }
    
        public InstanceInitializationExample() {
        }
    
        public InstanceInitializationExample(int intValue) {
            this.intValue = intValue;
        }
    }

     

    • 클래스 초기화 블록: 클래스가 로드될 때 실행되며, 'static' 키워드와 중괄호({})로 묶인 코드 블록입니다. 클래스 필드를 초기화하는 데 사용됩니다.
    public class StaticInitializationExample {
        static int intValue;
        static double doubleValue;
    
        static {
            intValue = 10;
            doubleValue = 3.14;
        }
    }

     

     

    댓글