//////
Search
🗒️

Static

날짜
2022/09/28
작성자
백승근
전수진
황민우
카테고리
회고

Static

변수

Instance 변수

각 객체 생성시 별도의 메모리 할당
멤버 변수의 경우 각 객체마다 고유의 속성값 저장 가능
객체가 생성될때 메모리 할당되고 객체가 소멸될때 사라진다.

Static 변수

static 변수 = 정적변수 = 클래스 변수 = 공용변수
프로그램 시작시 메모리 할당
생성된 객체의 수와 상관없이 단 하나만 생성
이 클래스의 모든 객체들이 공유!
객체를 생성하지 않고도 사용 가능
프로그램이 시작될때 메모리를 할당 받아서 프로그램이 종료될때까지 지속적으로 공간사용이 가능하다.
Java에서 static 키워드를 사용한다는 것은 메모리에 한 번 할당되어 프로그램이 종료될 때 해제되는 것을 의미

인스턴스 변수 & Static 변수 비교

Instance 변수
Static 변수
선언 위치
클래스 멤버 변수로 선언
클래스 내부에 선언
메모리
힙 영역
데이터 영역
사용 범위
클래스 내부에서 사용하고 private 아니면 참조 변수로 다른 클래스에서 사용 가능
클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용가능
라이프 사이클
인스턴스가 생성될 때 힙에 생성되고, 가비지 컬렉터가 메모리를 수거할 때 소멸됨
프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 떄 소멸됨
인스턴스 변수 예시
class Number { int num = 0; int add() { return ++this.num; } } public class Main { public static void main(String[] args) { Number num1 = new Number(); Number num2 = new Number(); num1.add(); System.out.println(num1.num) // 1 System.out.println(num2.num) // 0 }
Java
복사
이 경우 객체를 생성하면 각각의 메모리를 할당받기 때문에 add() 메소드를 실행시킨 객체의 메모리값만 변하게 된다.
Non-Static
Static 변수 예시
class Number { static int num = 0; int num2 = 0; int add() { return ++num; } int add2() { return ++num2; } } public class Main { public static void main(String[] args) { Number num1 = new Number(); Number num2 = new Number(); num1.add(); System.out.println(num1.num) // 1 System.out.println(num2.num) // 1 System.out.printlb(Number.num) // 1
Java
복사
static 변수로 선언된 경우 객체를 생성하면 메모리값을 공유하게 된다.
따라서 여러 객체를 생성하고 add() 메소드 실행시 변수는 같은 값을 갖는다.
메모리절약의 이점
변수 값 공유
Static

메소드

Instance 메소드

객체가 수행하는 일반적인 행위
ex. 원의 둘레, 넓이
자신의 모든 멤버를 직접 참조 가능
객체 생성 필요.
객체를 생성한 후 사용되기 때문에 메소드 내부에서 인스턴스 변수 및 static 변수 사용 가능.

Static 메소드

정적메소드를 선언하면 객체를 생성하지 않고 메소드를 사용할 수 있다.
static 메소드 안에서는 static 변수만 접근할 수 있다.
유틸리티성 메소드 작성에 많이 사용된다.
static 메소드에서 인스턴스 변수의 사용?
static메소드는 인스턴스 생성 없이 호출이 가능하므로 인스턴수 변수는 사용할 수 없다!
static메소드는 객체 생성 과정이 없이 사용한다
인스턴스 변수는 객체를 생성하고 메모리에 올라온 후에 사용이 가능하다
public static void main(String[] args)에서 static이란
main이라는 메서드를 호출하기 위해서 이 메서드를 포함하고 있는 클래스 객체를 생성 안해도 된다는 의미.
객체를 생성하지 않고도 접근을 용이하게 하기 위해