인스턴스란
인스턴스는 어떤 원본(클래스)으로부터 생성된 '복제본' 하나하나를 지칭한다.
어떤 클래스로부터 만들어것인지를 강조하는 구체적 의미이기도 하다.
클래스는 '설계도',
인스턴스는 '제품'으로 비유할 수 있다.
클래스로부터 객체를 만드는 과정 → "클래스의 인스턴스화"
어떤 클래스로부터 만들어진 객체 → 해당 클래스의 인스턴스
인스턴스를 생성하는 방법
클래스명 변수명 = new 클래스명();
ex)
/*클래스*/
public class Human {
static String country;
String name; // 객체
int age;
. . .
}
/*객체와 인스턴스*/
public class Main {
public static void main(String[] args) {
Human human = new Human(); // *1
human.name = "glen"; // *2
}
}
*1 : 인스턴스 생성
Human → 사용자 지정 데이터 타입
human → 객체명(인스턴스명)
Human(); → "Human클래스로부터"
new 생성자 → Heap영역에 객체 생성 and 객체의 주소를 반환 → 결과적으로 데이터 타입을 직접만드는 것.
*2 : 인스턴스의 name을 "glen"으로 초기화
클래스 멤버와 인스턴스 멤버
영어로 멤버는 구성원이라는 뜻이다.
객체에도 구성원이 있다
- 변수
- 메소드
클래스도 마찬가지,
클래스를 정의할 때, 변수와 메소드를 클래스안에 정의한다.
클래스를 인스턴스화 하면 인스턴스 안에는 클래스에서 정의된 멤버(변수와 메소드)가 있다.
클래스 멤버를 참조하는 모든 인스턴스들은 해당 클래스가 가진 변수를 가지게 된다.
클래스 멤버인 변수는 모든 인스턴스에서 같은 값을 갖는다.
ex)
Class Calculator {
static double PI = 3.14; // *1 static
int left, right;
public void setOprands(int left, int right){
this.left = left; // *2 this
this.right = right;
}
public void sum(){
System.out.println((this.left+this.right)/2);
}
}
public class CalculatorDemo1
*1 : PI는 각각의 객체(인스턴스)가 값을 가질 필요가 없다. 중복이기 때문이다. 중복의 제거를 위해 <클래스변수>를 사용한다.
static 제한자는 변수를 JVM의 static영역에 할당한다. (필드에서 선언해도 static영역으로 할당된다.)
또한 프로그램이 종료될 때 까지 메모리에서 제거되지 않는다.
바로 이러한 점이 프로그램이 실행되는 내내 필요한 데이터를 static 제한자로 묶는 이유이다.
++ 클래스의 소속, 멤버가 된다는 것은 해당 변수를 모든 메소드 모든 인스턴스에서 동일한 값을 갖게 된다는 것을 의미한다.
*2 : this는 클래스 메소드의 매개변수와 멤버변수의 식별자(이름)이 겹치는 경우에 사용한다.
--
조금 쉽게 설명하면,
클래스 내부에 선언된 내부 메서드가 클래스 전역변수로 접근할 때,
사용하는 것이 this이다.