sussa
컴퓨터가 할 일은 컴퓨터가.
sussa
전체 방문자
오늘
어제

블로그 메뉴

    • 분류 전체보기 (58)
      • Language (58)
        • JAVA (58)

    공지사항

    인기 글

    태그

    • Instance
    • 자료구조
    • Database
    • Class
    • DI
    • 상속
    • 최종연산
    • binaryTree
    • recursion
    • Til
    • Algorithm
    • 조건문
    • Thread
    • tree
    • 다형성
    • 개발자
    • java
    • 캡슐화
    • inheritance
    • Web
    • spring
    • CSS
    • 스파르타코딩클럽
    • Method
    • 재귀
    • BinarySearchTree
    • 웹개발종합반
    • Stream
    • singleton
    • HTML

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    sussa

    컴퓨터가 할 일은 컴퓨터가.

    Java Static과 Instance의 관계(OOP)
    Language/JAVA

    Java Static과 Instance의 관계(OOP)

    2022. 8. 17. 00:03

    💻 Java Static(정적) 과 Instance(객체)

     

     

    🎯 목표 : Static 변수와 메소드를 활용하기 위한 기초를 이해

    생활코딩의 강의 예제를 활용

     

    📒Static 

    Static 변수와 메소드는 모든 객체가 공유하여 하나의 변수와 메소드를 어디서든지 참조 할수 있으며, 해당 클래스에 소속되어 고정된 변수와 메소드.

    일반적으로 생성된 클래스는 Static 영역에 할당되고, new 연산자로 생성된 Instance(객체)는 Heap 영역에 할당된다. Heap 영역의 메모리는 Garbage Collector를 통하여 수시로 관리되며 Static 영역의 클래스는 정적으로 프로그램 실행과 종료시 까지 존재한다. Static 영역의 변수와 메소드는, 프로그램이 종료될때까지 메모리에 할당된 채로 존재하여 Static 영역의 데이터가 많아지면, 만들고자 하는 프로그램의 시스템 성능에 악영향을 미칠수 있다.

     

    ❗Static 예제 

    👉 Static 변수와 메소드 선언

    class Foo {
    	//변수
    	public static String classVar = "I class var";
        
    	//method
    	public static void classMethod() {
    		System.out.println(classVar); 
    	}
    }

     

    👉 Static 변수와 메소드 예제

    • Foo Class에서 Static 키워드를 사용하여 생성된 변수와 메소드는 Foo Class 고정 맴버이고 모든 객체가 공유하기에 어디서든지 참조할수 있음.
    class Foo {
    	//변수
    	public static String classVar = "I class var";
        
    	//method
    	public static void classMethod() {
    		System.out.println(classVar); 
    	}
    }
    
    public class StaticApp {
    	public static void main(String[] args) {
    		System.out.println(Foo.classVar);
    		Foo.classMethod();
    	}
    }
    //==================
    // 실행시 결과값
    // I class var
    // classVar

     

    👉 Static 과 Non Static 변수와 메소드 비교

    • Static - class method,variable
    • Non Static - instance method,variable
    • 코드 하단 설명과 그림 참조. 코드의 결과 값은 코드열 오른쪽 주석 처리
    class Foo {
    	//변수
    	public static String classVar = "I class var";
    	public String instanceVar = "I instance var"; // Instance를 통해서 사용할수 있게 만든 변수
    	//method
    	public static void classMethod() {
    		System.out.println(classVar); // ok
    //		System.out.println(instanceVar); ## Error
    	}
    	public void instanceMethod() {
    		System.out.println(classVar);//ok
    		System.out.println(instanceVar);//ok
    	}
    }
    public class StaticApp {
    
    	public static void main(String[] args) {
    		System.out.println(Foo.classVar);
    //		System.out.println(Foo.instanceVar); ## Error 
    		Foo.classMethod();
    //		Foo.instanceMethod();  ## Error
    		
    	// Instance
    		Foo f1 = new Foo();
    		Foo f2 = new Foo();
            
            	f1.instanceMethod(); //I class var I instance var
    		f2.instanceMethod(); //I class var I instance var
    		
    		System.out.println(f1.classVar); // I class var
    		System.out.println(f1.instanceVar); // I instance var
    		
            // 변수 값 변경의 영향
    		f1.classVar = "changed by f1";
    		System.out.println(f1.classVar); // changed by f1
    		System.out.println(Foo.classVar); // changed by f1
    		System.out.println(f2.classVar); // changed by f1
    		
    		f1.instanceVar = "changed by f1";
    		System.out.println(f1.instanceVar); // changed by f1
    		System.out.println(f2.instanceVar); // I instance var
    
    	}
    
    }
    • Static 키워드를 사용하여 생성된 변수 classVar와 메소드 classMethod는 Foo Class의 고정된 소속이고, 모든 객체가 공유하므로 어디서든 참조될수 있다.
    • Static 키워드 없이 생성된 변수 instanceVar와 메소드 instanceMethod는 Instance(객체)를 필히 생성하여 사용해야되므로 Foo Class내에서 Static 키워드로 생성된 메소드에 참조될수 없고 다른 클래스에서도 Instance(객체)를 생성하지 않으면 참조될수 없다. (위의 코드 주석 부분 중 Error 확인)
    • Instance(객체)를 참조변수에 정의(f1,f2)하고 Static 키워드 없이 생성된 변수와 메소드를 호출하게 되면 정상적으로 출력 되는것을 볼수 있다.
    • Instance f1 에서  Static 키워드로 생성된 변수의 값을 "changed by f1"으로 변경 하였을때 참조되어 있는 모든 Instance f1,f2의 Static 변수 값이 변경 되며, Foo Class에 고정된 classVar 변수의 값도 변경되는 것을 확인 할수 있다. - Instance에서 Class 변수를 초기화 가능
    • Instance f1 에서 Static 키워드 없이 생성된 변수의 값을 "changed by f1"으로 변경 하였을때 Instance f1의 초기화 된변수 값은 변경되지만, f2의 변수의 값은 영향이 없는 것을 확인할수 있다.

    • Static 변수, 메소드와 Instance 변수,메소드들이 서로 어떻게 참조,초기화 될수 있는지 아래 그림의 화살표를 보면 이해할수 있다.

    출처 : 생활코딩

    'Language > JAVA' 카테고리의 다른 글

    Java 기본형 / 참조형 매개변수  (0) 2022.08.20
    Java Overloading(오버로딩) - OOP  (0) 2022.08.19
    Java Object, Class, Instance(OOP)  (0) 2022.08.15
    Java Method(메소드)  (0) 2022.08.13
    Java Exception(예외)의 처리  (0) 2022.08.13
      'Language/JAVA' 카테고리의 다른 글
      • Java 기본형 / 참조형 매개변수
      • Java Overloading(오버로딩) - OOP
      • Java Object, Class, Instance(OOP)
      • Java Method(메소드)
      sussa
      sussa
      Efforts to take on a challenge

      티스토리툴바