ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 Study 인스턴스 멤버, 정적 멤버 Part 14 ~ 17
    JAVA/개념 2022. 10. 6. 14:32
    반응형

    인스턴스 멤버란 무엇일까?🤔

    인스턴스 멤버와 정적 멤버의 차이는 무엇일까?🤷‍♀️

     

    14. 인스턴스 멤버와 정적멤버

    자바는 static 키워드를 통해 클래스의 필드를 공유할 수 있도록 지원하는데 이를 클래스 변수 혹은 정적변수라고 한다.

    반대로 static 키워드로 지정하지 않은 멤버 변수는 공유되지 않고 인스턴스마다 자신의 필드 생성하는데 이를 인스턴스 변수라고한다.

     

    객체를 생성할 때 인스턴스 변수도 생성되기에 객체를 생성한 후에야 접근가능하고 객체가 소멸시 자동으로 소멸하므로 여러 개의 객체를 생성한다면 인스턴스 변수도 그에 따라서 여러개가 된다.

     

    정적 변수  클래스 변수 객체 생성전에도 접근 가능하며, 객체를 여러개 생성해도 정적변수(클래스 변수)는 하나뿐이며, 모든 객체가 공유한다.

    🔥주의할 점🔥
    
    1. 객체와 관련된 인스턴스 변수를 사용할 수 없다.
    2. 객체와 관련된 인스턴스 메서드를 호출할 수 없다.
    3. 객체 자신을 가리키는 this 키워드를 사용할 수 없다.

     

     

    15. 정적메소드

    대표적인 예로 main()메소드는 정적 메소드 즉 클래스 메소드이다.

    특징
    1. 정적변수와 지역 변수를 사용할 수 있다.
    2. 또 다른 정적 메서드를 호출할 수 있으며, 생성자도 호출 가능
    🔥주의할 점🔥
    
    1. 객체와 관련된 인스턴스 변수나 인스턴스 메서드 호출할 때는 반드시 객체를 생성 후 사용해야 한다.

     

     

    16. 정적 멤버의 활용

    객체 생선전에 사용할 수 있기에 보통 클래스 이름과 연결해서 사용한다.

    객체 생성 후 객체 이름과 연결할 수 있지만 바람직하지 않다.

     

    정적변수의 대표적인 예 : 상수

    상수는 값이 변경되지 않으므로 final로만 지정하면 객체마다 기억 공간을 할당해야 하기 때문에 static final로 지정해서 선언한다.

    상수 선언 예시
    
    static final 데이터형 상수 = 초깃값
    
    static : 모든 객체 공유
    final : 초깃값이 대입되면 더 이상 수정불가
    class Circle{
        double radius;                     // 인스턴스(멤버) 변수
        static int numOfCircles = 0;       // 클래스(정적) 변수
        int numCircles = 0;                // 인스턴스(멤버) 변수
    
        public Circle(double radius){      // 생성자
            this.radius = radius;
            numOfCircles++;                // 객체를 생성할 때마다 하나씩 증가
            numCircles++;                  // 객체마다 별도의 기억 공간을 사용하기에 항상 0에서 증가.
        }
    }
    
    
    public class CircleDemo {
    	public static void main(String[] args) {
    		System.out.println("인스턴스 생성 전 원의 개수 : " + Circle.numOfCircles);
    		Circle myCircle = new Circle(10.0);
    		System.out.println("인스턴스 생성 후 원의 개수 : " + Circle.numOfCircles);
    		Circle yourCircle = new Circle(5.0);
    
    		// print(); // main()메서드는 정적 메서드이므로 인스턴스 메서드를 호출할 수 없다.
    		System.out.println("원의 개수 : " + Circle.numOfCircles); // 정적변수 사용
    		System.out.println("원의 개수 : " + yourCircle.numCircles);
    	}
    
    	void print() {
    		System.out.println("인스턴스 메서드 입니다.");
    	}
    }

    new 연산자를 통할 때 마다 인스턴스 변수는 새로 생성되기 때문에 값이 1이고,

    정적 변수는 새로 생성되지 않기 때문에 값이 2가 된다.

    class Util {
    	static int fourTimes(int i) {             // 정적 메서드
    		return i * 4;
    	}
    }
    
    public class UtilDemo {
    	public static void main(String[] args) {
    		System.out.println(Util.fourTimes(5));
    	}
    }

    객체를 굳이 생성하지 않아도 답을 구할 수 있기에 선언하지 않은 유형이다.

     

    17. 정적 블록

    인스턴스 변수라면 생성자를 사용할 수 있지만, 정적 변수의 초기화가 복잡할 때 사용하는 방식이다.

    정적 블록 또한 객체 생성 전에 실행되므로 정적 메서드처럼 유의해서 사용해야 한다.

    public class FunctionDemo {
    	static int forMunEx;
    
    	static {
    		int sum = 0;
    		for (int i = 1; i <= 10; i++)
    			sum += i;
    		forMunEx = sum;
    	}
    
    	public static void main(String[] args) {
    		System.out.println(forMunEx);
    	}
    }

     

     

    여러분들의 도움이 되었으면 하는 바램과 함께 다음장에 계에에속

    반응형

    댓글

Designed by Tistory.