[Java] 변수/상수/리터럴/인스턴스/객체/빈이란

Q0. 개요

자바를 배우면서 가장 먼저 접했던 키워드는 변수이다.

그런대 이 변수와 인스턴스 그리고 객체는 어떻게 다른지 이해가 잘 가지 않았다.

그래서 비교하는 겸 제목에 언급했던 키워드(변수/상수/리터럴/인스턴스/객체)들에 대한 정의를 먼저 정리한다.

 

Q1. 키워드 정의 목록

잘 이해가 되지 않는 부분들이 있어서 예를 들어서 다시 정리해본다.

public class Main{ //클래스
	class Sub1(){
		private String str = "TEST"; //변수는 str를 리터럴 "TEST"로 초기화
		private final int num = 3.14159; //변수이자 상수 num를 리터럴 3.14159로 초기화		
	}
	class Sub2(){ //클래스
		private String str; //변수 str를 선언
		public String setStr(String str){ //메서드
			this.str = str;
		}
		public String.getStr(){ //메서드
			return str;
		}
	}
	class Sub3(){
		private String str; //변수 str를 선언
		public String setStr(String str){ //메서드
			this.str = str;
		}
		public String.getStr(){ //메서드
			return str;
		}
	}

	public static void main(String[] args){ //메인 메서드
		Sub1 sb1 = new Sub1(); //객체이자 인스턴스
		Sub1 sb2 = new Sub2(); //객체이자 인스턴스
		Sub1 sb3 = new Sub3(); //객체이자 인스턴스
	}
}

 

Q2. 참고로 변수선언과 초기화

선언이란, 빈 메모리의 저장 공간만을 할당한다는 의미이고
초기화/생성해당 공간에 값이 들어간다는 의미이다.

 

다시 예제 소스로 돌아와서 아무리봐도 객체와 인스턴스에 대해서는 정확하게 이해가 되지 않아서 더 찾아보았다.

자바에서 new키워드로 클래스의 객체를 생성하면, 해당 변수는 해당 클래스의 인스턴스가 된다.

Sub1 sb1 = new Sub1()를 보면, sb1는 Sub1클래스의 객체이자 인스턴스이다. 하지만, 보통 객체라고 사용한다.

그래도 객체와 인스턴스의 차이를 내가 이해한 대로 해석하자면 아래와 같다.

Sub1 sb1; //Sub1의 객체 선언
Sub2 sb2 = new Sub2(); //Sub2의 객체 초기화(=sb1이라는 객체는 인스턴스라고도 부른다)

//클래스의 인스턴스인지 아닌지를 확인
if(sb1 instanceof Sub1){
	System.out.println("sb1객체는 Sub1클래스의 인스턴스이다")
} else {
	System.out.println("sb1객체는 Sub1클래스의 인스턴스가 아니다")
}

//클래스의 객체인지 아닌지를 확인
if(sb2.getClass() == Sub2.class){
	System.out.println("sb2객체는 Sub2클래스의 객체이다")
} else {
	System.out.println("sb2객체는 Sub2클래스의 객체가 아니다")
}

 

Q3. 결론적으로

클래스를 선언하는 경우에는 객체.

클래스를 초기화하는 경우에는 객체이자 인스턴스

new키워드를 통해 생성하는경우는 무조건 객체이자 인스턴스라고 부른다고 정리할 수 있다.