static 메소드 vs 인스턴스 메소드

2024. 7. 17. 00:33·Java

static 메소드와 인스턴스 메소드 항상 사용만 했었는데 왜 그런지는 생각해 본 적이 없었다. 그래서 사용하는 이유에 대해 정리할 필요가 있다고 느껴져 게시물을 작성하게 되었다.

 

static 메소드

static 메소드의 예시

public class MathUtils {
    // static 메소드: 원의 면적 계산
    public static double calculateCircleArea(double radius) {
        return Math.PI * radius * radius;
    }

    // static 메소드: 섭씨를 화씨로 변환
    public static double celsiusToFahrenheit(double celsius) {
        return (celsius * 9/5) + 32;
    }
}

 

static 메소드는

  • 컴파일 시점에 바인딩된다. 즉, 정적 바인딩되고 클래스 로딩 시점에 메모리에 할당된다.
  • 클래스(또는 인터페이스)에 속하며 인스턴스와 무관하다.
  • 오버라이딩이 불가하고, 다형성을 지원하지 않는다.
    • 다형성이란, 하나의 객체가 여러가지 일을 할 수 있는 것을 의미한다. 오버라이딩, 오버로딩 등으로 다형성을 구현할 수 있다.
    • 오버라이딩이 불가한 이유? static 메소드는 클래스나 인터페이스에 직접 연결되어 있어 오버라이딩 할 수 없다.
    • 상속받은 하위 클래스에서 같은 이름의 static 메소드를 정의할 수 있지만, 이것은 오버라이딩이 아니라 메소드 숨김(method hiding)이다. 

 

# 예시

interface MyInterface {
    public static void staticMethod() {
        System.out.println("인터페이스의 static 메소드");
    }
}

class MyClass implements MyInterface {
    // 이것은 오버라이딩이 아닌 새로운 static 메소드입니다.
    public static void staticMethod() {
        System.out.println("MyClass의 static 메소드");
    }
}

public class Main {
    public static void main(String[] args) {
        MyInterface.staticMethod(); // 출력: 인터페이스의 static 메소드
        MyClass.staticMethod();     // 출력: MyClass의 static 메소드

        MyInterface mi = new MyClass();
        // mi.staticMethod(); // 컴파일 에러: static 메소드는 인스턴스를 통해 호출할 수 없음
    }
}

 

 

static 메소드는 인스턴스를 통해 호출될 수 없는 이유

  • static 메소드는 객체의 상태와 무관하게 동작한다.
  • 인스턴스 없이 호출 가능한 static 메소드는 자원을 효율적으로 사용할 수 있다.
  • static 메소드는 설계 원칙에서 클래스 레벨의 기능을 제공하기 위한 것이다.
  • 컴파일러는 static 메소드 호출을 최적화하고 있는데 인스턴스를 통한 호출을 허용하면 최적화가 힘들다.

이러한 이유로 사실상 막아둔 것이다.

 

 

인스턴스 메소드

인스턴스 메소드의 예시

public class Car {
    private String brand;
    private String model;
    private int speed;

    // 생성자
    public Car(String brand, String model) {
        this.brand = brand;
        this.model = model;
        this.speed = 0;
    }

    // 인스턴스 메소드: 속도 증가
    public void accelerate(int increment) {
        this.speed += increment;
        System.out.println("현재 속도: " + this.speed + " km/h");
    }
}

 

인스턴스 메소드는

  • 런타임에 바인딩된다. 즉, 동적 바인딩되고 객체가 생성될 때 메모리에 할당된다.
  • 오버라이딩을 적용할 수 있다. 부모 객체 전체를 바꾸지 않고 자식 객체만 코드를 덮어써 전체 코드에 미치는 영향을 줄일 수 있다.

 

 

'Java' 카테고리의 다른 글

정적 바인딩 & 동적 바인딩  (0) 2024.07.17
다중 상속  (1) 2024.07.17
default 메소드  (0) 2024.07.17
이펙티브 자바 - Item(1) 생성자 대신 정적 팩터리 메소드를 고려하라  (0) 2024.07.15
Java CS 대비 정리(자료형, JVM, JRE, JDK)  (0) 2024.06.05
'Java' 카테고리의 다른 글
  • 다중 상속
  • default 메소드
  • 이펙티브 자바 - Item(1) 생성자 대신 정적 팩터리 메소드를 고려하라
  • Java CS 대비 정리(자료형, JVM, JRE, JDK)
뽀루피
뽀루피
  • 뽀루피
    뽀루피의 개발스토리
    뽀루피
  • 전체
    오늘
    어제
    • 분류 전체보기 (83)
      • 프로젝트 (3)
      • Java (32)
        • JPA (4)
        • Spring (8)
      • FrontEnd (4)
        • JavaScript (1)
        • Flutter (3)
      • DB (4)
        • SQL (4)
      • 알고리즘 (10)
      • Git (3)
      • SSAFY (0)
      • Figma (1)
      • Notion (0)
      • Jira (0)
      • 기획 (0)
      • 네트워크 (10)
      • 우아한테크코스 (2)
      • Infra (5)
        • AWS (0)
        • Docker (3)
      • AI (1)
      • 자격증 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Jenkins
    네트워크
    트랜잭션
    Docker
    백준
    SQL
    자바
    네트워크 기초
    Stomp
    JPA
    스프링
    크래프트맨 멘탈리티
    웹소켓
    cloudflare
    fetch join
    모던 자바 인 액션
    redis streams
    알고리즘
    n8n
    java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
뽀루피
static 메소드 vs 인스턴스 메소드
상단으로

티스토리툴바