-
자바 Study 인스턴스 멤버, 정적 멤버 Part 14 ~ 17JAVA/개념 2022. 10. 6. 14:32반응형
인스턴스 멤버란 무엇일까?🤔
인스턴스 멤버와 정적 멤버의 차이는 무엇일까?🤷♀️
14. 인스턴스 멤버와 정적멤버
자바는 static 키워드를 통해 클래스의 필드를 공유할 수 있도록 지원하는데 이를 클래스 변수 혹은 정적변수라고 한다.
반대로 static 키워드로 지정하지 않은 멤버 변수는 공유되지 않고 인스턴스마다 자신의 필드 생성하는데 이를 인스턴스 변수라고한다.
객체를 생성할 때 인스턴스 변수도 생성되기에 객체를 생성한 후에야 접근가능하고 객체가 소멸시 자동으로 소멸하므로 여러 개의 객체를 생성한다면 인스턴스 변수도 그에 따라서 여러개가 된다.
정적 변수 즉 클래스 변수는 객체 생성전에도 접근 가능하며, 객체를 여러개 생성해도 정적변수(클래스 변수)는 하나뿐이며, 모든 객체가 공유한다.
🔥주의할 점🔥 1. 객체와 관련된 인스턴스 변수를 사용할 수 없다. 2. 객체와 관련된 인스턴스 메서드를 호출할 수 없다. 3. 객체 자신을 가리키는 this 키워드를 사용할 수 없다.
15. 정적메소드
대표적인 예로 main()메소드는 정적 메소드 즉 클래스 메소드이다.
특징 1. 정적변수와 지역 변수를 사용할 수 있다. 2. 또 다른 정적 메서드를 호출할 수 있으며, 생성자도 호출 가능
🔥주의할 점🔥 1. 객체와 관련된 인스턴스 변수나 인스턴스 메서드 호출할 때는 반드시 객체를 생성 후 사용해야 한다.
16. 정적 멤버의 활용
객체 생선전에 사용할 수 있기에 보통 클래스 이름과 연결해서 사용한다.
객체 생성 후 객체 이름과 연결할 수 있지만 바람직하지 않다.
정적변수의 대표적인 예 : 상수
상수는 값이 변경되지 않으므로 final로만 지정하면 객체마다 기억 공간을 할당해야 하기 때문에 static final로 지정해서 선언한다.
상수 선언 예시 static final 데이터형 상수 = 초깃값 static : 모든 객체 공유 final : 초깃값이 대입되면 더 이상 수정불가
class Circle{ double radius; // 인스턴스(멤버) 변수 static int numOfCircles = 0; // 클래스(정적) 변수 int numCircles = 0; // 인스턴스(멤버) 변수 public Circle(double radius){ // 생성자 this.radius = radius; numOfCircles++; // 객체를 생성할 때마다 하나씩 증가 numCircles++; // 객체마다 별도의 기억 공간을 사용하기에 항상 0에서 증가. } } public class CircleDemo { public static void main(String[] args) { System.out.println("인스턴스 생성 전 원의 개수 : " + Circle.numOfCircles); Circle myCircle = new Circle(10.0); System.out.println("인스턴스 생성 후 원의 개수 : " + Circle.numOfCircles); Circle yourCircle = new Circle(5.0); // print(); // main()메서드는 정적 메서드이므로 인스턴스 메서드를 호출할 수 없다. System.out.println("원의 개수 : " + Circle.numOfCircles); // 정적변수 사용 System.out.println("원의 개수 : " + yourCircle.numCircles); } void print() { System.out.println("인스턴스 메서드 입니다."); } }
new 연산자를 통할 때 마다 인스턴스 변수는 새로 생성되기 때문에 값이 1이고,
정적 변수는 새로 생성되지 않기 때문에 값이 2가 된다.
class Util { static int fourTimes(int i) { // 정적 메서드 return i * 4; } } public class UtilDemo { public static void main(String[] args) { System.out.println(Util.fourTimes(5)); } }
객체를 굳이 생성하지 않아도 답을 구할 수 있기에 선언하지 않은 유형이다.
17. 정적 블록
인스턴스 변수라면 생성자를 사용할 수 있지만, 정적 변수의 초기화가 복잡할 때 사용하는 방식이다.
정적 블록 또한 객체 생성 전에 실행되므로 정적 메서드처럼 유의해서 사용해야 한다.
public class FunctionDemo { static int forMunEx; static { int sum = 0; for (int i = 1; i <= 10; i++) sum += i; forMunEx = sum; } public static void main(String[] args) { System.out.println(forMunEx); } }
여러분들의 도움이 되었으면 하는 바램과 함께 다음장에 계에에속
반응형'JAVA > 개념' 카테고리의 다른 글
자바 Study 연속 호출 Part 13 (1) 2022.10.06 자바 Study this와 this() Part 12 (0) 2022.10.06 자바 Study 생성자, 디폴트 생성자, 생성자 오버로딩 Part 10 ~ 11 (0) 2022.10.06 자바 Study 필드와 메서드 접근, 접근자와 설정자 Part 8 ~ 9 (0) 2022.10.06 자바 Study 필드, 지역 변수 Part 7 (0) 2022.10.06