[Java] 필드와 메서드

Nakjoo·2022년 12월 27일
0

[SEB_BE_43]

목록 보기
9/29

1. 필드(Field)

필드는 '클래스에 포함된 변수'를 의미하는 것으로 객체의 속성을 정의할 때 사용된다.

자바에서 변수는 크게 클래스 변수(cv, class variable), 인스턴스 변수(iv, instance variable), 그리고 지역 변수(lv, local variable)라는 세 가지로 구분될 수 있다.

이 중 필드라 부르는 것은 클래스 변수와 인스턴스 변수이며, 이 둘은 다시 static 키워드의 유무로 구분 할 수 있다.

좀 더 구체적으로, static 키워드가 함께 선언된 것은 클래스 변수, 그렇지 않은 것은 인스턴스 변수다. 그리고 이 두 가지 변수 유형에 포함되지 않고 메서드 내에 포함된 모든 변수를 지역 변수라 부른다.

이 세 가지 유형의 변수들은 주로 선언된 위치에 따라 그 종류가 결정되며 각각 다른 유효 범위(scope)를 가지게 된다.

class Example { // => 클래스 영역
	int instanceVariable; // 인스턴스 변수
    static int classVariable // 클래스 변수(static 변수, 공유 변수)
    
    void method() { // => 메서드 영역
    	int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
    }
}

위의 코드 예제에서 Example 클래스 안에 앞서 언급한 세 가지 유형의 변수가 선언되어져 있다. 이 중에 instanceVariableclassVariable 은 클래스 영역에 선언되었기 때문에 멤버 변수다.

다시 static 키워드의 유무에 따라 classVariable 변수가 클래스 변수, 그리고 키워드가 있지 않은 instanceVariable 변수가 인스턴스 변수가 된다.

마지막으로 메서드 내부의 블럭에 선언되어있는 지역변수 localVariable 가 있다.

이처럼 변수는 주로 그 선언 위치와 static 키워드의 유무에 따라 구분할 수 있다. 이제 각각에 대해서 좀 더 자세히 살펴보겠다.


먼저 인스턴스 변수(iv)는 인스턴스가 가지는 각각의 고유한 속성을 저장하기 위한 변수로 new 생성자() 를 통해 인스턴스가 생성될 때 만들어진다.

클래스를 통해 만들어진 인스턴스는 힙 메모리의 독립적인 공간에 저장되고, 동일한 클래스로부터 생성되었지만 객체의 고유한 개별성을 가집니다.

다음으로, static 키워드를 통해 선언하는 클래스 변수(cv)가 있습니다. 클래스 변수는 독립적인 저장 공간을 가지는 인스턴스 변수와 다르게 공통된 저장공간을 공유한다.

따라서 한 클래스로부터 생성되는 모든 인스턴스 들이 특정한 값을 공유해야하는 경우에 주로 static 키워드를 사용하여 클래스 변수를 선언하게 된다.

또한, 클래스 변수는 인스턴스 변수와 달리 인스턴스를 따로 생성하지 않고도 언제라도 클래스명.클래스변수명 을 통해 사용이 가능하다. 위의 코드 예제로 예를 들면, Example.classVariable 로 클래스 변수를 사용할 수 있다.

마지막으로 앞서 설명한 두 가지의 멤버 변수와 구분되는 지역변수(lv)가 있습니다. 지역변수는 메서드 내에 선언되며 메서드 내({} 블록)에서만 사용가능한 변수다.

마지막으로 필드 변수와 지역 변수의 주요한 한 가지 차이점은 초기값에 있다.

직접 초기화하지 않으면 값을 출력할 때에 오류가 발생하는 지역변수와는 다르게 필드 변수는 직접적으로 초기화를 실행하지 않더라도 강제로 초기화가 이뤄진다.

2. 메서드(Method)

메서드는 "특정 작업을 수행하는 일련의 명령문들의 집합"을 의미하며, 클래스의 기능에 해당하는 내용들을 담당한다.

메서드는 다시 크게 머리에 해당하는 메서드 시그니처(method signature)와 몸통에 해당하는 메서드 바디(method body)로 구분할 수 있다.

