정적 클래스와 비정적 클래스
static을 사용한 클래스와 사용하지 않은 클래스는 접근 방식에 차이가 있습니다. 아래에서 각각의 차이와 이유를 정리하겠습니다.
1. 비정적 클래스 (Non-static Class)
- 정의:
static
키워드가 없는 클래스 또는 내부 클래스입니다. - 특징:
- 외부 클래스의 인스턴스와 연결되어야만 사용할 수 있습니다.
- 독립적으로 존재할 수 없으며, 반드시 외부 클래스의 객체를 통해 접근해야 합니다.
- 비정적 멤버(필드/메서드)는 인스턴스별로 유지됩니다.
예제
class Outer { // 비정적 외부 클래스
class Inner { // 비정적 내부 클래스
void display() {
System.out.println("Non-static Inner Class");
}
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer(); // 외부 클래스의 객체 생성
Outer.Inner inner = outer.new Inner(); // 비정적 내부 클래스의 객체 생성
inner.display(); // 메서드 호출
}
}
출력
Non-static Inner Class
접근 방식:
- 외부 클래스 객체 생성:
Outer outer = new Outer();
- 내부 클래스 객체 생성:
Outer.Inner inner = outer.new Inner();
- 메서드 호출:
inner.display();
2. 정적 클래스 (Static Class)
- 정의:
static
키워드가 붙은 내부 클래스입니다. - 특징:
- 외부 클래스의 인스턴스와 독립적으로 존재할 수 있습니다.
- 외부 클래스 객체를 생성하지 않고도 정적 내부 클래스에 직접 접근할 수 있습니다.
- 주로 유틸리티성 클래스나 외부 클래스와 관련된 고정된 작업을 수행할 때 사용됩니다.
예제
class Outer {
static class StaticInner { // 정적 내부 클래스
void display() {
System.out.println("Static Inner Class");
}
}
}
public class Main {
public static void main(String[] args) {
Outer.StaticInner inner = new Outer.StaticInner(); // 정적 내부 클래스 객체 생성
inner.display(); // 메서드 호출
}
}
출력
Static Inner Class
접근 방식:
- 객체 생성 없이 정적 내부 클래스 사용:
Outer.StaticInner inner = new Outer.StaticInner();
- 메서드 호출:
inner.display();
3. 주요 차이점: 비정적 클래스와 정적 클래스
특징 | 비정적 클래스 | 정적 클래스 |
---|---|---|
정의 방법 | class Inner {} |
static class StaticInner {} |
외부 클래스와의 관계 | 외부 클래스 객체가 필요 | 외부 클래스 객체와 독립적 |
객체 생성 방법 | Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); |
Outer.StaticInner inner = new Outer.StaticInner(); |
사용 목적 | 외부 클래스의 상태와 밀접히 관련된 작업 수행 | 외부 클래스와 독립적이고 고정된 작업 수행 |
메모리 사용 | 외부 클래스 객체당 별도로 생성 | 클래스 로딩 시 단일 메모리 공간에 로드 |
4. 결론
- 비정적 클래스:
- 외부 클래스의 상태나 동작과 밀접하게 연결된 경우 사용.
- 외부 클래스의 인스턴스를 통해 접근해야 합니다.
- 정적 클래스:
- 외부 클래스와 독립적인 유틸리티 작업이나 고정된 동작을 수행할 때 사용.
- 객체 생성 없이 외부 클래스 이름을 통해 직접 접근 가능합니다.
즉, 정적 클래스는 외부 클래스와 독립적으로 동작 가능하고, 객체를 생성하지 않고 접근할 수 있다는 점에서 비정적 클래스와 다릅니다.
.(점 연산자)
.
(점 연산자)는 Java에서 객체와 클래스의 멤버(필드, 메서드, 정적 멤버 등)에 접근하기 위해 사용되는 연산자입니다.
쉽게 말해, "."은 객체 또는 클래스의 내부 요소에 접근하는 도구입니다.
1. .
의 역할
a. 객체의 멤버에 접근
설명: 객체를 통해 해당 객체의 인스턴스 변수(필드) 또는 인스턴스 메서드에 접근합니다.
구문:
객체참조.필드 객체참조.메서드()
b. 클래스의 정적 멤버에 접근
설명: 클래스를 통해 해당 클래스의 정적 변수(static 필드) 또는 정적 메서드에 접근합니다.
구문:
클래스명.정적필드 클래스명.정적메서드()
c. 패키지와 클래스 참조
설명: 특정 패키지 내부의 클래스나 인터페이스를 참조할 때 사용됩니다.
구문:
패키지명.클래스명
2. .
의 사용 예시
a. 객체의 멤버 접근
class Person {
String name; // 필드
void sayHello() { // 메서드
System.out.println("Hello, my name is " + name);
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person(); // 객체 생성
person.name = "Alice"; // 점 연산자로 필드에 접근
person.sayHello(); // 점 연산자로 메서드 호출
}
}
출력:
Hello, my name is Alice
b. 클래스의 정적 멤버 접근
class MathUtils {
static double pi = 3.14159; // 정적 필드
static double square(double x) { // 정적 메서드
return x * x;
}
}
public class Main {
public static void main(String[] args) {
System.out.println(MathUtils.pi); // 점 연산자로 정적 필드 접근
System.out.println(MathUtils.square(4)); // 점 연산자로 정적 메서드 호출
}
}
출력:
3.14159
16.0
c. 패키지 참조
import java.util.ArrayList; // java.util 패키지의 ArrayList 클래스 참조
public class Main {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>(); // ArrayList 클래스 사용
list.add("Hello");
System.out.println(list);
}
}
출력:
[Hello]
d. 메서드 체이닝
점 연산자를 통해 메서드를 연속적으로 호출할 수 있습니다.
public class Main { public static void main(String[] args) { String result = " hello ".trim().toUpperCase(); // 메서드 체이닝 System.out.println(result); } }
출력:
HELLO
3. .
의 주요 사용 범위
사용 범위 | 예시 | 설명 |
---|---|---|
객체의 인스턴스 멤버 | object.field object.method() |
객체의 필드나 메서드에 접근 |
클래스의 정적 멤버 | ClassName.staticField ClassName.staticMethod() |
정적 필드나 메서드에 접근 |
패키지 참조 | java.util.ArrayList |
특정 패키지의 클래스나 인터페이스 참조 |
메서드 체이닝 | "text".trim().toUpperCase() |
메서드를 연속적으로 호출 |
4. .
연산자가 중요한 이유
- 객체지향 프로그래밍(OOP)의 핵심:
- 점 연산자는 객체 내부에 정의된 변수나 메서드에 접근하기 위한 도구로, OOP의 핵심적인 역할을 합니다.
- 클래스와 객체 간의 관계 표현:
ClassName
또는object
를 통해 명확하게 누가 무엇을 호출하는지 보여줍니다.
- 코드 가독성 및 구조 표현:
- 메서드 체이닝이나 정적 메서드 호출 등을 통해 코드의 의도를 간결하게 표현할 수 있습니다.
5. 결론
- Java에서
.
은 객체나 클래스의 내부 멤버에 접근하는 데 필수적인 연산자입니다. - 사용 상황에 따라 객체의 인스턴스 멤버, 클래스의 정적 멤버, 패키지 참조 등에 활용되며, 객체지향 프로그래밍에서 중요한 역할을 합니다.
'자바 > 객체지향 프로그래밍(OOP)' 카테고리의 다른 글
인스턴스 변수 (0) | 2025.01.23 |
---|---|
객체와 인스턴스 이해 (0) | 2025.01.22 |
업캐스팅(승급) (0) | 2025.01.21 |
toString()오버라이딩 (0) | 2025.01.21 |
super() 정리1 (0) | 2025.01.21 |