유난스런 개발 기록

[JAVA] Day-2 _ static변수, instance변수, 지역변수, 멤버변수 본문

개념정리/JAVA

[JAVA] Day-2 _ static변수, instance변수, 지역변수, 멤버변수

yourhwan 2023. 1. 5. 01:46

day-2

instance변수, static변수, 지역변수, 멤버변수


instance 변수 (non-static 변수)

  • instance 변수란 다른 말로 non-static 변수라고도 부른다.
  • instance가 생성될 때 생성
  • 독자적인 저장 공간을 갖고 있어서 서로 다른 instance끼리 공유할 수 없다. 
  • 클래스 영역 안에서 선언된 변수
  • 객체를 생성해야 사용 가능하다.
  • 변수를 초기화 하지 않더라도 자동적으로 초기화가 된다.

 

static변수 (class변수)

  • 변수에 static을 쓰면 instance에서 빠져나와 공유할 수 있게 된다. (한 클래스에 모든 인스턴스들이 공통적인 값을 가져야할 때 해당멤버 변수를 static으로 선언)
  • 객체에 포함되지 않고 별도의 메모리 공간에 올라간다.
  • 클래스 영역 안에서 변수에 static을 붙여 선언된 변수
  • static변수 = class변수
  • 변수를 초기화 하지 않더라도 자동적으로 초기화가 된다.
  • (이클립스에서 스태틱변수는 글씨가 기울어져 나오며, 인스턴스변수는 바르게 나온다.)

 

지역 변수 (local variable)

  • 지역 변수는 어떤 메소드 안에서 선언 되어진 변수를 의미한다.
  • 지역 변수는 {} 안에서만 사용되어지기 때문에 {}을 벗어나는 순간 자동적으로 메모리에서 삭제가 된다.
  • 지역 변수는 반드시 초기화(어떤 변수에서 처음부터 값을 부여하는 것)를 해주어야 한다.
  • 지역 변수는 반드시 초기화 해주어야 한다.

 

멤버 변수 (member variable)

  • 멤버 변수는  클래스에 속한 변수로 클래스 변수(class variable), 필드(fiedl)라고 한다.
  • 멤버 변수는 메인 메소드가 아닌 다른 메소드에서도 사용할 수 있으며, 글로벌 변수(global variable)라고도 한다.
  • 다른 클래스에서도 사용이 가능하다.

 

 


 

코드를 통해 개념을 확인해보자

package my.day02.a;

public class Main01 {

	String id;	// String은 문자열 타입 (String id;는 멤버변수)
	String pwd;
	String name;
	String email;
	int age;	// int는 정수 타입
	double height;	//double은 실수 타입
	double weight = 58.6;	//weight에 초기값(초기치)을 58.6을 넣어줌.
	
	/*
	 * 무조건 암기하기!!!
	 	멤버변수 => instance변수와 static변수를 합친 것을 멤버변수라고 부른다.
	 	instance 변수와 static 변수는 초기화를 하지 않더라도 자동적으로 초기화가 되어진다.
	 	정수형인 데이터타입(byte, short, int, long)은 자동적으로 0으로 초기화가 되고,
	 	실수형인 데이터타입(float, double)은 자동적으로 0.0으로 초기화가 되고,
	 	문자형인 데이터타입(char)는 자동적으로 ' '으로 초가화가 되고,
	 	String 을 포함한 클래스 타입은 자동적으로 null로 초기화가 된다.
	 */
	
	
	void showInfo1() {
		// 새로운 메소드를 생성해준다. (인스턴스 메소드로 공유될 수 없다.)
        // 이순신 전용이라고 할 수 있다.
        
		int hopeMoney = 5000; // 지역변수에 해당한다.
		// 필수암기!!!!!!!!
		// 어떤 매소드 안에서 선언되어진 변수는 지역변수(local variable)라고 한다.
		// 지역변수는 {} 내에서만 사용되어지기 때문에 {}을 벗어나는 순간 자동적으로 메모리상(RAM)에서 삭제가 되어진다.
		// 지역변수는 반드시 초기화(어떤 변수에 처음부터 값을 부여하는 것)를 해주어야한다.
		
		System.out.println("=== 회원정보 ===\n "
							+ "1. 아이디 : " + id + "\n"
							+ "2. 암 호 : " + pwd + "\n"
							+ "3. 성 명 : " + name + "\n"
							+ "4. 이메일 : " + email + "\n"
							+ "5. 나 이 : " + age + "\n"
							+ "6. 신 장 : " + height + "\n"
							+ "7. 몸무게 : " + weight + "\n"
							+ "8. 희망급여 : " + hopeMoney + "만원\n"
				
				);
	}
	
