ByeongSuAhn 2021. 7. 18. 13:17

선언 위치에 따른 변수의 종류

변수는 클래스 변수, 인스턴스 변수, 지역변수 모두 세 종류가 있다.

변수의 종류를 결정짓는 중요한 요소는 변수의 선언된 위치이므로 변수의 종류를 파악하기 위해서는 변수가 어느 영역에 선언되었는지를 확인하는 것이 중요하다.

멤버 변수를 제외한 나머지 변수들은 모두 지역변수이며 지금까지 계속 사용해왔다.

멤버 변수 중 static이 붙은 것은 클래스 변수, 붙지 않은 것은 인스턴스 변수이다.

class Variables
{
	int iv;		// 인스턴스변수
    static int cv;	// 클래스변수(static변수, 공유변수)
    
    void method()
	{
    
    	int lv = 0;	// 지역변수
	}
}

 

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

 

1. 인스턴스 변수(instance variable)

클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어진다.

 

2. 클래스 변수(class variable)

클래스 변수를 선언하는 방법은 인스턴스 변수 앞에 static을 붙이기만 하면 된다.

클래스 변수는 모든 인스턴스가 공통된 저장공간(변수)을 공유하게 된다.

한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야 하는 속성의 경우, 클래스 변수로 선언해야 한다.

클래스 이름. 클래스 변수와 같은 형식으로 사용한다.

 

3 지역변수(local variable)

메서드 지역 내에 선언되어 메서드 내에서만 사용 가능하며, 메서드가 종료되면 소멸되어 사용할 수 없게 된다.

 

클래스 변수와 인스턴스 변수

public class CardTest {
	public static void main(String[] args) {
		System.out.println("Card.width = " + Card.width);
		System.out.println("Card.width = " + Card.height);
		
		Card c1 = new Card();
		c1.kind = "Heart";
		c1.number = 7;
		
		Card c2 = new Card();
		c2.kind = "Spade";
		c2.number = 4;
		
		System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + c1.width + ", " + c1.height + ")");
		System.out.println("c2은 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + c2.width + ", " + c2.height + ")"); //c1 c2를Card로 바꿔도 값이 같다
		System.out.println("c1의 width와 height를 각각 50, 80으로 변경합니다.");
		
		c1.width = 50;
		c1.height = 80;
		
		System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + c1.width + ", " + c1.height + ")") ;
		System.out.println("c2은 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + c2.width + ", " + c2.height + ")") ;
	}
}

Card클래스의 클래스변수(static변수)인 width, heitht는 Card클래스의 인스턴스를 생성하지 않고도 클래스 이름. 클래스 변수와 같은 방식으로 사용할 수 있다.

Card인스턴스인 c1과 c2는 클래스변수인 width와 height를 공유하기 때문에, c1의 width와 height를 변경하면 c2의 width와 height값도 바뀐 것과 같은 결과를 얻는다.

Card, width, c1.width, c2.width는 모두 같은 저장공간을 참조하므로 항상 같은 값을 같게 된다.

 

클래스 변수를 사용할 때는 Card.width와 같이 클래스이름.클래스변수의 형태로 하는 것이 좋다. 참조변수 c1, c2를 통해서도 클래스변수를 사용할 수 있지만 이렇게 하면 클래스변수를 인스턴스 변수로 오해하기 쉽기 때문이다.

인스턴스변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만,
클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다.

 

메서드

메서드는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다. 기본적으로 수학에서 함수의 역할과 비슷하며

어떤 값을 입력하면 이 값으로 작업을 수행해서 결과를 반환한다. 

예를들면 제곱근을 구하는 메서드 Math.sqrt()에 4.0을 입력하면, 2.0을 결과로반환한다.

 

메서드란것은 작업을 수행하는데 필요한 값을 넣고 원하는 결과를 얻으면 될 뿐, 이 메서드가 내부적으로 어떤 과정을 거쳐 결과를 만들어내는지 전혀 몰라도 된다.

sqrt()외에도 println()이나 random()과 같은 메서드도 마찬가지로 내부동작을 알지 못해도 사용하는데 어려움이 없다.

 

 

 

메서드를 사용하는 이유 

메서드를 통해서 얻는 이점은 여러가지가 있지만 그 중에서 대표적인 세가지는 다음과같다

1. 높은 재사용성(resuability)
	Java API에서 제공하는 메서드와 같이 한번 만들어 놓은 메서드는 몇 번이고 호출할 수 있으며,
    다른 프로그램에서도 사용이 가능하다.
    
2. 중복된 코드의 제거
	반복되는 문장들을 묶어서 하나의 메서드로 작성해 놓으면, 반복되는 문장들 대신
	메서드를 호출하는 한 뭉장으로 대체할 수 있다.
    
3. 프로그램의 구조화
	큰 규모의 프로그램에서는 문장들을 작업단위로 나눠서 여러 개의 메서드에 담아
	프로그램의 구조를 단순화시키는것이 필수적이다.