class Exam { // => 클래스 영역
int instanceVariable; // 인스턴스 변수
static int classVariable; // 클래스 변수(static 변수, 공유변수)
void method() { // => 메서드 영역
int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
}
}
instanceVariable
과 classVariable
은 클래스 영역에 선언되었기 때문에 멤버 변수
메서드 내부의 블럭에 선언되어있는 지역변수 localVariable
인스턴스 변수(iv)는 인스턴스가 가지는 각각의 고유한 속성을 저장하기 위한 변수로 new 생성자() 를 통해 인스턴스가 생성될 때 만들어집니다.
static 키워드를 통해 선언하는 클래스 변수(cv)
클래스 변수는 독립적인 저장 공간을 가지는 인스턴스 변수와 다르게 공통된 저장공간을 공유
메서드 내에 선언되며 메서드 내({} 블록)
에서만 사용가능한 변수
멤버 변수와는 다르게 지역변수는 스택 메모리에 저장되어 메서드가 종료되는 것과 동시에 함께 소멸되어 더이상 사용할 수 없게 된다.
힙 메모리에 저장되는 필드 변수는 객체가 없어지지 않는 한 절대로 삭제되는 않는 반면에 스택 메모리에 저장되는 지역변수는 한동안 사용하지 않는 경우 가상 머신에 의해 자동으로 삭제
필드 변수와 지역 변수의 한 가지 차이점 초기값
직접 초기화하지 않으면 값을 출력할 때에 오류가 발생하는 지역변수
필드 변수는 직접적으로 초기화를 실행하지 않더라도 강제로 초기화 이루어짐
힙 메모리에는 빈 공간이 저장될 수 없기 때문에 이곳에 저장되는 필드는 강제로 초기화
스택 메모리는 강제로 초기화되지 않으므로 지역 변수는 선언시 반드시 초기화를 실행해주어야 한다.
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 키워드를 사용하면 모든 인스턴스에 공통적으로 적용되는 값을 공유
특정 작업을 수행하는 일련의 명령문들의 집합을 의미하며, 클래스의 기능을 담당
Java에는 두 가지 유형의 메소드가 있습니다.
사용자 정의 방법 - 자바 메서드 선언
public static int add(int x, int y) { // 메서드 시그니처
int result = x + y; // 메서드 바디
return result;
}
표준 라이브러리 방법
표준 라이브러리 메소드는 쉽게 사용할 수 있는 Java의 내장 메소드입니다.
이러한 표준 라이브러리는 JVM 및 JRE가 있는 Java 아카이브(*.jar) 파일의 Java 클래스 라이브러리(JCL)와 함께 제공됩니다.
예를 들어
public class Main {
public static void main(String[] args) {
// using the sqrt() method
System.out.print("Square root of 4 is: " + Math.sqrt(4));
}
}
하나의 메서드에 하나의 기능만을 구현해야하는데, 같은 이름의 메서드를 여러 기능을 구현하기 때문에 오버로딩이란 용어를 사용
- 같은 이름의 메서드명을 써줘야한다.
- 매개변수의 개수나 타입이 다르게 정의되어야 한다.
반환 타입은 오버로딩이 성립하는 데에 영향을 주지 못한다.
다른 반환 타입을 지정했다고해서 가상 머신은 다른 메서드라 인식하지 못한다.