		void showInfo2() {
//	새로운 메소드를 생성해준다. (메소드를 새로 생성해준 이유는 우리가 생성하고자 하는 이용자의 정보는 고유한 값이기 때문이다.)
//	(즉 인스턴스 메소드이기 때문에 공유될 수 없다.)
			
			int hopeMoney = 7000;
		
		System.out.println("=== 회원정보 ===\n "
			+ "1. 아이디 : " + id + "\n"
			+ "2. 암 호 : " + pwd + "\n"
			+ "3. 성 명 : " + name + "\n"
			+ "4. 이메일 : " + email + "\n"
		    + "5. 나 이 : " + age + "\n"
	     	+ "6. 신 장 : " + height + "\n"
		    + "7. 몸무게 : " + weight + "\n"
	 		+ "8. 희망급여 : " + hopeMoney + "만원\n"
				
				);
		// 문자열과 문자열 사이의 +는 문자열 결합을 뜻하는 것이고.
		// 숫자와 숫자 사이의 +는 더하기(plus)를 뜻하는 것이고,
		// 문자열과 숫자 사이의 +는 문자열결합을 뜻하는 것이다.
		
		/*50+20 ==>70
		50+"20" ==>5020
		"50"+20+30 ==> 502030
		"50"+(20+30) ==> 50508
		*/
		////////////////////////////////////////////////////////////
	}
	
		public static void main(String[] args) {
	// 메인메소드에 이순신 이라는 사람의 정보를 입력할 것이다.
			
	
		Main01 ma1 = new Main01(); // 인스턴스화(==객체생성)를 통해 내용물을 담을 그릇을 준비하자.
		ma1.id = "leess";
		ma1.pwd = "qwer1234";
		ma1.name = "이순신";
		ma1.email = "leess@naver,com";
		ma1.age = 25;
		// 변수를 생성하고 값을 넣어준다. 이것 또한 인스턴스 변수다. 즉 이순신 고유의 값이다.
		
		
		ma1.showInfo1();
		// 해당 객체의 정보를 보여주는 메소드를 호출한다.
        // 위에 변수에 입력한 값이 출력 될 것이다.
		
		System.out.println("\n~~~~~~~~~~~~~~~~~~~~~~~~\n");
        // 값을 넣어주지 않은 상태에서 출력해보자. 위의 출력문은 단순히 구분선이다.
		
		Main01 ma2 = new Main01();	//인스턴스화(==객체생성)을 통해 새로운 가상의 인물을 만들자
		ma2.showInfo1(); // 변수에 값을 넣어주지 않았기 때문에 기본 값이 출력 될 것이다.

		System.out.println("\n~~~~~~~~~~~~~~~~~~~~~~~~\n");
		ma2.showInfo2(); // 변수에 값을 넣어주지 않았기 때문에 기본 값이 출력 될 것이다.
	/*	
		// 인스턴스에 할당되었던 메모리 공간을 비워야 한다.
		ma1 = null;
		ma1 = null;
		
		System.gc(); // Garbage Collector (쓰레기 수집)
		*/
		// 위의 인스턴스에 할당되었던 메모리 공간을 비우는 것과
		// Garbage Collector (쓰레기 수집)를 하는 작업을 기술할 필요가 없다.
		// 왜냐하면 프로그램이 종료 되는 순간 이런 작업이 자동적으로 해주기 때문이다.
	}
	

}

오늘 정리한 개념 정리는 차후에 개념만 정리한 파트를 구분해서 업로드 해야겠다.

개념만 외우는 것보다 코드를 직접 보며 주석을 달아가면서 공부하는 것이 큰 도움이 된다.

추가로 후에 정리가 잘 된 블로그나 책을 보는 것이 확실히 개념을 적립하기 훨씬 쉽다.

 

 


오늘 무조건 외울 목록

-변수 선언시 정수형인 데이터타입 (byte, short, int, long)은 자동적으로 0으로 초기화

-실수형인 데이터타입(float, double)은 자동적으로 0.0으로 초기화

-문자형인 데이터타입(char)은 자동적으로 null로 초기화가 된다.

-String을 포함한 클래스 타입은 자동적으로 null로 초기화가 된다.