티스토리 뷰
Static 멤버와 Non-Static 멤버의 차이
staitc 멤버 | non-static 멤버 | |
From | 클래스에 속하는 멤버 | 객체에 속하는 멤버 |
초기화 시점 | 클래스가 로딩될 때 초기화되며, 프로그램 종료까지 메모리에 유지 | 객체가 생성될 때 초기화되며, 객체가 삭제될 때까지 메모리에 유지 |
생성 타이밍 | 클래스를 로딩할 때 생성되며, 클래스의 인스턴스를 생성하지 않고도 사용 O |
클래스의 인스턴스를 생성해야 사용 |
Value | 클래스마다 공유되는 값 | 객체마다 다른 값 |
용도 | 유틸리티 메서드 등을 표현, 상수 값을 저장하는 데 사용 | 객체의 상태를 표현,객체 간의 관계를 나타내는 데 사용 |
ex | 데이터베이스의 연결 정보나, 프로그램에서 공유해야 할 상수 값 | 학생 객체를 생성하면서 학생의 이름, 학번, 성적 등의 정보 |
Static 메서드와 Non-Static 메서드의 차이
Static 메서드 | Non-Static 메서드 | |
호출 방법 | 객체를 생성하지 않고도 클래스 이름으로 직접 호출 | 객체를 생성한 후, 객체 이름을 사용하여 호출 |
From | 클래스에 속하는 메서드 | 객체에 속하는 메서드 |
객체 상태에 대한 접근 여부 |
Static 메서드는 객체 상태에 접근 X | Non-Static 메서드는 객체의 상태에 접근 O |
객체 생성 여부 | 객체를 생성하지 않고도 호출할 수 있기 때문에, 객체 생성 전에도 호출 O | 메서드는 객체를 생성해야만 호출 O |
다형성 | 다형성X | 다형성O |
용도 | - 객체와 관계없는 작업을 수행 - 객체를 생성하기 전에 사용해야 하는 작업을 수행할 때 사용 |
객체의 상태에 따라 동작하는 작업을 수행할 때 사용 |
다형성의 지원여부란?
Static 메서드는 실행 시점에서 호출되는 메서드가 이미 결정되어 있으므로, 객체의 타입에 따라 동작이 달라지지 않습니다. Non-Static 메서드는 실행 시점에서 객체의 타입에 따라 호출되는 메서드가 결정되므로, 객체의 타입에 따라 동작이 달라질 수 있습니다. 이러한 차이로 인해, Non-Static 메서드는 다형성을 지원할 수 있습니다.
메서드와 멤버의 차이
멤버(Member)는 클래스에서 정의되는 변수와 상수, 메서드 등의 요소를 말합니다. 즉, 클래스의 속성과 동작을 정의하는 요소들을 모두 멤버라고 할 수 있습니다.
메서드(Method)는 클래스에서 정의된 동작을 수행하는 코드 블록입니다. 클래스에서 객체의 행동을 정의하는 요소로, 메서드는 입력값을 받아 출력값을 반환하거나, 객체의 상태를 변경하는 등의 작업을 수행합니다.
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public static void printPersonName(Person person) {
System.out.println(person.name); // 오류발생: Static 메서드에서 Non-Static 멤버에 접근할 수 없음
}
public void printPersonAge() {
System.out.println(this.age); // Non-Static 메서드에서 객체의 상태에 접근 가능
}
}
public class Main {
public static void main(String[] args) {
Person person1 = new Person("Alice", 25);
Person person2 = new Person("Bob", 30);
Person.printPersonName(person1); // 오류: Static 메서드에서 Non-Static 멤버에 접근할 수 없음
person1.printPersonAge(); // 출력 결과: 25
person2.printPersonAge(); // 출력 결과: 30
}
}
Static 변수를 사용할 때 어떤 주의점
- Static 변수는 모든 객체에서 공유되므로, 하나의 객체에서 값이 변경되면, 다른 객체에서도 변경된 값을 공유하게 됩니다. 따라서, 공유된 값이 예기치 않게 변경되는 상황을 방지하기 위해, 변경 가능한 데이터는 Static 변수보다는 인스턴스 변수로 선언하는 것이 좋습니다.
- Static 변수는 클래스가 로딩될 때 초기화되므로, 다른 Static 변수의 값을 사용하려면, 해당 변수가 먼저 초기화되어 있어야 합니다.
Static 메서드를 사용할 때 어떤 주의점
Static 메서드는 객체의 상태와 관계 없이 클래스에서 공통으로 사용할 수 있는 기능을 제공하는 메서드입니다. 즉, 객체를 생성하지 않고도 클래스의 이름으로 직접 호출할 수 있는 메서드입니다.
예를 들어, Math 클래스에서 제공하는 abs() 메서드나 round() 메서드 등은 객체의 상태와 관계 없이 인수로 전달된 값을 기반으로 계산을 수행하는 Static 메서드입니다. 이러한 메서드는 클래스의 기능을 확장하고, 재사용성을 높이는 데 유용합니다.
반면에, 객체의 상태와 관련된 작업은 인스턴스 변수를 사용하여 객체의 상태를 변경하거나, 객체의 메서드를 호출하여 작업을 수행합니다. 따라서, 객체의 상태를 변경하거나, 인스턴스 변수를 사용하는 작업은 객체와 관련된 작업이기 때문에 Static 메서드에서는 수행하지 않는 것이 좋습니다.
- Static 메서드는 객체와 관련된 작업이 아닌, 클래스에서 공통으로 사용되는 작업을 수행할 때 사용합니다. 따라서, 객체의 상태를 변경하거나, 인스턴스 변수를 사용하는 작업은 Static 메서드에서 수행하지 않는 것이 좋습니다.
- Static 메서드는 다형성을 지원하지 않기 때문에, 오버라이딩할 수 없습니다.
Static 클래스는 무엇이고 어떤 경우에 사용
- Static 클래스는 정적 클래스라고도 하며, 객체를 생성하지 않고도 사용할 수 있는 클래스입니다.
- 주로 유틸리티 클래스나, 상수 값을 가지는 클래스 등에서 사용됩니다.
- Static 클래스는 생성자가 없으므로, 상속될 수 없습니다. 또한, Static 멤버만 가질 수 있습니다.
- Static 클래스는 객체를 생성하지 않고도 사용할 수 있는 유틸리티 클래스나 상수 클래스 등에서 사용
Math 클래스
public final class Math {
public static final double PI = 3.14159265358979323846;
public static double abs(double a) { ... }
public static double sin(double a) { ... }
public static double cos(double a) { ... }
public static double sqrt(double a) { ... }
// ...
}
Arrays 클래스
public class Arrays {
public static <T> void sort(T[] a) { ... }
public static <T> boolean equals(T[] a, T[] a2) { ... }
public static int binarySearch(int[] a, int key) { ... }
// ...
}
Java의 main 메서드가 static인 이유는?
Java의 main 메서드가 Static인 이유는, main 메서드가 JVM에서 프로그램을 실행하기 위한 진입점(Entry Point)이기 때문입니다.
Static 메서드는 객체를 생성하지 않고도 클래스의 이름으로 직접 호출할 수 있는 메서드이며, main 메서드는 프로그램을 실행하기 위한 진입점으로, JVM이 main 메서드를 클래스 이름과 함께 호출하기 때문에, main 메서드는 Static으로 선언되어야 합니다.
또한, main 메서드가 Static이 아닌 인스턴스 메서드로 선언된다면, 객체를 생성해야만 main 메서드를 호출할 수 있기 때문에, 프로그램을 실행하기 위해 매번 객체를 생성하는 것은 비효율적입니다. 따라서, main 메서드는 Static으로 선언되어야 하며, 객체를 생성하지 않고도 클래스 이름과 함께 호출할 수 있어야 합니다.
'JAVA' 카테고리의 다른 글
[JAVA] public static void main(String[] args) (0) | 2023.04.11 |
---|---|
[JAVA] Java의 컴파일 및 실행 과정 (0) | 2023.04.11 |
[JAVA] HashMap, HashTable, ConcurrentHashMap,LinkedHashMap 차이 (0) | 2023.04.04 |
[JAVA] 객체 지향의 특징 4가지 (0) | 2023.02.23 |
[JAVA] 인터페이스 (0) | 2023.02.23 |