본문 바로가기
🌈 백엔드/객체 지향

JAVA_객체지향_인스턴스 & static 클래스변수

by 개발자 알마 2023. 6. 3.
반응형

 

[1] 인스턴스 instance


(1) 인스턴스 정의 

  • 클래스 기반으로 생성된 객체
  • 각각 다른 멤버 변수 값을 가지게 된다 
  • new 를 사용하여 인스턴스를 생성한다 
  • new 키워드를 사용하여 클래스를 메모리에 생성한 상태 
  • 클래스를 기반으로 만들어진 객체 , 클래스로부터 객체를 선언한다 (인스턴스화 한다) 
  • 인스턴스화 : 클래스로부터 객체를 만드는 과정 
  • 인스턴스 : 클래스로부터 만들어진 객체 
  • 인스턴스는 객체와 같은 의미지만 , 객체는 포괄적인 의미이고 인스턴스는 어떤 클래스로부터 만들어진 것이 중점인 의미 
  • 인스턴스는 참조변수를 통해서만 다룰수 있고 , 참조변수의 타입은 인스턴스의 타입과 일치해야한다 
  • 실행시 호출되어야하는 메서드를 찾는 과정이 있어 시간이 소요된다 

1. 인스턴스1
	Student studentA = new Student(); 
        
	studentA.studentName = "김철수";
	studentA.address = "서울";
    
    
2. 인스턴스2
	Student studentA ; //참조변수
    	studentA = new Student();

 

(2) 인스턴스와 힙메모리 

  • 인스턴스를 생성하면 stack 메모리에서 heap메모리에 할당하여 사용할 준비를 한다 
  • 인스턴스가 계속 미사용되면 메모리 절약을 위해 java gabage collector가 주기적으로 메모리를 수거한다 
  • 각각 인스턴스는 다른 메모리 주소를 가지게 된다 

 

(3) 참조변수와 인스턴스 

참조변수 : 메모리에 생성된 인스턴스를 가리키는 변수

참조 값 : 생성된 인스턴스의 메모리 주소 값 

 

(4) 인스턴스 사용방법

 

class test1 {          ------------> 클래스 1번 

    // test1 () {} 생성자_생략
    
    String name;

    public void classTest () {
         System.out.println("name");
    }
}

class test2 {         --------------> 클래스 2번 

    // test2 () {} 생성자_생략
    
    String name;
    
    public  void classTest() {
          System.out.println("name");
        }
    }


public class Main {            ------------> java 메인함수 

    public static void main(String[] args) { ---> 메인 메소드 불러오기 

        test1 testName1 = new test1();    ----> 클래스 1의 객체 인스턴스화 불러오기
        test2 testName2 = new test2();    -----> 클래스 2의 객체 인스턴스화 불러오기

        testName1.name = "김";        ----> 클래스1의 함수에 값을 "김"으로 넣어라 
        testName2.name = "Area";	 ----> 클래스2의 함수에 값을 "Area"으로 넣어라 

        test1.classTest() -----> 클래스1의 classTest 함수에 출력하라고 기재되어있어서 "김"출력함
		test2.classTest() ----> 클래스2의 classTest 함수에 출력하라고 기재되어있어서 "Area"출력함

    }
}

 

(5) 인스턴스 메서드 

반드시 인스턴스 객체를 생성해야만 인스턴스 메서드를 호출할수 있다 

인스턴스 변수 , 인스턴스 생성, 인스턴스 메서드 세트로 사용한다 

 

 

[2] static 클래스변수


(1) 클래스 변수 = 정적변수

  • static 이 있는 변수  
  • 클래스가 메모리에 올라갈때 자동적으로 생성된다 
  • 예)학생이 들어올때마다 학번이 생성되어야한다. 공통된 속성 
  • 예)카드를 새로 발급할때마다 새로운 카드번호가 부여되어야한다.공통된 속성
  • 예)사원이 입사할때마다 새로운 사번을 부여해야한다.공통된 속성

 

