자바/객체지향 프로그래밍(OOP)

정적 클래스와 비정적 클래스 접근방식과 점 연산자

Blue_bull 2025. 1. 22. 19:36

정적 클래스와 비정적 클래스

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

접근 방식:

  1. 외부 클래스 객체 생성:
    • Outer outer = new Outer();
  2. 내부 클래스 객체 생성:
    • Outer.Inner inner = outer.new Inner();
  3. 메서드 호출:
    • 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

접근 방식:

  1. 객체 생성 없이 정적 내부 클래스 사용:
    • Outer.StaticInner inner = new Outer.StaticInner();
  2. 메서드 호출:
    • 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. . 연산자가 중요한 이유

  1. 객체지향 프로그래밍(OOP)의 핵심:
    • 점 연산자는 객체 내부에 정의된 변수나 메서드에 접근하기 위한 도구로, OOP의 핵심적인 역할을 합니다.
  2. 클래스와 객체 간의 관계 표현:
    • ClassName 또는 object를 통해 명확하게 누가 무엇을 호출하는지 보여줍니다.
  3. 코드 가독성 및 구조 표현:
    • 메서드 체이닝이나 정적 메서드 호출 등을 통해 코드의 의도를 간결하게 표현할 수 있습니다.

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