자바_변수와 메서드

Larry·2021년 6월 21일
0

변수의 종류

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

	void method()
	{
		int lv = 0;	// 지역변수
	}
}

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

클래스의 인스턴스를 생성할 때 만들어진다. 인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있으며, 인스턴스마다 고유한 상태를 유지해야하는 속성의 경우, 인스턴스로 선언한다.

2. 클래스변수(class variable)

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

3. 지역변수(local variable)

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

class CardTest{
	public static void main(String args[]){
    System.out.println("Card.width = " + Card.width);
    System.out.println("Card.height = " + 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 + ")" );
    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 + ")" );
    }
}

class Card{
	String kind;
    	int number;
    	static int width = 100;
    	static int height = 250;
}

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

메서드

'메서드(method)'는 특정작업을 수행하는 일련의 문장들을 하나로 묶은 것이며, 기본적으로 수학의 함수와 유사하다.

메서드를 사용하는 이유

  1. 높은 재사용성(reusability)

    한번 만들어 놓은 메서드는 몇 번이고 호출 할 수 있으며, 다른 프로그램에서도 사용이 가능하다.

  2. 중복된 코드의 제거

    반복되는 문장들을 묶어서 하나의 메서드로 작성해 놓으면, 메서드를 호출하는 한 문장으로 대체할 수 있다.

  3. 프로그램의 구조화

    큰 규모의 프로그램에서 문장들을 작업단위로 나눠서 여러 개의 메서드에 담아 프로그램의 구조를 단순화시킴으로써 프로그램의 전체 흐름이 한눈에 들어올 수 있어 나중에 프로그램에 문제가 발생해도 쉽게 찾아서 해결할 수 있다.

public static void main(String args[]){
	int[] numArr = new int[10];
    
    initArr(numArr);	// 1. 배열을 초기화
    printArr(numArr);	// 2. 배열을 출력
    sortArr(numArr); 	// 3. 배열을 정렬
    printArr(numArr);	// 4. 배열을 출력
}

위의 코드처럼 각 메서드의 역할과 기능들을 구조화함으로써 전체의 흐름을 쉽게 파악할 수 있고, 오류발생 메서드의 위치를 찾아서 빠르게 수정이 가능하다.

메서드의 선언과 구현

메서드는 크게 '선언부(header, 머리)'와 '구현부(body, 몸통)'로 이루어져 있다.

int add(int a, int b) // => 선언부
{
	int result = a + b;
    	return result; // 호출한 메서드로 결과를 반환한다.
} // => 구현부

메서드 선언부는 '메서드의 이름'과 '매개변수 선언', 그리고 '반환타입'으로 구성되어 있으며, 메서드가 작업을 수행하기 위해 어떤 값들을 필요로 하고 작업의 결과로 어떤 타입의 값을 반환하는지에 대한 정보를 제공한다.

메서드 구현부는 메서드 선언부 다음에 오는 괄호{}를 뜻하며, 여기에 메서드를 호출했을 때 수행될 문장들을 넣는다.

int add(int a, int b)
{
int result = a + b;
return result;
}

위에 정의 된 메서드 add에 선언된 변수 x,y,result는 메서드 내에 선언된 변수로 '지역변수(local variable)'라고 한다.

메서드의 호출

메서드이름(값1, 값2, ...) // 메서드를 호출하는 방법
print99danAll(); // void print99danAll()을 호출
int result = add(3, 5); // int add(int x, int y)를 호출하고, 결과를 result에 저장

메서드를 호출할 때 괄호()안에 지정해준 값인 '인자(argument)' 또는 '인수'의 개수 또는 순서는 호출된 메서드에 선언된 매개변수와 일치해야만 호출이 가능하다.

class MyMathTest {
    public static void main(String[] args) {
        MyMath mm = new MyMath();
        long result1 = mm.add(5L, 3L);
        long result2 = mm.subtract(5L, 3L);
        long result3 = mm.multiply(5L, 3L);
        double result4 = mm.divide(5L, 3L);

        System.out.println("add(5L, 3L) = " + result1);
        System.out.println("subtract(5L, 3L) = " + result2);
        System.out.println("multiply(5L, 3L) = " + result3);
        System.out.println("divide(5L, 3L) = " + result4);
    }
}

class MyMath {
    long add(long a, long b){
        long result = a+b;
        return result;
        // return a + b;  // 위의 두줄을 이와 같이 한 줄로 간단히 할 수 있다.
    }
    long subtract(long a, long b) { return a - b; }
    long multiply(long a, long b) { return a * b; }
    double divide(double a, double b) { return a / b;}
}

위의 코드를 보면 각 메서드에는 각각의 반환타입(long, double)을 가지고 있고, 타입에 따른 매개변수들 또한 가지고 있다. 그리고 메인 메서드를 통해서 호출받은 MyMath의 메서드들은 그에 맞는 타입의 수를 입력받아 다음과 같은 결과를 얻는다.

실행결과
add (5L, 3L) = 8
subtract (5L, 3L) = 2
multiply (5L, 3L) = 15
divide (5L, 3L) = 1.66666666666667

여기에서 'divide (5L, 3L) = 1.66666666666667'가 나오는 이유는
long형의 값인 5L,3L이 double형 값인 5.0, 3.0으로 자동 형변환되어 divide의 매개변수로서 저장되어 호출되었다.

참고 자바의 정석 p246 ~ p257

profile
Be yourself, no matter what they say

1개의 댓글

comment-user-thumbnail
2021년 6월 23일

정말 유용한 내용이었어요~~ 다음에 시간나면 제 블로그도 찾아와주세요~

답글 달기