(2) 클래스변수를 사용해야할때 

  • 멤버변수 중에서 인스턴스 생성시 공통으로 사용해야할 속성(멤버변수)에 static을 붙인다 
  • 인스턴스 생성하지 않아도 클래스이름으로 호출하여 사용할수 있다
  • 인스턴스 변수 사용을 못하므로 인스턴스 변수, 인스턴스 메서드 사용이 필요없을때 사용한다

 

 

(3) static & heap 메모리 

static 메모리 영역

: 클래스 , 변수, 메소드 존재한다 , GC 관리영역에 포함되지 않는다

: 객체를 생성하지 않고도 접근이 가능하고 여러 객체들이 공유한다 

: 프로그램 실행 내내 메모리가 할당된 채 존재한다 

 

class test {

	static String name = "none"  -----> name은 static메모리 영역에 있다

    public void classTest(String name, String type) {
          System.out.println("name");
          System.out.println("type");
          
        }
    }
    

public class Main {

public static void main(String[] args) {

	test name = new test(name a, type 가);  ---> 클래스는 name은 a, type 은 가 선언하다 
    test name = new test(name b, type 나);  ---> 클래스는 name은 b, type 은 나 선언하다 
    test name = new test(name c, type 다);  ---> 클래스는 name은 c, type 은 다 선언하다 
    
    test.classTest(); ---> 마지막에 있는 c ,다만 출력된다 객체 공유가 되기 떄문에

 

heap영역

: 객체 존재한다 , GC관리영역에 포함된다 

: new 연산자에 의해서 생성된 객체들이 존재하는 메모리 영역이다 

:연산시에만 메모리에 할당되고 역할이 끝나면 바로 메모리 삭제 

 

(4) 클래스 메서드 

  • static이 붙어있는 메서드 
  • 객체를 생성하지 않아도 "클래스이름.메서드이름" 으로 호출이 가능하다 
  • 클래스 메서드에 매개변수로만 만들어져 매개변수만 있다면 객체를 생성하지 않아도 호출이 가능하다 
  • 인스턴스변수나 인스턴스 메서드를 사용하지 않는 메서드를 클래스 메서드로 정의한다 
  • 클래스 메서드 내에 인스턴스 변수나 인스턴스 메서드를 호출할수 없다 

 

 

 

(5) static 변수 사용하기

  • 사원이 생길때마다 시리얼넘버 = 사원아이디가 증가해야한다
  • 멤버변수 : 사원아이디, 사원이름, 부서
public class Employee {

	//사원이 생길때마다 증가해야하는 변수
	private static int serialNum = 1000;
	
    //멤버변수, 개인정보 
	private int employeeId;
	private String employeeName;
	private String department;
	
    
    //인스턴스 될때마다 자동으로 추가되는 생성자 
    public Employee() {
		serialNum++;
		employeeId = serialNum;
	}

    
    //캡슐화 
    public static int getSerialNum() {
		return serialNum;
	}
    
	public int getEmployeeId() {
		return employeeId;
	}
	public void setEmployeeId(int employeeId) {
		this.employeeId = employeeId;
	}
	public String getEmployeeName() {
		return employeeName;
	}
	public void setEmployeeName(String employeeName) {
		this.employeeName = employeeName;
	}
	public String getDepartment() {
		return department;
	}
	public void setDepartment(String department) {
		this.department = department;
	}
	
}
  • 본main함수에서 인스턴스를 생성할때마다 시리얼넘버가 생성되도록 serialNum++한다 
  • 이름같은 다른 정보는 아래처럼 각각 넣어야하지만 시리얼넘버는 별도로 입력하지 않았다. 
public class Service {

	public static void main(String[] args) {
    
    	//인스턴스1
    
		Employee employeeA = new Employee();
		employeeA.setEmployeeName("김철수");

		
        //인스턴스2
		Employee employeeB = new Employee();
		employeeB.setEmployeeName("이영희");
		
        //정보출력
		System.out.println(employeeA.getEmployeeName() 
        					+ "님의 사번은 "+ employeeA.getEmployeeId() ); //1001

		System.out.println(employeeB.getEmployeeName() 
        					+ "님의 사번은 "+ employeeB.getEmployeeId() ); //1002
		
	}
}

 

반응형

댓글