JAVA - 필드와 메서드

흑이·2022년 5월 13일
0

필드

필드란? 클래스에 포함된 변수

  • 클래스 변수(cv, class variable),
  • 인스턴스 변수(iv, instance variable)

  • static 키워드가 함께 선언된 것은 클래스 변수
  • 그렇지 않은 것은 인스턴스 변수
  • 두 가지 변수 유형에 포함되지 않고 메서드 내에 포함된 모든 변수를 지역변수

class Exam { // => 클래스 영역
	int instanceVariable; // 인스턴스 변수
	static int classVariable; // 클래스 변수(static 변수, 공유변수)

	void method() { // => 메서드 영역
		int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
	}
}

instanceVariableclassVariable 은 클래스 영역에 선언되었기 때문에 멤버 변수

메서드 내부의 블럭에 선언되어있는 지역변수 localVariable


인스턴스 변수(iv)

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

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

클래스 변수(cv)

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

  • 인스턴스를 따로 생성하지 않고도 언제라도 클래스명.클래스변수명 을 통해 사용이 가능
    (ex. Exam.classVariable)

지역변수(lv)

메서드 내에 선언되며 메서드 내({} 블록)에서만 사용가능한 변수

  • 멤버 변수와는 다르게 지역변수는 스택 메모리에 저장되어 메서드가 종료되는 것과 동시에 함께 소멸되어 더이상 사용할 수 없게 된다.

  • 힙 메모리에 저장되는 필드 변수는 객체가 없어지지 않는 한 절대로 삭제되는 않는 반면에 스택 메모리에 저장되는 지역변수는 한동안 사용하지 않는 경우 가상 머신에 의해 자동으로 삭제


차이점

필드 변수와 지역 변수의 한 가지 차이점 초기값

  • 직접 초기화하지 않으면 값을 출력할 때에 오류가 발생하는 지역변수

  • 필드 변수는 직접적으로 초기화를 실행하지 않더라도 강제로 초기화 이루어짐

  • 힙 메모리에는 빈 공간이 저장될 수 없기 때문에 이곳에 저장되는 필드는 강제로 초기화

  • 스택 메모리는 강제로 초기화되지 않으므로 지역 변수는 선언시 반드시 초기화를 실행해주어야 한다.


static 키워드

static 키워드로 정의되어 있는 클래스 멤버들은 인스턴스의 생성 없이도 클래스명.멤버명 만으로도 사용이 가능

  • 물론 정적 멤버도 객체를 생성한 이후 참조변수를 통해 사용이 가능하지만, 애초에 정적 멤버임을 표시하기 위해서 클래스명.멤버명 의 형태로 사용할 것을 권장

public class StaticTest {
    public static void main(String[] args) {
        StaticExample staticExample = new StaticExample();
        System.out.println("인스턴스 변수: " + staticExample.num1); // static 키워드가 없는 인스턴스 변수
        System.out.println("클래스 변수: " + StaticExample.num2); //static 키워드가 있는 클래스 변수
    }
}

class StaticExample {
    int num1 = 10;
    static int num2 = -10;
}

//Output
인스턴스 변수: 10
클래스 변수: -10

인스턴스 변수는 객체 생성 후에 포인트 연산자를 사용하여 값을 불러옴

클래스 변수는 객체 생성 없이 클래스명을 사용하여 값을 불러왔다.

메서드 앞에 static 키워드를 사용하면 해당 메서드는 정적 메서드가 됩니다.

정적 메서드도 정적 필드와 마찬가지로 클래스명만으로 바로 접근이 가능합니다.

정적 메서드의 경우 인스턴스 변수 또는 인스턴스 메서드를 사용할 수 없다


public class StaticFieldTest {
    public static void main(String[] args) {
        StaticField staticField1 = new StaticField(); // 객체 생성
        StaticField staticField2 = new StaticField();

        staticField1.num1 = 100; 
        staticField2.num1 = 1000;

        System.out.println(staticField1.num1);
        System.out.println(staticField2.num1);

        staticField1.num2 = 150;
        staticField2.num2 = 1500;
        System.out.println(staticField1.num2);
        System.out.println(staticField2.num2);

    }
}

class StaticField {
    int num1 = 10;
    static int num2 = 15;
}

//출력값
100
1000
1500
1500

클래스에 인스턴스 필드(num1)와 정적 필드(num2)를 각각 선언

  • num1의 경우에는 각각의 변수가 고유성을 가지기 때문에 100과 1000으로 따로 출력되는 반면

  • num2의 경우는 앞서 배웠던 것처럼 값 공유가 일어나 1500이 출력값으로 두 번 반복

static 키워드를 사용하면 모든 인스턴스에 공통적으로 적용되는 값을 공유



메서드(Method)

특정 작업을 수행하는 일련의 명령문들의 집합을 의미하며, 클래스의 기능을 담당

Java에는 두 가지 유형의 메소드가 있습니다.

  • 사용자 정의 방법 : 요구 사항에 따라 자체 방법을 만들 수 있습니다.
  • 표준 라이브러리 메소드 : 사용할 수 있는 Java의 내장 메소드입니다.

사용자 정의 방법 - 자바 메서드 선언

public static int add(int x, int y) { // 메서드 시그니처
	int result = x + y; // 메서드 바디
	return result;
}

표준 라이브러리 방법
표준 라이브러리 메소드는 쉽게 사용할 수 있는 Java의 내장 메소드입니다.

이러한 표준 라이브러리는 JVM 및 JRE가 있는 Java 아카이브(*.jar) 파일의 Java 클래스 라이브러리(JCL)와 함께 제공됩니다.

예를 들어

  • Math.sqrt 이용하여 제곱근 출력
public class Main {
  public static void main(String[] args) {
    
    // using the sqrt() method
    System.out.print("Square root of 4 is: " + Math.sqrt(4));
  }
}

메서드 오버로딩(Method Overloading)

하나의 메서드에 하나의 기능만을 구현해야하는데, 같은 이름의 메서드를 여러 기능을 구현하기 때문에 오버로딩이란 용어를 사용

  • 무조건 같은 메서드명을 사용한다고해서 오버로딩이 되는 것이 아니다.
  1. 같은 이름의 메서드명을 써줘야한다.
  2. 매개변수의 개수나 타입이 다르게 정의되어야 한다.

반환 타입은 오버로딩이 성립하는 데에 영향을 주지 못한다.

다른 반환 타입을 지정했다고해서 가상 머신은 다른 메서드라 인식하지 못한다.

오버로딩의 장점?

  1. 하나의 메서드로 여러 경우의 수를 해결할 수 있다
    (ex. println() 메서드)
  • println() 메서드를 사용했을 때 아무 값이나 괄호()안에 인자로 넣어서 사용하는데 문제가 없었지만,
    그 내부를 살펴보면 매개변수의 타입에 따라서 호출되는 println 메서드가 달라진다는 사실을 알 수 있습니다.


https://www.programiz.com/java-programming/methods

0개의 댓글