[Java의 정석]Chapter6.객체지향 프로그래밍(26~29)

Hello_Wendy·2022년 4월 19일
0

자바의 정석

목록 보기
43/61
post-thumbnail

26. static 메서드와 인스턴스 메서드

  • 변수에서 그랬던 것과 같이, 메서드 앞에 static이 붙어 있으면 클래스 메서드 이고, 붙어 있지 않으면 인스턴스 메서드
  • 클래스 메서드 : 클래스변수처럼 객체를 생성하지 않고도 '클래스이름.메서드이름(매개변수)'와 같은 식으로 호출이 가능
  • 인스턴스 메서드 : 반드시 객체를 생성해야만 호출 가능

🍅 어떤 경우에 static사용하여 클래스 메서드로 정의해야 할까?

  • 클래스 : 데이터(변수)와 데이터에 관련된 메서드의 집합이므로, 같은 클래스 내에 있는 메서드와 멤버변수는 아주 밀접한 관계가 있음

  • 인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의의 작업을 수행하는데 인스턴스 변수로 필요로 하는 메서드임. 그런데 인스턴스 변수는 인스턴스(객체)를 생성해야만 만들어지므로 인스턴스 메서드 역시 인스턴스를 생성해야만 호출 가능

  • 반면에 메서드 중에서 인스턴스와 관계없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드를 클래스 메서드(static 메서드)로 정의

  • 물론 인스턴스 변수를 사용하지 않는다고 해서 반드시 클래스 메서드로 정의해야하는 것은 아니지만 특별한 이유가 없는 한 그것이 일반적

▶ 클래스 영역에 선언된 변수를 멤버변수
▶ 멤버변수 중에 static이 붙은 것은 클래스변수(static변수). static이 붙지 않은 것은 인스턴스변수
▶ 멤버변수는 인스턴스변수와 static변수를 모두 통칭하는 말

27. static 메서드와 인스턴스 메서드 예제



▶인스턴스메서든 add(), subtract(), multiply(), divide()는 인스턴스변수인 a와 b만으로도 충분히 작업 가능하기에, 매개변수를 필요로 하지 않으므로 괄호()에 매개변수를 선언하지 않음
▶반면에 add(long a, long b), subtract(long a, long b) 등은 인스턴스변수 없이 매개변수만으로 작업을 수행하기 때문에 static을 붙여서 클래스 메서드로 선언
▶Ex6_9의 main메서드에서 보면, 클래스메서드는 객체생성없이 바로 호출가능하고, 인스턴스 메서드는 MyMath2클래스의 인스턴스를 생성한 후에 호출 가능

28. static을 언제 붙여야 할까?

🔴 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙임

▶ 생성된 각 인스턴스는 서로 독립적
▶ 때문에 각 인스턴스의 변수(iv)는 서로 다른 값을 유지함
▶ 모든 인스턴스에서 같은 값이 유지되어야 하는 변수는 static을 붙여서 클래스 변수로 정의해야 함

🟠 클래스변수(static변수)는 인스턴스를 생성하지 않아도 사용 가능

static이 붙은 변수(클래스변수)는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문

🟡  클래스 메서드(static메서드)는 인스턴스 변수를 사용불가

▶ 인스턴스변수는 인스턴스가 반드시 존재해야만 사용 가능한데, 클래스 메서드(static이 붙은 메서드)는 인스턴스 생성 없이 호출가능하므로 클래스 메서드가 호출되었을 때 인스턴스가 존재하지 않을 수도 있음
▶ 그래서 클래스 메서드에서 인스턴스변수의 사용을 금지
▶ 반면, 인스턴스 변수나 인스턴스 메서드에서는 static이 붙은 멤버들을 사용하는 것이 언제나 가능
인스턴스 변수가 존재한다는 것은 static변수가 이미 메모리에 존재한다는 것을 의미

🟢 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려

▶ 메서드의 작업내용 중에서 인스턴스변수를 필요로 한다면, static을 붙일 수 없음
▶ 반대로 인스턴스 변수를 필요로 하지 않는다면 static을 붙임
메서드 호출시간이 짧아지므로 성능이 향상됨
▶ static을 안 붙인 메서드(인스턴스 메서드)는 실행 시 호출되어야할 메서드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸림

  • 클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야하는 지 확인 후, static을 붙여줌
  • 작성한 메서드 중에서 인스터스 변수나 인스턴스 메서드를 사용하지 않는 메서드에 static을 붙일 것을 고려

29. 메서드 간의 호출과 참조

  • 같은 클래스에 속한 멤버들 간에는 별도의 인스턴스를 생성하지 않고도 서로 참조 또는 호출이 가능
  • 단, 클래스멤버가 인스턴스 멤버를 참조 또는 호출하고자 하는 경우에 인스턴스 생성 필요
  • 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만, 클래스 멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수도 있기 때문
class TestClass {
	void instanceMethod() {} //인스턴스 메서드
    static void staticMethod() {} //static 메서드
    
    void instanceMethod2() { //인스턴스 메서드
    	 instanceMethod();	//다른 인스턴스 메서드를 호출
         staticMethod(); 	//static 메서드를 호출
    }
    
    static void staticMethod2() { //static 메서드
    			instanceMethod(); //에러!!인스턴스 메서드 호출 불가능
                staticMethod();   //static 메서드 호출 가능
    }
} //end of class
: 같은 클래스 내의 인스턴스 메서드와 static 메서드 간의 호출에 대해 설명. 
같은 클래스 내의 메서드는 서로 객체의 생성이나 참조변수 없이 직접 호출이 가능하지만 
static 메서드는 인스턴스 메서드를 호출 불가


class TestClass2 {
	int iv; //인스턴스 변수
    static int cv; //클래스 변수
    
    void instanceMethod() { //인스턴스 메서드
    	System.out.println(iv); //인스턴스 변수 사용 가능
        System.out.println(cv); //클래스 변수 사용 가능
        }
        
        static void staticMethod() { //static 메서드
        	System.out.println(iv); //에러!!인스턴스 변수 사용 불가            
            System.out.println(cv); //클래스 변수 사용 가능
        }
} //end of class
:변수와 메서드 간의 호출. 메서드간의 호출에서처럼 인스턴스 메서드는 인스턴스 변수 사용 가능.
static메서드는 인스턴스 변수 사용 불가
profile
안녕 나의 새로운 세상

0개의 댓글