[자바의 정석] 변수와 메서드

강신현·2022년 5월 16일
0

자바의 정석

목록 보기
4/15

✅ 인스턴스 변수 ✅ 클래스 변수 ✅ 지역변수 ✅ 인스턴스 메서드 ✅ 클래스 메서드

변수의 종류

변수선언위치생성시기
클래스변수클래스 영역클래스가 메모리에 올라갈 때
인스턴스변수클래스 영역인스턴스가 생성되었을 때
지역변수클래스 영역 이외의 영역 (메서드, 생성자, 초기화 블럭 내부)변수 선언문이 수행되었을 때

1. 인스턴스 변수

(instance variable)

인스턴스마다 고유한 상태를 유지해야하는 속성의 경우 사용

  • 인스턴스 변수의 값을 읽거나 저장하기 위해서는 먼저 인스턴스를 생성해야 한다.

2. 클래스 변수 (static 변수)

(class variable)

모든 인스턴스가 공통된 저장공간(변수)을 공유하므로, 한 클래스의 모든 인스턴스가 공통된 값을 유지해야 하는 경우 사용

  • 인스턴스 변수 앞에 static을 붙여 선언
  • 인스턴스 변수와 달리 인스턴스를 생성하지 않고 언제라도 바로 사용 가능
  • 클래스가 메모리에 로딩될 때 생성되어 프로그램이 종료될 때 까지 유지됨
  • public을 붙이면 같은 프로그램 어디서나 접근 가능 (전역변수 global variable)

3. 지역변수

(local variable)

메서드 내에 선언되어 매서드 내에서만 사용 가능

  • 메서드가 종료되면 소멸, 사용 불가
  • ex) 반복문 내에 선언된 지역변수

메서드

특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것

- 사용 이유

  1. 높은 재사용성
  2. 중복된 코드의 제거
    • 코드의 양이 줄어들어 오류 발생 가능성도 줄어든다.
  3. 프로그램 구조화
    • 큰 규모의 프로그램에서는 문장들을 작업단위로 나눠서 여러 개의 메서드에 담아 프로그램의 구조를 단순화 시키는 것이 필수적이다.
    • 유지보수에 용이

- 선언과 구현

int add(int x, int y){
	int result = x + y;
    return result;
}

- 호출

int result = add(1,2);
  • 같은 클래스 내의 메서드끼리는 참조변수를 사용하지 않고도 서로 호출이 가능
  • static 메서드는 같은 클래스 내의 인스턴스 메서드를 호출할 수 없다.

JVM의 메모리 구조

JVM의 메모리 구조

기본형, 참조형 매개변수

  • 기본형 매개변수(primitive type) : 기본형 값이 복사
    • 변수의 값을 읽기만 할 수 있다.
  • 참조형 매개변수(reference type) : 인스턴스의 주소 복사
    • 변수의 값을 읽고 변경할 수 있다.

메서드의 종류

1. 인스턴스 메서드

인스턴스 변수나 인스턴스 메서드와 관련된 작업을 하는 메서드

  • 반드시 객체를 생성해야만 호출 가능
  • 인스턴스 생성 후, '참조변수.메서드이름()'으로 호출

2. 클래스 메서드 (static 메서드)

인스턴스 변수나 인스턴스 메서드와 관련없는 작업을 하는 메서드

  • 객체 생성 없이 호출 가능
  • 메서드 내에서 인스턴스 변수 및 인스턴스 메서드 사용 불가
  • 메서드 내에서 인스턴스 변수와 메서드를 사용하지 않는다고 해서 반드시 클래스 메서드로 정의해야하는 것은 아니지만 특별한 이유가 없는 한 그렇게 하는 것이 일반적이다.

메서드 생성

class MyMath2{
	long a,b;
    
    // 인스턴스 메서드
    long add(){
    	return a+b; // 인스턴스 변수 사용
    }
    
    // 클래스 메서드 (static 메서드)
    static long add(long a, long b){
    	return a+b; // 인스턴스 변수 사용하지 않음 (지역 변수)
    }

}

메서드 호출

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

클래스 멤버와 인스턴스 멤버간의 참조와 호출

  1. 클래스 멤버 <-> 클래스 멤버
    같은 클래스에 속한 멤버들 간에는 별도의 인스턴스를 생성하지 않고도 서로 참조 또는 호출이 가능하다.
  2. 인스턴스 멤버 <-> 인스턴스 멤버
    인스턴스 멤버간의 호출에는 아무런 문제가 없다.
    왜냐하면 하나의 인스턴스 멤버가 존재한다는 것은 인스턴스가 이미 생성되었다는 것을 의미하며, 즉 다른 인스턴스 멤버들도 모두 존재하기 때문이다.
  3. 클래스 멤버 -> 인스턴스 멤버
    클래스 멤버가 인스턴스 멤버를 참조, 호출하기 위해서는 객체를 생성해야 한다.
  4. 인스턴스 멤버 -> 클래스 멤버
    클래스 멤버는 언제나 참조 또는 호출이 가능하기 때문에 인스턴스 멤버가 클래스 멤버를 사용하는 것은 아무런 문제가 안 된다.
profile
땅콩의 모험 (server)

0개의 댓글