ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 클래스 메서드, 인스턴스 메서드
    JAVA/개념 - 김영한 강의 2024. 9. 17. 08:39

     

    1. 클래스 메서드 vs 인스턴스 메서드

    1) 인스턴스 메서드

    static이 붙지 않은 메서드. 인스턴스를 생성해야 호출할 수 있다.

    다음 인스턴스 메서드인 deco() 메서드를 보자.

    public class DecoUtil1 {
     	public String deco(String str) {
     	String result = "*" + str + "*";
    	return result;
     	}
    }
    public class DecoMain1 {
     	public static void main(String[] args) {
     
     		String s = "hello java";
            
    		DecoUtil1 utils = new DecoUtil1();
     		String deco = utils.deco(s);
     
     		System.out.println("before: " + s);  // 실행결과: before: hello java
     		System.out.println("after: " + deco); // 실행결과: after: *hello java*
     	}
    }

     

    deco() 메서드를 호출하려면 DecoUtill() 인스턴스를 먼저 생성해야 하며 단순히 기능만 제공한다.(멤버변수 등을 사용하지 않음)

     

     

     

    2) 클래스 메서드(= static 메서드, 정적 메서드)

    • static이 붙은 정적 메서드는 인스턴스 생성 없이 바로 호출할 수 있다. 따라서 메서드의 호출만으로 필요한 기능을 수행할 때 수로 사용한다. 
    • 클래스명 + .(dot) + 메서드 명
    public class DecoUtil2 {
     	public static String deco(String str) {
     	
        String result = "*" + str + "*";
     	return result;
     	}
    }

     

    public class DecoMain2 {
     	public static void main(String[] args) {
     
     	String s = "hello java";
     	String deco = DecoUtil2.deco(s);
     
     	System.out.println("before: " + s);
    	System.out.println("after: " + deco);
     	}
    }

     

     

     

     

     

    Example1

    public class DecoData {
    
    	private int instanceValue;
        private static int staticValue;
        
        public static void staticCall() {
        	staticValue++;
            staticMethod();
        }
        
        public void instanceCall() {
        	instanceValue++;
            instanceMethod();
            
            staticValue++;
            staticMethod();
        }
        
        private void instanceMethod() {
        	System.out.println("instanceValue=" + instanceValue);
        }
        
        private static void staticMethod()
        	System.out.println("staticValue=" + staticValue);
        }
    }

     

     

    staticCall()

    : static이 붙은 정적 메서드라, static이 없는 인스턴스 변수나 인스턴스 메서드가 접근하면 컴파일 오류가 생긴다. 

     

    instanceCall()

    : 인스턴스 메서드다. 모든 곳에서 공용인 static을 호출할 수 있다. 정적 변수, 정적 메서드, 인스턴스 변수, 인스턴스 메서드 모두에 접근할 수 있다. 

     

     

     

     

     

    Q.왜 정적 메서드는 인스턴스의 기능을 사용할 수 없을까?

    public class DecoDataMain {
    
    	public static void main(String[] args) {
        	
            System.out.println("1.정적 호출");
     		DecoData.staticCall();
     
     		System.out.println("2.인스턴스 호출1");
     		DecoData data1 = new DecoData();
     		data1.instanceCall();
     
     		System.out.println("3.인스턴스 호출2");
     		DecoData data2 = new DecoData();
     		data2.instanceCall();
     }
    }

     

     

     

     

     

    • 정적 메서드는 클래스의 이름을 통해 바로 호출할 수 있다. 그래서 인스턴스처럼 참조값의 개념이 없다. 특정 인스턴스의 기능을 사용하려면 참조값을 알아야 하는데, 정적 메서드는 참조값 없이 바로 호출할 수 있으니 인스턴스 변수와 인스턴스 메서드를 사용할 수 없다. 
    • but, 객체의 참조값을 직접 매개변수로 전달한 static 메서드는 인스턴스 변수 및 메서드 사용이 가능하다. 
    public static void staticCall(DecoData data) {
     data.instanceValue++;
     data.instanceMethod();
    }

     

     

     

     

    *변수가 공유되려면 그 변수를 다른 클래스나 별도의 객체에서 만들어서, 여러 객체가 그 변수를 참조하게 해야 한다. 

     a) 다른 클래스에서 변수를 선언하여 공유:
    Counter 같은 별도의 클래스에서 변수를 선언하고, 그 객체를 여러 클래스에서 공유하도록 만들 수 있습니다.

     

    b) 클래스 변수(static 변수):
    변수를 static으로 선언하면, 그 클래스의 모든 인스턴스가 해당 변수를 공유한다. 즉, 클래스 자체에 속한 변수이므로, 모든 객체가 동일한 변수를 참조하게 된다.

     

     

     

    static import

    이걸 사용하면 클래스 명을 생략하고 메서드를 호출 할 수 있다. 

     

     

     

    public static void main(String[] args)

    main() 메서드가 static이기 때문에 객체를 생성하지 않아도 작동됨.

     

     

     

    댓글

Designed by Tistory.