자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처
	메서드 내용 // 메서드 바디
}

메서드 시그니처는 순서대로 해당 메서드가 어떤 타입을 반환하는 가(반환 타입), 메서드 이름이 무엇(메서드명)이며 해당 작업을 수행하기 위해서 어떤 재료들이 필요한지(매개 변수)에 대한 정보를 포함하고 있다.

다음으로 메서드의 바디는 괄호({}) 안에 해당 메서드가 호출되었을 때 수행되어야하는 일련의 작업들을 표시하게 된다. 참고로 메서드명은 관례적으로 소문자로 표시한다.

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

위의 예시는 접근 제어자는 public이고, 메서드명이 add인 메서드이며 int타입 2개의 갑(xy)을 받아 더한 다음 int 타입의 결과값을 반환하는 메서드라 정리할 수 있다.

만약 메서드의 반환타입이 void가 아닌 경우에는 메서드 바디({})안에 반드시 return문이 존재해야 한다.

3. 메서드의 호출

메서드도 클래스의 멤버이므로 클래스 외부에서 메서드를 사용하기 위해서는 먼저 인스턴스를 생성해야한다. 인스턴스를 생성한 후에 포인트 연산자(.)를 통해 메서드를 호출할 수 있다.

반면, 클래스 내부에 있는 메서드끼리는 따로 객체를 생성하지 않고도 서로를 호출할 수 있다.

메서드를 호출하는 기본적인 방법은 다음과 같다.

메서드이름(매개변수1, 매개변수2, ...); // 메서드 호출방법. 매개 변수가 없을 수도 있음.

printHello();
getNumSeven();
multiply(4, 4.0);

//출력값
hello!
7
16.0

메서드 호출 시 괄호() 안에 넣어주는 입력 값을 '인자(argument)'라고 하는데, 인자의 개수와 순서는 반드시 메서드를 정의할 때 선언된 매개변수와 일치되어야 한다. 그렇지 않은 경우 실행 에러가 발행하게 된다.

4. 메서드 오버로딩(Method Overloading)

메서드 오버로딩이란 하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것을 의미한다.

public class Overloading {
    public static void main(String[] args) {
        Shape s = new Shape(); // 객체 생성
 
        s.area(); // 메서드 호출
        s.area(5);
        s.area(10,10);
        s.area(6.0, 12.0);
    }
}

class Shape {
    public void area() { // 메서드 오버로딩. 같은 이름의 메서드 4개.
        System.out.println("넓이");
    }
    public void area(int r) {
        System.out.println("원 넓이 = " + 3.14 * r * r);
    }

    public void area(int w, int l) {
        System.out.println("직사각형 넓이 = " + w * l);
    }

    public void area(double b, double h) {
        System.out.println("삼각형 넓이 = " + 0.5 * b * h);
    }
}

//출력값
넓이
원 넓이 = 78.5
직사각형 넓이 = 100
삼각형 넓이 = 36.0

위의 예시를 보면, Shape 클래스 안에 있는 모든 메서드들이 area()라는 메서드명을 가지고 있음에도 불구하고 각기 다른 출력값을 리턴하는 것을 확인할 수 있다.

여기서 한 가지 꼭 기억해야하는 점은 무조건 같은 메서드명을 사용한다고해서 오버로딩이 되는 것은 아니라는 것이다.

오버로딩이 성립하기 위해서는 크게 두 가지 조건이 성립되어야한다.

  • 메서드의 이름이 같아야 한다.
  • 매개변수의 개수 또는 타입이 달라야 한다.

마지막으로 오버로딩의 장점은 무엇이 있을까?

가장 큰 장점은 하나의 메서드로 여러 경우의 수를 해결할 수 있다는 것이다.

오버로딩의 대표적인 예시로 println() 메서드가 있다. 지금까지 우리가 println() 메서드를 사용했을 때 아무 값이나 괄호() 안에 인자로 넣어서 사용하는데 문제가 없었지만, 사실 그 내부를 살펴보면 매개변수의 타입에 따라서 호출되는 println() 메서드가 달라진다는 사실을 알 수 있다.

0개의 댓글