본문 바로가기

Java

Java static 메서드와 인스턴스 메서드

 

 

1. static 메서드와 인스턴스 메서드 비교

인스턴스 메서드 static메서드(클래스 메서드)
인스턴스 생성 후 '참조변수명.메서드명()'으로 호출 객체생성 없이 '클래스명.메서드명()'으로 호출
인스턴스 변수(iv)와 관련있는 작업을 하는 메서드 인스턴스 변수(iv)와 관련없는 작업을 하는 메서드
메서드 내 인스턴스 변수(iv) 사용 가능 메서드 내 인스턴스 변수(iv) 사용 불가

 

class MyMath {
    long a, b; // 인스턴스 변수(iv) a, b 선언
    
    // 인스턴스 메서드
    long add() { // 매개변수 없음
   	return a + b; // 인스턴스 변수 a, b 사용
    }
    
    // static(클래스)메서드, 매개변수 사용 
    static long add(long a, long b) { // 지역 변수 a, b 사용
    	return a + b;
    }
}

class  MethodEX  {
	 public static void main (String args[])  {
    
    	// static(클래스) 메서드 호출
    	System.out.println(MyMath.add(200L, 100L));
    	
        MyMath mm = new MyMath(); // 인스턴스(객체)생성
        mm.a = 200L;
        mm.b = 100L;
        // 인스턴스 메서드 호출
        System.out.println(mm.add());
    }
}

 

 

2. 메서드 간 호출과 참조

  1) static 메서드는 인스턴스 메서드(im) 호출 불가

class TestClass1 {
	
    // 인스턴스 메서드 호출(인스턴스 메서드는 객체 생성 후 호출 가능 -> 호출되었다는 것은 객체가 생성 되었다는 것)
    void instanceMethod() {
    }
    
    // static 메서드 호출(객체 생성 없이 호출 가능)
    static void staticMethod() {
    }
        
    // 인스턴스 메서드 호출(인스턴스 메서드는 객체 생성 후 호출 가능 -> 호출되었다는 것은 객체가 생성 되었다는 것)
    void instanceMethod2() {
    	instanceMethod(); // 인스턴스 메서드 호출 가능
        staticMethod(); // static 메서드 호출 가능
    }
    
    // static 메서드 호출(객체 생성 없이 호출 가능)
    static void staticMethod2() {
    	instanceMethod(); // ERROR, 인스턴스 메서드 호출 불가(인스턴스 메서드는 객체 생성 후 사용 가능)
        staticMethod(); // static 메서드 호출 가능
    }
    
}

 

  2) static 메서드는 인스턴스 변수(iv)사용 불가

class TestClass2 {
    int iv; // 인스턴스 변수(객체 생성 후 사용 가능)
    static int cv; // static 변수(언제나 사용 가능)
    
    // 인스턴스 메서드 호출(인스턴스 메서드는 객체 생성 후 호출 가능 -> 호출되었다는 것은 객체가 생성 되었다는 것)
    void instanceMethod() { 
    	System.out.println(iv); // 인스턴스 변수 사용 가능
        System.out.prinln(cv); // 클래스 변수 사용 가능
    }
    
    // static 메서드 호출(객체 생성 없이 호출 가능)
    static void staticMethod() {
    	System.out.println(iv); // ERROR, 인스턴스 변수 사용 불가(인스턴스 변수는 객체 생성 후 사용 가능)
        System.out.println(cv); // 클래스 변수 사용 가능
    }
}

 

 

3. static 멤버와 인스턴스 멤버

위치 종류 설명
클래스 영역 인스턴스 멤버
(im)
인스턴스 변수 - 인스턴스 생성 시 생성
- 인스턴스 생성 후 사용 가능
- 인스턴스의 고유한 속성
인스턴스 메서드 - 인스턴스 변수와 관련있는 작업을 하는 메서드
- 메서드 내 인스턴스 변수 사용 가능(인스턴스 생성 후 사용)
- '참조변수명.메서드명()' 으로 호출
static 멤버
(=클래스 멤버)
static 멤버 변수 - 인스턴스 변수에 static이 붙은 것
- 클래스가 메모리에 올라갈 때 생성
- 언제든 사용 가능(인스턴스 생성할 필요X)
- 인스턴스의 공통적 속성
static 멤버 메서드 - 인스턴스 변수와 관련없는 작업을 하는 메서드
- 메서드 내 인스턴스 변수 사용 불가(stiatc 변수, 지역 변수 사용)
- 언제든 사용 가능(인스턴스 생성할 필요X)
- '클래스명.메서드명()' 으로 호출
메서드 영역 지역변수 - 변수 선언문 수행 시 생성
- 선언된 메서드 내에서 만 사용 가능
- 메서드 종료 시 자동 제거

 

class Ex6_1 { 
	public static void main(String args[]) { 
		Tv t;                 // Tv인스턴스 선언, 참조변수명 t
		t = new Tv();         // Tv인스턴스 생성
//		Tv t = new Tv();      // 위 두 줄을 한줄로 표현(선언과 생성)
		
		t.channel = 7;        // Tv인스턴스의 channel을 7로  
		t.channelDown();      // Tv인스턴스의 channelDown() 인스턴스 메서드 호출 
		System.out.println("Tv의 채널은 " + t.channel + " 입니다.");
		
		// static 메서드 호출
		System.out.println("Tv의 사이즈는 " + Tv.size(100, 70) + " 입니다.");
		
	} 
}

// Tv 클래스(Tv설계도), 이 클래스로 만들어진 객체(Object)가 Tv 
class Tv { 
	// Tv의 속성(변수)
	// 인스턴스 변수(고유한 속성)
	String color;           // 색상 
	boolean power;         	// 전원(on/off) 
	int channel;           	// 채널 

	// static 변수(공통적인 속성)
	static int weight = 15;

	
	// Tv의 기능(메서드) 
	// 인스턴스 메서드
	void power() {
		power = !power;
	}
	
	void channelUp() {
		++channel;
	}
	
	void channelDown() {
		--channel;
	}   
	
	// static 메서드
	static int size(int width, int height) {
		return width * height;
	}
	
}

 

'Java' 카테고리의 다른 글

Java 생성자(constructor)  (0) 2022.10.09
Java 메서드 오버로딩(method overloading)  (0) 2022.10.09
Java 기본형 매개변수, 참조형 매개변수  (0) 2022.10.04
Java 호출 스택(call stack)  (0) 2022.10.04
Java return문, 반환값  (0) 2022.10.03